from typing import Optional, Dict, Any from datetime import datetime from app.models.user import User from app.repositories.user_repository import UserRepository from app import db class UserService: """Capa de servicios para la autenticación, roles y perfil de usuarios.""" def __init__(self, repository: Optional[UserRepository] = None): self.repository = repository or UserRepository() def authenticate(self, email: str, password: str) -> Optional[User]: """ Valida credenciales de acceso de un usuario. Retorna la entidad User si es válido y activo; None en caso contrario. """ user = self.repository.get_by_email(email) if not user or not user.is_active: return None if user.check_password(password): user.last_login = datetime.utcnow() self.repository.save(user) return user return None def get_by_id(self, user_id: int) -> Optional[User]: """Obtiene un usuario por ID.""" return self.repository.get_by_id(user_id) def get_by_email(self, email: str) -> Optional[User]: """Obtiene un usuario por email.""" return self.repository.get_by_email(email) def get_profile_data(self, user: User) -> Dict[str, Any]: """Genera un diccionario estructurado del perfil y permisos del usuario.""" role_name = user.role_obj.name if user.role_obj else user.role permissions = {} if user.role_obj and hasattr(user.role_obj, 'permissions'): for p in user.role_obj.permissions: permissions[p.module] = p.access_level return { 'id': user.id, 'name': user.name, 'email': user.email, 'role': role_name, 'is_admin': user.is_admin(), 'permissions': permissions, 'preferred_language': user.preferred_language, 'theme_preference': user.theme_preference }