from fastapi import HTTPException, status from actions.jwt.create_token import CreateToken from packages.v1.administrativo.schemas.user_schema import UserAuthenticateSchema from packages.v1.administrativo.actions.user.user_get_by_authenticate_action import GetByAuthenticateAction import json from actions.security.security import Security class AuthenticateService: def execute(self, user_authenticate_schema: UserAuthenticateSchema): # Instância da action de autenticação get_by_authenticate_action = GetByAuthenticateAction() get_by_authenticate_result = get_by_authenticate_action.execute(user_authenticate_schema) # Verifica se o usuário existe if not get_by_authenticate_result: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Usuário não encontrado ou credenciais inválidas" ) # Verifica se a senha armazenada é um hash válido if not Security.is_hash(get_by_authenticate_result.password): raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail="A senha armazenada é inválida" ) # Verifica se a senha informada confere if not Security.verify_password(user_authenticate_schema.password, get_by_authenticate_result.password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Senha incorreta" ) # Verifica se o usuário está ativo if get_by_authenticate_result.status != "A": raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="O usuário encontra-se desativado" ) # Gera o token de acesso create_token = CreateToken() jwtUser = { "user_id": int(get_by_authenticate_result.user_id), "nome": str(get_by_authenticate_result.name), "email": str(get_by_authenticate_result.email), } return create_token.execute("access-token", json.dumps(jwtUser))