from fastapi import HTTPException, status import base64 # 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, upload_dir: str, group_size: int ) -> str: """ 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 base de uploads existe upload_dir.mkdir(parents=True, exist_ok=True) # --- 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 # Caminho para visualização via url (relativo ao storage) # Exemplo: "100/57/documento.pdf" file_url = f"{faixa_superior}/{ato_id}/{file_name}" try: # Decodifica o Base64 file_bytes = base64.b64decode(base64_content) # Grava o arquivo em disco with open(file_path, "wb") as f: f.write(file_bytes) # Retorna o caminho completo do arquivo salvo para visualização via URl return str(file_url) except base64.binascii.Error: 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: raise Exception(f"Erro inesperado ao salvar arquivo '{file_name}': {e}")