50 lines
1.9 KiB
Python
50 lines
1.9 KiB
Python
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()
|