From 52875cb037117f36373ccf1bd110a3f0c3c89465 Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Wed, 5 Nov 2025 16:26:59 -0300 Subject: [PATCH] =?UTF-8?q?fix():=20Ajuste,=20configura=C3=A7=C3=A3o=20fin?= =?UTF-8?q?al=20de=20salvamento=20de=20arquivos=20com=20suas=20respectivas?= =?UTF-8?q?=20hierarquias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/database/mysql.json | 1 + .../ato_principal_save_multiple_repository.py | 42 +++++++++++++------ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/config/database/mysql.json b/config/database/mysql.json index a0d5bc3..c8452e8 100644 --- a/config/database/mysql.json +++ b/config/database/mysql.json @@ -6,6 +6,7 @@ "password": "${DB_PASSWORD}", "aeskey": "${AES_KEY}", "storage": "${STORAGE}", + "group_size": "${GROUP_SIZE}", "charset": "utf8mb4", "pool": { "pre_ping": true, diff --git a/packages/v1/administrativo/repositories/ato_principal/ato_principal_save_multiple_repository.py b/packages/v1/administrativo/repositories/ato_principal/ato_principal_save_multiple_repository.py index 153a30d..a76eb07 100644 --- a/packages/v1/administrativo/repositories/ato_principal/ato_principal_save_multiple_repository.py +++ b/packages/v1/administrativo/repositories/ato_principal/ato_principal_save_multiple_repository.py @@ -20,6 +20,9 @@ from pathlib import Path # Configuração da Chave AES DB_SETTINGS = get_database_settings() AES_KEY = getattr(DB_SETTINGS, "aeskey", None) +GROUP_SIZE = getattr( + DB_SETTINGS, "group_size", None +) # quantidade de atos por pasta de grupo # --- CONFIGURAÇÃO DE DIRETÓRIO DE UPLOAD --- # **IMPORTANTE:** Configure este caminho conforme sua arquitetura! @@ -28,35 +31,49 @@ AES_KEY = getattr(DB_SETTINGS, "aeskey", None) UPLOAD_DIR = Path(os.environ.get("STORAGE", "./storage")) -def _save_file_from_base64(base64_content: str, file_name: str) -> str: +# Salva o arquivo Base64 em disco e retorna o caminho completo +def _save_file_from_base64(base64_content: str, file_name: str, ato_id: int) -> str: """ - Decodifica o Base64, salva o arquivo no disco e retorna o caminho/URL do arquivo salvo. + Decodifica o Base64, salva o arquivo em disco dentro de uma hierarquia + baseada no 'ato_id', e retorna o caminho completo do arquivo salvo. + + Estrutura de diretórios: + storage/ + 100/ + 57/ + documento.pdf """ - # Garante que o diretório de uploads existe + # Garante que o diretório base de uploads existe UPLOAD_DIR.mkdir(parents=True, exist_ok=True) - # Define o caminho completo do arquivo - file_path = UPLOAD_DIR / file_name + # --- NOVO BLOCO: define a faixa de agrupamento --- + # Exemplo: IDs 1–100 vão para pasta 100; IDs 101–200 → 200 + faixa_superior = ((ato_id - 1) // GROUP_SIZE + 1) * GROUP_SIZE + + # Define o caminho hierárquico: storage/100/57/ + target_dir = UPLOAD_DIR / str(faixa_superior) / str(ato_id) + target_dir.mkdir(parents=True, exist_ok=True) + + # Caminho completo do arquivo final + file_path = target_dir / file_name try: - # Decodificação Base64 + # Decodifica o Base64 file_bytes = base64.b64decode(base64_content) - # Escrita do arquivo em disco (modo binário 'wb') + # Grava o arquivo em disco with open(file_path, "wb") as f: f.write(file_bytes) - # Retorna o caminho onde o arquivo foi salvo (Este será o valor salvo no campo 'url' do banco) + # Retorna o caminho completo do arquivo salvo return str(file_path) except base64.binascii.Error: - # Erro específico para conteúdo Base64 inválido raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=f"O conteúdo do arquivo '{file_name}' não é um Base64 válido.", ) except Exception as e: - # Outros erros de I/O ou sistema raise Exception(f"Erro inesperado ao salvar arquivo '{file_name}': {e}") @@ -157,9 +174,10 @@ class SaveMultipleRepository: file_url_path = None if base64_content and doc.nome_documento: - # 1. Decodifica e salva o Base64 em disco file_name = doc.nome_documento - file_url_path = _save_file_from_base64(base64_content, file_name) + file_url_path = _save_file_from_base64( + base64_content, file_name, new_ato_id + ) # 2. Atribui o caminho do arquivo salvo (ou None, se não foi enviado) ao campo 'url' do banco doc_data["url"] = file_url_path