from typing import Optional, List from sqlalchemy import func from app.models.user import User from app.repositories.base_repository import BaseRepository class UserRepository(BaseRepository[User]): """Repositorio para la gestión de usuarios, credenciales y roles.""" def __init__(self): super().__init__(User) def get_by_email(self, email: str) -> Optional[User]: """Obtiene un usuario por su dirección de email normalizada.""" if not email: return None return User.query.filter(func.lower(User.email) == email.strip().lower()).first() def get_active_users(self) -> List[User]: """Obtiene todos los usuarios con cuenta activa.""" return User.query.filter_by(is_active=True).order_by(User.name.asc()).all() def get_by_role(self, role_name: str) -> List[User]: """Obtiene usuarios por nombre de rol.""" return User.query.filter( User.is_active == True, func.lower(User.role) == role_name.strip().lower() ).order_by(User.name.asc()).all() def get_teachers(self) -> List[User]: """Obtiene lista de docentes y profesores activos.""" return User.query.filter( User.is_active == True, User.role.in_(['TEACHER', 'DOCENTE', 'PROFESOR', 'teacher', 'docente']) ).order_by(User.name.asc()).all()