Pular para o conteúdo
He4rt / Docs
Toggle sidebar
Interno noindex

Referência técnica — acessível, mas fora dos buscadores.

Discord
Engenharia Leitura · 3 min Squads
Aceito
15/06/2026 documento interno · noindex

Modelo de dados de squads (estado + trilha + exclusividade)

Deciders: danielhe4rt danielhe4rt

Status: Accepted Date: 2026-06-15 Deciders: danielhe4rt Relates to: ADR-0001

Contexto

Sob o modelo de governança como registro (ADR-0001), o squads precisa de um esquema que seja a fonte da verdade do estado (quem é o quê em cada squad) e que carregue uma trilha de auditoria de tudo que muda em membership/papéis (join/leave/promote/demote), tudo tenant-scoped. Algumas invariantes de negócio (capitão único, "1 squad ativo") merecem ser garantidas no banco, não só na aplicação.

Decisão

Quatro tabelas, todas com id UUIDv7 (HasUuids) e tenant_id.

squads

name, slug, objective (text, nullable — draft pode não ter), status (SquadStatus draft/active/inactive/archived, default draft), timestamps.

squad_members (pivot com id próprio)

squad_id, user_id, role (SquadRole captain/sub_captain/member/ex_member), joined_at, left_at (nullable, datado ao virar ExMember), timestamps.

squad_membership_events (append-only)

squad_id, user_id (sujeito), actor_id (nullable; null = sistema), action (MembershipAction), from_role/to_role (SquadRole, nullable), reason (text, nullable), metadata (jsonb, nullable), occurred_at, timestamps.

squad_applications

squad_id, user_id (candidato), status (ApplicationStatus pending/approved/rejected/withdrawn, default pending), message (text, nullable), decided_by (nullable), decided_at (nullable), timestamps.

Enums

SquadStatus, SquadRole, ApplicationStatus, MembershipAction — backed string, cast nos models. PHPDoc @property em todos os models conforme .ai/04-model-phpdoc-sync.

Alternativas consideradas

Consequências

Positivas

Negativas / diferidas

Review trigger

Revisitar se a listagem de squads+capitão virar gargalo (considerar projeção/denormalização), ou se a exclusividade deixar de ser "1 por tenant" (ex.: 1 global, ou N squads por pessoa no futuro).