Uh oh!
There was an error while loading. Please reload this page.
feat(auth): adiciona confirmação de troca de e-mail - #238
Conversation
…ode-Community#230) ## Linear Issue: PAV-119 Closes PAV-119 ## Branch flow - [ ] Este PR é uma feature/fix/chore destinada a `develop`. - [x] Este é um PR de release com origem `develop` e destino `master`. - [x] Este PR não pula o fluxo obrigatório entre `develop` e `master`. ## Objetivo Promover para `master` a implementação do lock distribuído do scraper, garantindo no máximo uma execução ativa do pipeline entre diferentes origens de disparo. ## Resumo das Alterações - Implementa lock distribuído no Valkey compartilhado por cron, execução manual administrativa e cache miss de `/scrape`. - Utiliza aquisição atômica com `SET NX PX`, TTL e renovação periódica. - Protege renovação e liberação por ownership/token. - Implementa comportamento fail-closed quando o Valkey não confirma a aquisição. - Cancela a execução de forma segura em caso de perda do lock. - Adiciona estado operacional com `runId`, origem, início e expiração sem expor o token proprietário. - Adiciona contratos HTTP para execução concorrente e indisponibilidade do run lock. - Alinha os defaults de `SCRAPER_RUN_LOCK_TTL` e `SCRAPER_RUN_LOCK_RENEW_INTERVAL` à semântica fail-fast definida anteriormente. - Adiciona cobertura de testes para concorrência, ownership, configuração, renovação, liberação e cenários de falha. - Atualiza documentação e configuração do Docker Compose. ## Arquivos e Módulos Afetados - Scraper Go - Run lock / Valkey - Scheduler e pipeline do scraper - Backend administrativo - Configuração do scraper - Docker Compose - Testes Go e backend - Documentação operacional ## Validação - [x] Implementação revisada contra o escopo da PAV-119. - [x] Ajustes solicitados no code review aplicados. - [x] Semântica fail-fast das configurações do run lock validada. - [x] Nenhuma alteração de frontend incluída no escopo. - [ ] CI final do PR de release validado. ## Observações Este PR promove alterações já integradas e revisadas em `develop`. Não realizar squash ou alterações adicionais diretamente em `master` fora do fluxo de release.
hltav
left a comment
There was a problem hiding this comment.
PR fora do padrão de contribuição do projeto.
Antes da revisão técnica, por favor ajuste a descrição conforme o template/documentação do repositório, incluindo card relacionado, objetivo, resumo das alterações, arquivos/módulos afetados, validações executadas e observações relevantes.
Com 24 arquivos alterados e mais de 2 mil linhas adicionadas, precisamos desse contexto para realizar uma revisão segura e rastreável. Após a adequação da PR, seguimos com a revisão do código.
hltav
left a comment
There was a problem hiding this comment.
A implementação está bem encaminhada e cobre boa parte do fluxo da PAV-36, mas como esse PR altera um fluxo sensível de identidade/autenticação, ainda precisamos fechar alguns pontos antes da aprovação.
O principal problema está na relação entre a criação da solicitação de troca e o envio do e-mail de confirmação. Hoje a solicitação é persistida e considerada concluída mesmo quando o módulo centralizado de e-mail não consegue enfileirar a mensagem, porque esse módulo foi originalmente desenhado para tratar falha de envio como não bloqueante. Nesse fluxo específico, porém, o e-mail é parte obrigatória da operação: sem ele o usuário não consegue concluir a troca.
Revise esse comportamento para que a API não sinalize sucesso quando a confirmação não puder ser efetivamente disponibilizada ao usuário. Essa revisão também deve considerar o estado da solicitação já persistida e de eventuais solicitações anteriores invalidadas.
Além disso, gostaria que fossem revisados os cenários de concorrência do fluxo. Em especial, precisamos garantir consistência quando houver solicitações simultâneas para o mesmo novo e-mail, múltiplas solicitações para o mesmo usuário e concorrência entre confirmação de token e criação de uma nova solicitação. O banco e a camada de serviço precisam preservar as invariantes do fluxo também nesses casos.
A cobertura atual contempla bem o happy path, token inválido/expirado e e-mail já utilizado, mas precisa incluir os cenários de falha de infraestrutura e concorrência relevantes para essa feature. Como esse fluxo altera users, credentials e a nova tabela de solicitações dentro do processo de confirmação, gostaria também de cobertura explícita garantindo atomicidade: ou a troca é concluída integralmente, ou o estado anterior permanece consistente.
Por fim, valide o comportamento de sessão após a confirmação da troca de e-mail. Como a identidade persistida é alterada em users e credentials, precisamos garantir que sessões/autenticações existentes continuem com o comportamento definido pelo produto e que não exista inconsistência entre o e-mail exibido, o e-mail usado para login e os dados da sessão após a confirmação.
Com esses pontos tratados e cobertos por testes, o PR fica em condição de aprovação.
Jovinull
commented
Aug 29, 2026
Atualiza??o aplicada em resposta ao review t?cnico:
Valida??o:
Commit: |
Card
Objetivo e escopo
O que foi feito
POST /users/email-changepara solicitar a troca com sessão autenticada.POST /auth/email-change/confirmpara confirmar o token sem exigir sessão./confirmar-email.Módulos afetados
backend/drizzle/0014_panoramic_leopardon.sqlbackend/src/modules/users/emailChange.service.tsbackend/src/routes/auth.routes.tsbackend/src/routes/users.routes.tsbackend/src/modules/email/templates/emailChangeConfirmation.tsxfrontend/src/domains/new_dashboard/components/profile/EmailChangeForm.tsxfrontend/src/domains/auth/presentation/pages/ConfirmEmailChangePage.tsxValidação
npm exec --workspace=backend vitest run tests/integration/routes/auth.routes.test.ts tests/integration/routes/user.routes.test.ts tests/unit/modules/email/email.service.test.ts tests/unit/modules/users/emailChange.service.test.ts- 4 arquivos e 67 testes aprovados.npm exec --workspace=frontend vitest run tests/unit/new_dashboard/emailChange.test.tsx- 1 arquivo e 3 testes aprovados.npm run lint --workspace=frontend- concluído sem erros.npm run build --workspace=frontend- concluído com sucesso./confirmar-emailsem token, validei a mensagem de link inválido e a navegação para o login.Riscos e observações
0014_panoramic_leopardon.sqlprecisa ser aplicada antes de disponibilizar o fluxo.