monitoring-api/packages/v1/administrativo/services/client/client_update_service.py

65 lines
No EOL
2.7 KiB
Python

from packages.v1.administrativo.schemas.client_schema import ClientUpdateSchema, ClientCNSSchema
from packages.v1.administrativo.actions.client.client_update_action import UpdateAction
from actions.dynamic_import.dynamic_import import DynamicImport
from fastapi import status, HTTPException
class UpdateService:
"""
Service responsável por orquestrar a atualização de um cliente,
incluindo validações de regra de negócio antes de delegar a ação.
"""
def __init__(self):
# Action responsável por carregar as services de acordo com o estado
self.dynamic_import = DynamicImport()
# Define o pacote que deve ser carregado
self.dynamic_import.set_package("administrativo")
# Define a tabela que o pacote pertence
self.dynamic_import.set_table("client")
pass
def execute(self, client_id: int, client_schema: ClientUpdateSchema):
"""
Executa o serviço de atualização de um cliente.
:param client_id: ID do cliente a ser atualizado.
:param client_schema: Schema contendo os dados do cliente para atualização.
:return: Resultado da operação de atualização.
"""
# Armazena possíveis erros de validação
errors = []
# --- Validação de Unicidade do CNS (Cadastro Nacional de Saúde) ---
if client_schema.cns:
# Importação de service de busca por CNS
cns_service = self.dynamic_import.service("client_get_cns_service", "GetCNSService")
# Instânciamento da service
self.cns_service = cns_service()
# Tenta localizar o cliente pelo CNS, sem levantar erro HTTP se não encontrar (o False no segundo param)
# É necessário usar um schema de busca específico para o CNS
self.response = self.cns_service.execute(ClientCNSSchema(cns=client_schema.cns), False)
# Se houver retorno, significa que o CNS já está sendo utilizado
if self.response:
# O CNS é um erro APENAS se pertencer a outro cliente, e não ao que está sendo atualizado.
if self.response.get('client_id') != client_id:
errors.append({'input': 'cns', 'message': 'O CNS informado já está sendo utilizado por outro cliente.'})
# Se houver erros de validação, informa
if errors:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail=errors
)
# Instânciamento da Action de atualização
update_action = UpdateAction()
# Executa a ação de atualização
return update_action.execute(client_id, client_schema)