Skip to content

T-305 - Implementar na API a consulta de auditoria - #423

Merged
pedro-fs-garcia merged 2 commits into
developfrom
feature/t-305-api-auditoria
Nov 13, 2026
Merged

pedro-fs-garcia merged 2 commits into
developfrom
feature/t-305-api-auditoria

Conversation

@pedro-fs-garcia

Copy link
Copy Markdown
Collaborator

O que muda

As duas rotas de leitura do auditor definidas na T-304 passam a existir na api: GET /auditoria/jobs e GET /auditoria/jobs/{id}.

  • Fatia nova synapse.api.auditoria, com controller, política de acesso, serviço, repositório, DTOs e tratamento de erro próprios. Ela lê as tabelas com consultas próprias e não usa classes da fatia job.
  • A fatia job expõe a interface pública NomesDeJobs, para a auditoria resolver o nome de exibição com a mesma SQL de GET /jobs. É a única mudança fora da fatia nova.
  • Nenhuma métrica de domínio nova: as métricas HTTP do Micrometer cobrem volume, falha e duração por rota.

Acesso

  • Um interceptor em /auditoria/** chama UsuarioAtual.obter() antes de interpretar parâmetros ou ler dados. Só o papel auditor passa, sem conferência de posse.
  • Outro papel, token sem papel de negócio ou com os dois papéis recebe 403 sem_permissao. Sessão ausente continua recebendo 401 pela cadeia de segurança.
  • Job inexistente recebe 404 job_nao_encontrado. Id malformado recebe 400 requisicao_invalida. A paginação tem os mesmos padrões, limites e mensagens de GET /jobs.

Registro do job

  • Uma consulta por seção, filtrada pelo job e em ordem cronológica. Todas rodam numa transação somente leitura com um único instantâneo do banco, para que uma seção não aponte o que outra ainda não tinha.
  • Nenhuma consulta lê submissoes.binario nem resultados_simulacao.linhas. Os campos jsonb saem como o banco os devolve e os decimais preservam a precisão.
  • etapas.simulacao_id vem da linha quando ela o traz e, senão, do código do resultado apontado, porque simulacoes.codigo_gerado_id é único.
  • etapas.submissao_id nas linhas de extração:
    • na extração inicial, vem da extração gravada com a resposta do prompt da linha;
    • na reextração, vem da correção da rodada que analisou a regra_id da linha. Quando várias rodadas analisaram a mesma versão (depois de uma reextração que falhou), vale a última correção enviada até a conclusão da linha.
  • versoes.representacao é o artefato completo quando a versão o tem, e o núcleo com as especificações nas versões anteriores à coluna.

Observabilidade

  • A consulta abre o CorrelationContext com o job_id e o id do usuário auditor; a listagem abre só com o usuário. O contexto fecha ao terminar, inclusive em erro.
  • Os logs registram:
    • em info, a consulta e a listagem concluídas, com a página e o tamanho na listagem;
    • em warn, a recusa de acesso, o job inexistente e a paginação inválida;
    • em error, a falha inesperada.
  • Os logs levam só o desfecho e as referências: nenhum prompt, resposta, código, entrada, conclusão ou dado do token.

Fora do escopo

  • O exemplo de GET /auditoria/jobs/{id} no contrato põe na linha de reextração a versão corrigida em regra_id, mas o codegen grava a versão analisada. A implementação segue o que o codegen grava.
  • O 400 para id malformado não está declarado no contrato desta rota.

Verificação

  • make check na api, com JDK 21: 1614 testes, 0 falhas, 6 pulados. Os pulados são testes condicionais já existentes (fim a fim e transcrição real).
  • AcessoAuditoriaTests (22 testes):
    • recusa de RH e de identidade inválida antes do serviço;
    • 400 para paginação e id inválidos, 404 para job inexistente;
    • logs serializados validados contra log.schema.json, sem dados do token, com a correlação limpa ao terminar.
  • AuditoriaPersistenciaTests (11 testes), com Postgres real, token assinado e o usuário de banco da api:
    • auditor lista jobs de dois donos e consulta um job alheio; RH recebe 403 e sem sessão recebe 401;
    • nome da listagem igual ao de GET /jobs; paginação inválida com o mesmo corpo de GET /jobs;
    • job com sugestão de adaptação, busca da meta e correção do código: cada etapa traz o resultado e a simulação derivada, e resultados traz as execuções candidatas;
    • job de texto com rodadas de correção: as duas extrações apontam a submissão inicial e a da correção aceita;
    • resposta sem binário nem linhas, validada contra RegistroAuditoria e PaginaJobsAuditoria, e nenhuma escrita nas tabelas do job;
    • logs do fluxo real com usuário e job_id e sem conteúdo;
    • saída de /metrics com http_server_requests para /auditoria/jobs e /auditoria/jobs/{id}.
  • Não verificado: a coleta pelo Prometheus e o painel.

Closes #379

- cria a fatia auditoria com GET /auditoria/jobs e GET /auditoria/jobs/{id}, exclusivas do papel auditor e sem conferência de posse
- expõe na fatia job a interface NomesDeJobs, para a auditoria usar o mesmo nome resolvido de GET /jobs
- deriva a simulação de cada etapa pelo código do resultado e a submissão das extrações pela resposta do modelo ou pela rodada de correção
- lê as seções do registro numa transação somente leitura com um único instantâneo do banco

Review: auto
- loga em warn o parâmetro de tipo inválido (pagina, tamanho e id), que o Spring recusa antes do controller e, por isso, ficava sem registro; o log leva só o nome do parâmetro
- cobre com teste o warn da paginação fora do limite e do tipo inválido, validado contra o schema de log
- prova com Postgres real que as seções do registro e a listagem rodam em transação somente leitura com um único instantâneo, mesmo com escrita concorrente

Review: auto
@pedro-fs-garcia
pedro-fs-garcia merged commit cae45f5 into develop Nov 13, 2026
10 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant