Skip to content

feat(squads): adiciona MarkExMember para saída/remoção de membro - #494

Open
reag-dev wants to merge 1 commit into
feat/squadsfrom
feat/squad-mark-ex-member
Open

feat(squads): adiciona MarkExMember para saída/remoção de membro#494
reag-dev wants to merge 1 commit into
feat/squadsfrom
feat/squad-mark-ex-member

Conversation

@reag-dev

Copy link
Copy Markdown

Materializa a Action MarkExMember, consumindo a SquadPolicy já registrada em CONTEXT.md, para fechar o ciclo de saída/remoção de membro do squad.

  • handle(User $actor, Squad $squad, User $subject, ?string $reason = null): SquadMember — autoriza via SquadPolicy::authorize() (capitão/vice-capitão do próprio squad, ou super-admin)
  • Localiza a linha ativa do subject no squad (lockForUpdate); sem membership ativa, lança NotAnActiveSquadMember
  • Atualiza role => ex_member e left_at => now() na mesma transação
  • Grava o evento MembershipAction::Leave na trilha de auditoria via RecordMembershipEvent
  • Como Squad::captain() resolve o capitão direto do pivot (role = captain), marcar o capitão como ex_member libera a vaga automaticamente, sem lógica extra

Plano de testes

  • MarkExMemberTest.php — 7 cenários (captain/sub-captain/super-admin marcam, membro comum não pode, capitão marcado libera vaga, subject sem membership ativa, subject já ex_member), 7/7 verdes
  • Suite completa de app-modules/squads — 40/40 verdes
  • Pint limpo nos arquivos modificados

Closes #359

Closes #359

## O que muda

Adiciona a Action `MarkExMember`, que registra a saída ou remoção de um
membro de um squad, marcando-o como `ex_member`.

### Como funciona

- Autorização via `SquadPolicy::authorize()` (capitão/vice-capitão do
próprio squad, ou super-admin)
- Localiza a linha ativa do subject no squad (`lockForUpdate`); sem
membership ativa, lança `NotAnActiveSquadMember`
- Atualiza `role => ex_member` e `left_at => now()` na mesma transação
- Grava o evento `MembershipAction::Leave` na trilha de auditoria via
`RecordMembershipEvent`
- Como `Squad::captain()` resolve o capitão direto do pivot
(`role = captain`), marcar o capitão como `ex_member` libera a vaga
automaticamente, sem lógica extra

### Critérios de aceite

- [x] Marcar `ex_member` seta `role=ex_member` + `left_at` + evento
- [x] `ex_member` não conta na exclusividade (nenhuma checagem de
exclusividade existe ainda no módulo; o estado persistido já fica
correto para quando ela for implementada)
- [x] Autorização via `SquadPolicy`
- [x] Marcar o capitão deixa vaga (sem capitão ativo)
- [x] Teste
@reag-dev
reag-dev requested a review from a team August 16, 2026 14:52
@stherzada stherzada linked an issue Aug 17, 2026 that may be closed by this pull request
5 tasks
@stherzada stherzada added this to the Squads milestone Aug 17, 2026
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.

feat(squads): MarkExMember (saída/remoção)

5 participants