Skip to content

feat(squads): pivot squad_members + SquadRole + recorder de eventos #355

Description

@danielhe4rt

Parent

#342

O que construir

O pivot de membros, os papéis e o recorder da trilha de eventos (módulo profundo reusado por todas as mutações).

  • Migration squad_members (pivot com id próprio): tenant_id, squad_id, user_id, role, joined_at, left_at; UNIQUE (squad_id, user_id). Model SquadMember (Pivot) + PHPDoc; enum SquadRole (captain/sub_captain/member/ex_member).
  • Migration squad_membership_events (append-only): tenant_id, squad_id, user_id, actor_id (nullable), action, from_role/to_role (nullable), reason (text, nullable), metadata (jsonb, nullable), occurred_at; índices (squad_id, occurred_at) e (user_id, occurred_at). Model + enum MembershipAction.
  • Recorder que grava um evento a cada mutação de membership/papel (usado por S3/S6/S8/S9/S10).

Critérios de aceite

  • Migrations + PHPDoc sincronizado (datas Tz, jsonb)
  • Enums SquadRole e MembershipAction
  • Recorder grava evento com action, from_role/to_role, actor_id, occurred_at
  • Eventos são append-only (nunca update/delete)
  • Teste do recorder

BDD

# language: pt
Funcionalidade: Pivot de membros e trilha de eventos
  Cenário: Recorder registra uma transição
    Dado um squad e um usuário
    Quando ocorre uma mutação de membership (ex.: join)
    Então um squad_membership_event é gravado com action, papéis from/to, ator e occurred_at

  Cenário: A trilha é imutável
    Dado um evento de membership já gravado
    Quando qualquer fluxo do módulo é executado
    Então o evento existente nunca é atualizado nem removido

Bloqueada por

Metadata

Metadata

Assignees

Labels

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions