from __future__ import annotations from typing import Any from fastapi import APIRouter, Request from pydantic import BaseModel from app.services import auth_service, trabalhos_tecnicos_service from app.services.audit_log_service import log_event router = APIRouter(prefix="/api/trabalhos-tecnicos", tags=["trabalhos_tecnicos"]) class TrabalhoDetalhePayload(BaseModel): trabalho_id: str class TrabalhoImovelEdicaoPayload(BaseModel): label: str | None = None endereco: str | None = None numero: str | None = None coord_x: float | None = None coord_y: float | None = None modelos: list[str] | None = None class TrabalhoPayloadBase(BaseModel): nome: str | None = None tipo_codigo: str | None = None ano: int | None = None processos_sei: list[str] | None = None modelos: list[str] | None = None imoveis: list[TrabalhoImovelEdicaoPayload] | None = None class TrabalhoCadastrarPayload(TrabalhoPayloadBase): pass class TrabalhoSalvarPayload(TrabalhoPayloadBase): trabalho_id: str class TrabalhosMapaPayload(BaseModel): trabalhos_ids: list[str] | None = None modo_exibicao: str | None = None avaliando_lat: float | None = None avaliando_lon: float | None = None @router.get("") def listar_trabalhos(request: Request) -> dict[str, Any]: user = auth_service.require_user(request) resposta = trabalhos_tecnicos_service.listar_trabalhos() log_event( "trabalhos_tecnicos", "listar_trabalhos", user=user, status="ok", request=request, details={"total_trabalhos": resposta.get("total_trabalhos")}, ) return resposta @router.post("/mapa") def mapa_trabalhos(payload: TrabalhosMapaPayload, request: Request) -> dict[str, Any]: user = auth_service.require_user(request) resposta = trabalhos_tecnicos_service.gerar_mapa_trabalhos( payload.trabalhos_ids, modo_exibicao=payload.modo_exibicao, avaliando_lat=payload.avaliando_lat, avaliando_lon=payload.avaliando_lon, ) log_event( "trabalhos_tecnicos", "mapa_trabalhos", user=user, status="ok", request=request, details={ "total_trabalhos": resposta.get("total_trabalhos"), "total_imoveis": resposta.get("total_imoveis"), "modo_exibicao": resposta.get("modo_exibicao"), }, ) return resposta @router.post("/detalhe") def detalhar_trabalho(payload: TrabalhoDetalhePayload, request: Request) -> dict[str, Any]: user = auth_service.require_user(request) resposta = trabalhos_tecnicos_service.detalhar_trabalho(payload.trabalho_id) log_event( "trabalhos_tecnicos", "detalhar_trabalho", user=user, status="ok", request=request, details={"trabalho_id": payload.trabalho_id}, ) return resposta @router.post("/salvar") def salvar_trabalho(payload: TrabalhoSalvarPayload, request: Request) -> dict[str, Any]: user = auth_service.require_user(request) resposta = trabalhos_tecnicos_service.salvar_edicao_trabalho( payload.trabalho_id, payload.model_dump(), actor=str(user.get("usuario") or user.get("nome") or ""), ) log_event( "trabalhos_tecnicos", "salvar_trabalho", user=user, status="ok", request=request, details={"trabalho_id": payload.trabalho_id}, ) return resposta @router.post("/cadastrar") def cadastrar_trabalho(payload: TrabalhoCadastrarPayload, request: Request) -> dict[str, Any]: user = auth_service.require_user(request) resposta = trabalhos_tecnicos_service.cadastrar_trabalho_tecnico( payload.model_dump(), actor=str(user.get("usuario") or user.get("nome") or ""), ) trabalho = resposta.get("trabalho") if isinstance(resposta, dict) else {} log_event( "trabalhos_tecnicos", "cadastrar_trabalho", user=user, status="ok", request=request, details={"trabalho_id": trabalho.get("id") if isinstance(trabalho, dict) else None}, ) return resposta