87 lines
2.9 KiB
Python
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."
|