Files
admin-edu-space/backend/app/repositories/user_repository.py
T

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()