mesa-react / backend /app /api /repositorio.py
Guilherme Silberfarb Costa
criação de nova aba de avaliação e alterações gerais
c88d3e9
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