from flask_jwt_extended import create_access_token, create_refresh_token from app.extensions import db from app.models.user import User from app.utils.sanitizers import validate_email class AuthService: @staticmethod def login(email: str, password: str): if not email or not password: return None, "E-mail e senha são obrigatórios." user = User.query.filter_by(email=email.strip().lower()).first() if not user or not user.check_password(password): return None, "Credenciais inválidas." if not user.ativo: return None, "Usuário desativado pelo administrador." access_token = create_access_token(identity=user.id, additional_claims={'role': user.role, 'nome': user.nome}) refresh_token = create_refresh_token(identity=user.id) return { 'access_token': access_token, 'refresh_token': refresh_token, 'user': user.to_dict() }, None @staticmethod def create_user(nome: str, email: str, password: str, role: str = 'user'): email_clean = email.strip().lower() if email else '' if not nome or not email_clean or not password: return None, "Nome, e-mail e senha são obrigatórios." if not validate_email(email_clean): return None, "Formato de e-mail inválido." if len(password) < 6: return None, "A senha deve conter no mínimo 6 caracteres." if User.query.filter_by(email=email_clean).first(): return None, "E-mail já cadastrado no sistema." if role not in ('admin', 'user'): role = 'user' user = User( nome=nome.strip(), email=email_clean, role=role, ativo=True ) user.set_password(password) db.session.add(user) db.session.commit() return user.to_dict(), None @staticmethod def change_password(user_id: str, old_password: str, new_password: str): user = db.session.get(User, user_id) if not user: return False, "Usuário não encontrado." if not user.check_password(old_password): return False, "Senha atual incorreta." if len(new_password) < 6: return False, "A nova senha deve ter no mínimo 6 caracteres." user.set_password(new_password) db.session.commit() return True, "Senha alterada com sucesso." @staticmethod def admin_reset_password(target_user_id: str, new_password: str): user = db.session.get(User, target_user_id) if not user: return False, "Usuário não encontrado." if len(new_password) < 6: return False, "A nova senha deve ter no mínimo 6 caracteres." user.set_password(new_password) db.session.commit() return True, f"Senha do usuário {user.email} redefinida com sucesso."