Auditoria

Toda mutacao HTTP (POST/PUT/PATCH/DELETE) e cada erro gera entrada imutavel em audit_logs. Automatico via AuditInterceptor global.

Campos capturados

  • actorId, tenantId, municipioId (do TenantContext)
  • requestId (correlacao end-to-end)
  • method, route, status
  • entity (derivado da rota), entityId (param :id)
  • ip, userAgent
  • action: CREATE / UPDATE / DELETE / LOGIN / LOGOUT / EXPORT / OTHER
  • before, after (JSON; preenchido por servicos que querem rastrear)
  • createdAt (imutavel)

Garantias

  • Falha de persistencia do AuditSink NAO derruba o request (apenas warn).
  • AuditLog NUNCA mistura municipioId entre tenants.
  • R15: registros nao podem ser deletados em runtime — politica de retencao por entidade.

Consumo no admin

GET /core/auditoria?page=1&pageSize=50 retorna timeline paginada (exige core.auditoria.ler).