Files

87 lines
2.9 KiB
Python

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."