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:
parent
a9e065e181
commit
7bbfbe2d94
1 changed files with 9 additions and 67 deletions
|
|
@ -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
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue