35 lines
1.3 KiB
Python
35 lines
1.3 KiB
Python
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()
|