from __future__ import annotations from typing import Any from fastapi import APIRouter, Request from fastapi.responses import FileResponse from pydantic import BaseModel, Field from app.services import anexos_service, auth_service from app.services.audit_log_service import log_event router = APIRouter(prefix="/api/anexos", tags=["anexos"]) class GerarAnexosPayload(BaseModel): modelo_id: str = Field(..., min_length=1) banco_dados_colunas: list[str] | None = None avaliacao: dict[str, Any] | None = None @router.get("/modelos") def modelos(request: Request) -> dict[str, Any]: auth_service.require_user(request) return anexos_service.listar_modelos() @router.get("/modelos/{modelo_id}/columns") def modelo_colunas(modelo_id: str, request: Request) -> dict[str, Any]: auth_service.require_user(request) return anexos_service.obter_colunas(modelo_id) @router.post("/generate") def gerar(payload: GerarAnexosPayload, request: Request) -> dict[str, Any]: user = auth_service.require_user(request) caminho, avisos = anexos_service.gerar_documento( payload.modelo_id, banco_dados_colunas=payload.banco_dados_colunas, avaliacao=payload.avaliacao, ) log_event( "visualizacao", "gerar_anexos_modelo", user=user, request=request, details={ "modelo_id": payload.modelo_id, "com_avaliacao": bool(payload.avaliacao), "total_colunas": len(payload.banco_dados_colunas or []), }, ) return { "message": f"Anexos gerados com sucesso: {caminho.name}", "filename": caminho.name, "statistical_warnings": avisos, } @router.get("/download/{filename}") def download(filename: str, request: Request) -> FileResponse: auth_service.require_user(request) caminho = anexos_service.resolver_download(filename) return FileResponse( path=caminho, filename=caminho.name, media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document", headers={"Cache-Control": "no-store"}, )