Spaces:
Running
Running
| 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) | |
| 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 | |
| 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 | |
| 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 | |