feat(): Criação de endpoint que cadastra multiplos documentos junto ao banco de dados. Criado função global que grava os arquivos em disco

This commit is contained in:
Kenio 2025-11-13 19:00:53 -03:00
parent a9e065e181
commit 7bbfbe2d94

View file

@ -36,22 +36,20 @@ class SaveMultipleRepository:
Salva um único documento após localizar o Ato Principal correspondente Salva um único documento após localizar o Ato Principal correspondente
via código de selo. via código de selo.
""" """
# 1 — Obtém e valida o código de selo
codigo_selo = getattr(doc_schema, "codigo_selo", None) codigo_selo = getattr(doc_schema, "codigo_selo", None)
# 1 Verifica se o campo 'codigo_selo' foi informado
if not codigo_selo or codigo_selo.strip() == "": if not codigo_selo or codigo_selo.strip() == "":
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
detail="O campo 'codigo_selo' é obrigatório para associar o documento.", detail="O campo 'codigo_selo' é obrigatório para associar o documento.",
) )
# 2 Busca o ato principal correspondente ao código do selo # 2 — Localiza o ato principal correspondente
ato_principal = ( ato_principal = (
db.query(AtoPrincipal) db.query(AtoPrincipal)
.filter(AtoPrincipal.codigo_selo == codigo_selo) .filter(AtoPrincipal.codigo_selo == codigo_selo)
.first() .first()
) )
if not ato_principal: if not ato_principal:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, status_code=status.HTTP_404_NOT_FOUND,
@ -60,18 +58,18 @@ class SaveMultipleRepository:
ato_principal_id = ato_principal.ato_principal_id ato_principal_id = ato_principal.ato_principal_id
# 3 Extrai e prepara os dados do schema # 3 — Extrai os dados do documento, removendo o campo 'codigo_selo'
doc_data = doc_schema.model_dump( doc_data = doc_schema.model_dump(
exclude_unset=True, exclude_unset=True,
exclude={"arquivo"}, # não envia base64 ao banco exclude={"arquivo", "codigo_selo"}, # <- Removemos aqui
) )
# 4 Processa o arquivo Base64 (se informado) # 4 — Processa o arquivo base64 (se houver)
base64_content = getattr(doc_schema, "arquivo", None) base64_content = getattr(doc_schema, "arquivo", None)
file_url_path = None file_url_path = None
if base64_content: if base64_content:
# Gera nome de arquivo, se não informado # Define o nome do arquivo
if not doc_schema.nome_documento: if not doc_schema.nome_documento:
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
unique_id = uuid.uuid4().hex[:8] unique_id = uuid.uuid4().hex[:8]
@ -84,12 +82,11 @@ class SaveMultipleRepository:
base64_content, file_name, ato_principal_id, UPLOAD_DIR, GROUP_SIZE base64_content, file_name, ato_principal_id, UPLOAD_DIR, GROUP_SIZE
) )
# 5 Atribui o caminho salvo (ou None) # 5 Atribui o caminho salvo
doc_data["url"] = file_url_path doc_data["url"] = file_url_path
# 6 Criptografa os metadados do documento # 6 Criptografa os metadados do documento
campos_criptografar = ["url", "nome_documento", "tipo_documento"] campos_criptografar = ["url", "nome_documento", "tipo_documento"]
for campo in campos_criptografar: for campo in campos_criptografar:
valor = doc_data.get(campo) valor = doc_data.get(campo)
if isinstance(valor, str) and valor.strip(): if isinstance(valor, str) and valor.strip():
@ -97,63 +94,8 @@ class SaveMultipleRepository:
else: else:
doc_data[campo] = None doc_data[campo] = None
# 7 Cria o registro no banco # 7 — Cria o registro do documento vinculado ao ato principal
new_documento = AtoDocumento(**doc_data, ato_principal_id=ato_principal_id) new_documento = AtoDocumento(**doc_data, ato_principal_id=ato_principal_id)
db.add(new_documento) db.add(new_documento)
return new_documento return new_documento
# -------------------------------------------------------
# Método principal — grava múltiplos documentos
# -------------------------------------------------------
def execute(self, documentos: List[AtoDocumentoSaveMultipleSchema]):
db = SessionLocal()
results = []
if not AES_KEY:
db.close()
raise Exception("A chave AES (aeskey) não está configurada.")
for doc_schema in documentos:
codigo_selo_log = getattr(doc_schema, "codigo_selo", "SELO_INDISPONÍVEL")
try:
new_doc = self._save_documento(db, doc_schema)
db.commit()
results.append(
{
"success": True,
"message": "Documento salvo com sucesso.",
"data": {
"codigo_selo": codigo_selo_log,
"ato_principal_id": new_doc.ato_principal_id,
},
}
)
except HTTPException as he:
db.rollback()
results.append(
{
"success": False,
"error": he.detail,
"data": {"codigo_selo": codigo_selo_log},
}
)
except Exception as e:
db.rollback()
print(f"ERRO AO SALVAR DOCUMENTO (SELO {codigo_selo_log}): {e}")
traceback.print_exc()
results.append(
{
"success": False,
"error": "Erro interno ao salvar o documento.",
"data": {"codigo_selo": codigo_selo_log},
}
)
db.close()
return results