fix(): Ajuste, configuração final de salvamento de arquivos com suas respectivas hierarquias

This commit is contained in:
Kenio 2025-11-05 16:26:59 -03:00
parent 51f2f6b0bb
commit 52875cb037
2 changed files with 31 additions and 12 deletions

View file

@ -6,6 +6,7 @@
"password": "${DB_PASSWORD}",
"aeskey": "${AES_KEY}",
"storage": "${STORAGE}",
"group_size": "${GROUP_SIZE}",
"charset": "utf8mb4",
"pool": {
"pre_ping": true,

View file

@ -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 1100 vão para pasta 100; IDs 101200 → 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