[TREINAMENTO] CRUD de Vacinas — Paulo Moura Menezes - #884
[TREINAMENTO] CRUD de Vacinas — Paulo Moura Menezes#884devpaulomenezes wants to merge 6 commits into
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Testei o PR localmente e ficou tudo certo:
npx tsc --noEmit e npm run build passando sem erros
CRUD completo de vacinas (criar, editar, excluir) funcionando
Validação de nome duplicado (case-insensitive) funcionando
Vínculo vacina ↔ paciente testado: ao vincular, a exclusão fica bloqueada corretamente
Responsividade ok
Observação à parte, sem relação com esse PR: encontrei um erro (PUT 400 / GET 500) na tela de Registro Anual do paciente, mas é em annual-registry.api.ts, fora do escopo de vacinas — vou reportar separadamente.
Aprovado 👍
Dario-Arthur
left a comment
There was a problem hiding this comment.
Complementando minha review anterior: ao validar mais a fundo contra os critérios de aceite da issue #869, encontrei um ponto que precisa de ajuste antes do merge.
O bloqueio de exclusão de vacina vinculada a paciente funciona (ícone de cadeado aparece corretamente), mas não há nenhuma mensagem explicando o motivo do bloqueio. Testei hover e não aparece tooltip nem texto. A issue exige explicitamente: "A interface informa o motivo quando a exclusão estiver bloqueada."
Sugestão de ajuste: adicionar um title/tooltip no ícone do cadeado, ou um texto ao lado (ex: "Vacina em uso por paciente").
O restante da entrega segue validado build, CRUD completo, validação de nome duplicado, e o próprio bloqueio de exclusão funcionando na prática.
|
Revisão pós-fix (tooltip) — novos achados O bloqueio de exclusão de vacina vinculada a paciente agora exibe mensagem explicativa ao passar o mouse sobre o ícone de cadeado. Build (backend + frontend) segue passando sem erros. Aproveitei para fazer um pente-fino completo contra os critérios de aceite da issue #869 e encontrei 2 problemas novos: 🟠 1. Nome duplicado com case diferente não é bloqueado na criação Testei criar uma vacina chamada "NADA 3.0" com "Nada 3.0" já existente na lista, e o sistema aceitou como se fossem vacinas diferentes. A issue exige que "A API impede nomes duplicados", a validação precisa ser case-insensitive (existsByNameIgnoreCase em vez de comparação sensível a maiúsculas/minúsculas). 🟠 2. Validação de nome curto expõe erro técnico ao usuário Ao criar uma vacina com nome de 1 caractere, o formulário permite o envio (só valida "obrigatório", não o tamanho mínimo). O backend rejeita corretamente, mas a mensagem que aparece na tela é o stack trace técnico do Spring Boot (Validation failed for argument [0]...), em vez de uma mensagem amigável como "O nome da vacina deve ter entre 2 e 100 caracteres" (que já vem no corpo do erro, só não está sendo extraída no frontend). |
…tro de vacinas Adicionados os métodos findByNameIgnoreCase e existsByNameIgnoreCase no VaccineRepository (derivados automaticamente pelo Spring Data JPA). Os métodos createVaccine e updateVaccine em VaccineApplicationServiceImpl passaram a utilizar essas consultas na checagem de conflito de nome, tornando a validação case-insensitive — nomes como 'Nada 3.0' e 'NADA 3.0' agora são corretamente rejeitados como duplicatas. Refs #869
…ing na validação de nome O PatientExceptionHandler agora extrai fieldError.getDefaultMessage() do BindingResult em MethodArgumentNotValidException, em vez de expor ex.getMessage() bruto (que continha o stack trace do Spring). A API passa a retornar a mensagem definida na anotação @SiZe, como 'O nome da vacina deve ter entre 2 e 100 caracteres.' No frontend, vaccines.schema.ts (Zod) foi atualizado para validar min(2) e max(100) com a mesma mensagem, alinhando a validação do formulário com as restrições do backend e bloqueando o envio antes da chamada à API. Refs #869
…case-insensitive >> >> Aplicado .trim() no nome da vacina antes de chamar findByNameIgnoreCase >> em createVaccine e updateVaccine, impedindo que espaços extras burlem >> a validação de duplicidade. Também removida importação duplicada de >> VaccineNotFoundException que existia no arquivo. >> >> Refs #869
|
Revalidei os 2 pontos pendentes após os últimos ajustes: ✅ Nome curto, agora bloqueia direto no formulário, com mensagem amigável Build (backend + frontend) segue passando sem erros. Junto com o que já tinha sido validado antes (CRUD completo, tooltip no bloqueio de exclusão, edição pré-preenchida, responsividade), todos os pontos levantados foram corrigidos. Da minha parte está aprovado — aguardando a segunda review para fechar. |
…Validation Adiciona compact constructor ao record CreateVaccineDTO para normalizar o campo name com trim() antes que as anotações @notblank e @SiZe sejam avaliadas. Isso corrige o bug onde entradas com espacos nas bordas como A (3 caracteres) passavam na validacao de minimo de 2 caracteres, mas eram salvas como A (1 caractere) apos o trim aplicado no service. Refs #881

O que mudou?
Resumo das mudanças de frontend e backend implementadas: criação, edição e exclusão de vacinas; bloqueio de exclusão quando vinculada a paciente; validação de nome duplicado. Não foi possível realizar o teste do 'Bloqueio de exclusão' pois não havia paciente cadastrado, conforme imagem anexada.
Tarefas Relacionadas
Closes #881
Como testar
Checklist
Evidências