from typing import Optional, List from sqlalchemy import func, or_ 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 o alias de usuario.""" if not email: return None clean = email.strip().lower() user = User.query.filter(func.lower(User.email) == clean).first() if user: return user # Si el usuario ingresó solo el nombre de cuenta (ej. 'admin' o 'bedelia') if '@' not in clean: user = User.query.filter( or_( func.lower(User.email) == f"{clean}@edu-space.com", func.lower(User.name) == clean, func.lower(User.role) == clean.upper() ) ).first() if user: return user return None 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()