Skip to content

[TREINAMENTO] CRUD de Vacinas — Paulo Moura Menezes - #884

Open
devpaulomenezes wants to merge 6 commits into
training/patient-vaccine-crudfrom
feature/881-vacinas-crud-paulo-menezes
Open

[TREINAMENTO] CRUD de Vacinas — Paulo Moura Menezes#884
devpaulomenezes wants to merge 6 commits into
training/patient-vaccine-crudfrom
feature/881-vacinas-crud-paulo-menezes

Conversation

@devpaulomenezes

Copy link
Copy Markdown
Collaborator

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

  1. Acessar /vaccines e verificar a listagem
  2. Criar uma nova vacina em /vaccines/new
  3. Editar uma vacina existente
  4. Excluir uma vacina sem vínculo (modal de confirmação)
  5. Verificar o cadeado em vacina com hasPatient: true

Checklist

  • Lint executado
  • Testes executados
  • Build do frontend ok
  • Build do backend ok
  • Listagem e busca de vacinas funcionando

Evidências

adicao_vacina responsividade_vacinas tela_pacientes busca_vacina edicao_vacina exclusao_vacina tela_vacinas

@coderabbitai

coderabbitai Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2533ff9f-5e89-4d76-b3ec-9ea3cf0bcdc5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@devpaulomenezes devpaulomenezes changed the title feat: implementa criação, edição e exclusão de vacinas #869 [TREINAMENTO] CRUD de Vacinas — Paulo Moura Menezes Aug 18, 2026
@devpaulomenezes
devpaulomenezes requested review from Dario-Arthur and jefter-dev and removed request for jefter-dev August 18, 2026 02:14

@Dario-Arthur Dario-Arthur left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 Dario-Arthur left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@Dario-Arthur

Copy link
Copy Markdown
Contributor

Revisão pós-fix (tooltip) — novos achados
✅ Fix do tooltip confirmado

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
@Dario-Arthur

Copy link
Copy Markdown
Contributor

Revalidei os 2 pontos pendentes após os últimos ajustes:

✅ Nome curto, agora bloqueia direto no formulário, com mensagem amigável
✅ Nome duplicado com case diferente, bloqueia corretamente

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.

@euAllanDev
euAllanDev self-requested a review August 27, 2026 17:01
@euAllanDev

Copy link
Copy Markdown
Contributor

SEGUNDA REVIEW

Achados:

  • MEDIUM - VaccineApplicationServiceImpl.java:90,104: o nome é validado antes do trim(). Com isso, " A " passa na validação de mínimo de 2 caracteres, mas é salvo como "A".
Captura de tela 2026-08-27 165838

Validar o nome já normalizado antes de criar ou editar.

NEEDS CHANGES

…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
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.

3 participants