from __future__ import annotations from typing import Any from fastapi import APIRouter, File, Form, HTTPException, Request, UploadFile from pydantic import BaseModel, Field from app.services import auth_service, repositorio_service from app.services.audit_log_service import log_event router = APIRouter(prefix="/api/repositorio", tags=["repositorio"]) class DeletePayload(BaseModel): modelos_ids: list[str] = Field(default_factory=list) @router.get("/modelos") def listar_modelos(request: Request) -> dict[str, Any]: user = auth_service.require_user(request) resposta = repositorio_service.listar_modelos() log_event( "repositorio", "listar_modelos", user=user, status="ok", request=request, details={"total_modelos": resposta.get("total_modelos")}, ) return resposta @router.post("/upload") async def upload_modelos( request: Request, files: list[UploadFile] = File(...), confirmar_substituicao: bool = Form(False), ) -> dict[str, Any]: user = auth_service.require_admin(request) arquivos: list[tuple[str, bytes]] = [] for file in files: nome = str(file.filename or "").strip() if not nome: continue conteudo = await file.read() if not conteudo: continue arquivos.append((nome, conteudo)) if not arquivos: raise HTTPException(status_code=400, detail="Nenhum arquivo .dai valido foi enviado") resposta = repositorio_service.upload_modelos( arquivos, actor=user.get("usuario"), confirmar_substituicao=confirmar_substituicao, ) log_event( "repositorio", "upload_modelos", user=user, status="ok", request=request, details={ "arquivos": [nome for nome, _ in arquivos], "confirmar_substituicao": bool(confirmar_substituicao), "substituidos": resposta.get("resultado_upload", {}).get("substituidos", []), "total_modelos": resposta.get("total_modelos"), }, ) return resposta @router.post("/delete") def delete_modelos(payload: DeletePayload, request: Request) -> dict[str, Any]: user = auth_service.require_admin(request) ids = [str(item).strip() for item in payload.modelos_ids if str(item).strip()] if not ids: raise HTTPException(status_code=400, detail="Selecione ao menos um modelo para exclusao") resposta = repositorio_service.excluir_modelos(ids, actor=user.get("usuario")) log_event( "repositorio", "excluir_modelos", user=user, status="ok", request=request, details={ "modelos_ids": ids, "total_modelos": resposta.get("total_modelos"), }, ) return resposta