import uuid from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.models.user import User from app.services.auth_service import hash_password async def get_by_email(db: AsyncSession, email: str) -> User | None: result = await db.execute(select(User).where(User.email == email)) return result.scalar_one_or_none() async def get(db: AsyncSession, user_id: str | uuid.UUID) -> User | None: uid = uuid.UUID(str(user_id)) if not isinstance(user_id, uuid.UUID) else user_id result = await db.execute(select(User).where(User.id == uid)) return result.scalar_one_or_none() async def create( db: AsyncSession, email: str, password: str, full_name: str, phone: str | None = None, role: str = "member", status: str = "pending", ) -> User: user = User( email=email, hashed_password=hash_password(password), full_name=full_name, phone=phone, role=role, status=status, ) db.add(user) await db.commit() await db.refresh(user) return user async def list_all( db: AsyncSession, status: str | None = None, role: str | None = None, skip: int = 0, limit: int = 50, ) -> list[User]: q = select(User) if status: q = q.where(User.status == status) if role: q = q.where(User.role == role) q = q.offset(skip).limit(limit) result = await db.execute(q) return list(result.scalars().all()) async def set_status(db: AsyncSession, user: User, status: str) -> User: user.status = status await db.commit() await db.refresh(user) return user async def set_push_token(db: AsyncSession, user: User, token: str) -> User: user.expo_push_token = token await db.commit() await db.refresh(user) return user