Skip to content

feat(onboarding): cadeia de pré-requisito Welcome => Squads (#351) - #475

Merged
danielhe4rt merged 1 commit into
he4rt:feat/squadsfrom
cristopherpds:feat/351-onboarding-prerequisite-chain
Aug 10, 2026
Merged

feat(onboarding): cadeia de pré-requisito Welcome => Squads (#351)#475
danielhe4rt merged 1 commit into
he4rt:feat/squadsfrom
cristopherpds:feat/351-onboarding-prerequisite-chain

Conversation

@cristopherpds

Copy link
Copy Markdown
Contributor

Contexto

O onboarding Squads (APTO) não pode ser iniciado por quem ainda não concluiu o onboarding Welcome — essa é a cadeia de pré-requisito inter-tipo prevista no PRD (#341). Até então, SquadsOnboardingFlow::prerequisites() retornava [] (com um TO-DO: #351) e o StartOnboarding não validava nada, permitindo iniciar o Squads sem o Welcome concluído.

Este PR implementa a cadeia: o flow do Squads declara [Welcome] como pré-requisito e o StartOnboarding valida cada pré-requisito através do gate público OnboardingCompletionGate::isCompleted() (#349) antes de qualquer escrita. Quando o pré-requisito não está completed, o início é bloqueado com uma PrerequisiteNotMetException que carrega o tipo bloqueado e o pré-requisito faltante como motivo — nenhum onboarding órfão é persistido.

Alterações

  • src/Flows/SquadsOnboardingFlow.phpprerequisites() passa a retornar [OnboardingType::Welcome].
  • src/Actions/StartOnboarding.php — recebe o OnboardingCompletionGate por injeção e valida os pré-requisitos do flow antes da transação; classe agora é final readonly.
  • src/Exceptions/PrerequisiteNotMetException.phpnova exception com type e prerequisite públicos (o motivo do bloqueio), no mesmo estilo da GateBlockedException.
  • database/factories/OnboardingFactory.php — novo state completed() para os testes.
  • tests/Feature/OnboardingPrerequisiteChainTest.phpnovo teste cobrindo os cenários BDD da issue: Squads sem Welcome é bloqueado com o motivo (inclusive com Welcome apenas in_progress), Welcome concluído destrava o Squads, e Welcome segue sem pré-requisitos.
  • tests/Feature/SquadsOnboardingFlowTest.php — atualizado: prerequisites() agora esperado como [Welcome] e os testes que iniciam Squads concluem o Welcome antes.

Critérios de aceite

  • prerequisites() do Squads = [Welcome]
  • Iniciar Squads sem Welcome concluído é bloqueado com motivo
  • Iniciar Squads com Welcome concluído funciona
  • Teste da cadeia

Plano de Testes

  • Executar make check (Rector, Pint e PHPStan passando)
  • Executar make test — módulo onboarding: 35/35 testes passando
  • Suíte completa: 949/951 — as 2 falhas são em MergeDuplicateDiscordProfilesTest (módulo integration-discord) e pré-existentes: reproduzem de forma idêntica na base feat/squads (8ab4cce0) sem este commit. Este PR toca apenas app-modules/onboarding, sem código compartilhado com esse teste
  • Revisor: conferir que os cenários BDD da issue feat(onboarding): cadeia de pré-requisito (Welcome ⇒ Squads) #351 correspondem aos testes de OnboardingPrerequisiteChainTest"

Issues Relacionadas

Closes #351
Related to #341

SquadsOnboardingFlow::prerequisites() passa a declarar [Welcome] e
StartOnboarding valida os pré-requisitos via OnboardingCompletionGate
antes de qualquer escrita, lançando PrerequisiteNotMetException com o
tipo bloqueado e o pré-requisito faltante como motivo.
@cristopherpds
cristopherpds requested a review from a team August 4, 2026 10:17
@fernanduandrade fernanduandrade added the mod:squads Squad lifecycle, membership and governance label Aug 7, 2026

@BrunaDomingues BrunaDomingues 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.

LGTM!

@sirelves sirelves 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.

Implementação está correta e no tamanho certo do problema: os pré-requisitos são
validados antes da transação (nenhum onboarding órfão), a exception carrega o
type e o prerequisite como motivo, e o throw_unless com named args segue o
mesmo padrão que já existe no createNextStep do Squads. Nada de camada nova pra
resolver isso, que era o risco aqui.

Deixei um comentário num teste, é uma linha e não trava o merge.

Sobre os outros testes que usam ->completed()->create() sem dizer o tipo: não me
preocupa. Se o default do factory mudar, eles falham em vez de passar errado, que
é o comportamento que a gente quer. Fica como preferência: um
['type' => OnboardingType::Welcome] explícito faria o cenário se ler no próprio
teste, sem precisar abrir o factory.

Aproveitando: cheguei a levantar se a validação no handle poderia bloquear um
Squads que já existe, já que o firstOrCreate fazia o método ser idempotente. Fui
olhar e o OnboardingStatus::Completed é terminal (allowedTransitions() retorna
[]), então um Welcome concluído nunca volta a ficar incompleto e o cenário não é
alcançável. Deixo registrado só pra não ficar a dúvida.

@danielhe4rt
danielhe4rt merged commit df5472b into he4rt:feat/squads Aug 10, 2026
8 checks passed

@buzinei-bibi buzinei-bibi left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

lgtm

@stherzada stherzada linked an issue Aug 11, 2026 that may be closed by this pull request
4 tasks
@stherzada stherzada added this to the Onboarding milestone Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

mod:squads Squad lifecycle, membership and governance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(onboarding): cadeia de pré-requisito (Welcome ⇒ Squads)

10 participants