from typing import Optional, List from sqlalchemy.orm import Session from sqlalchemy import select, or_ from app.models.UserModel import User from app.repositories.base_repository import BaseRepository class UserRepository(BaseRepository[User]): def __init__(self): super().__init__(User) def get_by_email(self, db: Session, email: str) -> Optional[User]: stmt = select(User).where(User.email == email, User.deleted_at.is_(None)) return db.execute(stmt).scalar_one_or_none() def get_by_phone(self, db: Session, phone: str) -> Optional[User]: stmt = select(User).where(User.phone == phone, User.deleted_at.is_(None)) return db.execute(stmt).scalar_one_or_none() def get_by_employee_code(self, db: Session, employee_code: str) -> Optional[User]: stmt = select(User).where(User.employee_code == employee_code, User.deleted_at.is_(None)) return db.execute(stmt).scalar_one_or_none() def check_duplicate_identity(self, db: Session, email: str, phone: str, employee_code: Optional[str] = None) -> Optional[User]: conditions = [User.email == email, User.phone == phone] if employee_code: conditions.append(User.employee_code == employee_code) stmt = select(User).where(or_(*conditions), User.deleted_at.is_(None)) return db.execute(stmt).scalars().first() def get_active_users(self, db: Session, skip: int = 0, limit: int = 100) -> List[User]: stmt = select(User).where(User.is_active.is_(True), User.deleted_at.is_(None)).offset(skip).limit(limit) return list(db.execute(stmt).scalars().all()) user_repository = UserRepository()