Files
gartenmanager/backend/app/crud/user.py

49 lines
1.7 KiB
Python
Raw Normal View History

from uuid import UUID
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.security import get_password_hash, verify_password
from app.crud.base import CRUDBase
from app.models.user import User
from app.schemas.user import UserCreate, UserUpdate
class CRUDUser(CRUDBase[User, UserCreate, UserUpdate]):
async def get_by_email(self, db: AsyncSession, *, email: str) -> User | None:
result = await db.execute(select(User).where(User.email == email))
return result.scalar_one_or_none()
async def create(self, db: AsyncSession, *, obj_in: UserCreate, **extra) -> User:
data = obj_in.model_dump(exclude={"password"})
data["hashed_password"] = get_password_hash(obj_in.password)
data.update(extra)
db_obj = User(**data)
db.add(db_obj)
await db.flush()
await db.refresh(db_obj)
return db_obj
async def authenticate(self, db: AsyncSession, *, email: str, password: str) -> User | None:
user = await self.get_by_email(db, email=email)
if not user:
return None
if not verify_password(password, user.hashed_password):
return None
return user
async def get_tenants(self, db: AsyncSession, *, user_id: UUID):
from sqlalchemy.orm import selectinload
from app.models.user import UserTenant
from app.models.tenant import Tenant
result = await db.execute(
select(Tenant)
.join(UserTenant, UserTenant.tenant_id == Tenant.id)
.where(UserTenant.user_id == user_id)
)
return list(result.scalars().all())
crud_user = CRUDUser(User)