Pular para o conteúdo principal

Status: Approved · v2 · SPEC-DOMAIN-PERMISSION-001

depends_on: SPEC-DOMAIN-AUTH-001

used_by: IS-MVP-04.6, IS-MVP-08.3, IS-MVP-14.3, IS-MVP-16.1

Gestão e permissões

Modelo de memberships, funções fixas, permissões positivas e responsabilidade principal por entidade.

Objetivo e limites

Esta especificação define o comportamento canônico do domínio Gestão e permissões no RaizFC. Ela deve ser consultada antes de alterar contratos, mocks, endpoints, telas, permissões ou Increment Specifications relacionados.

Incluído no MVP

  • Entidades team, torcida, championship, field e service.
  • Um primary_owner.
  • Roles fixas e overrides manuais por usuário.
  • Permissões positivas somadas.
  • Convite e aceite.
  • Máximo recomendado de 10 gestores.
  • Audit log de ações sensíveis.

Fora do MVP

  • Co-owners.
  • Policies dinâmicas.
  • Roles customizáveis salvas.
  • Herança entre entidades.
  • ABAC completo.

Atores e responsabilidades

AtorResponsabilidade
Responsável principalControle total e propriedade.
AdministradorGestão ampla, exceto ações exclusivas.
Gestores especializadosFinanceiro, mídia, esportivo, elenco, eventos.
VisualizadorLeitura de gestão.
Convidado de gestãoAceita/rejeita membership.
OperaçãoRecuperação e auditoria excepcional.

Conceitos canônicos

ManagementMembership

Relação user-entity com role e overrides.

ManagementRole

Template fixo de permissões.

PermissionKey

Ação granular, como team.manageSquad.

Primary Owner

Membership exclusiva e obrigatória.

Override

Adição ou remoção manual de permission key.

Invariantes

  • Toda entidade gerenciável ativa possui exatamente um primary_owner.
  • Primary owner possui todas as permissions e não pode ser negado por override.
  • Membership pending não concede acesso.
  • Permissões são avaliadas no backend.
  • Usuário pode gerir múltiplas entidades.
  • Jogador não é ManageableEntityType.
  • Último full-access não deve ser removido sem confirmação e owner preservado.
  • Convite expira e é idempotente.
  • Ações exclusivas do owner não podem ser delegadas no MVP.

Estados

EstadoSignificadoVisibilidade/efeito
pendingConvite enviadoSem acesso.
activeMembership ativaAcesso por role/overrides.
rejectedConvite rejeitadoSem acesso.
expiredPrazo encerradoSem acesso.
revokedAcesso removidoHistórico preservado.

Transições permitidas

OrigemAçãoDestinoAutoridadeEfeitos
invitependingManager autorizadoNotifica convidado.
pendingacceptactiveConvidadoConcede acesso.
pendingrejectrejectedConvidadoRegistra.
pendingexpireexpiredJobEncerra.
activeupdate_roleactiveManager autorizadoRecalcula permissions.
activerevokerevokedManager autorizadoRevoga imediatamente.
active ownertransfer_ownershipactive new owner + active/revoked oldPrimary ownerTransação atômica.

Permissões

Permission keyQuem recebe por padrãoAção protegidaAuditoria
management.viewViewer+Abrir gestãoNão
management.manageManagersAdmin/OwnerConvidar/editar/removerSim
management.viewAuditAdmin/Owner e roles permitidasAudit logsNão
management.transferOwnershipOwnerTransferir ownershipSim
management.deleteEntityOwnerExcluir/encerrar conforme domínioSim

Fluxos funcionais

Convite

  1. Gestor informa e-mail/contato ou seleciona usuário.
  2. Escolhe role e optional overrides.
  3. Sistema valida limite e permission.
  4. Cria pending com expiração.
  5. Usuário aceita e membership vira active.

Cálculo de permissão

  1. Carrega active membership.
  2. Se owner, concede tudo.
  3. Caso contrário, carrega role template.
  4. Soma grants manuais.
  5. Remove denies manuais permitidos.
  6. Valida status da entidade e contexto do recurso.

Transferência de ownership

  1. Owner escolhe gestor active ou convida novo.
  2. Confirma ação crítica.
  3. Backend revalida autenticação recente.
  4. Em transação, promove novo owner e rebaixa/revoga anterior conforme opção.
  5. Registra auditoria e notifica todos.

Casos-limite e erros

CenárioComportamento esperadoCódigo/estado
Sem membershipNegarPERMISSION_REQUIRED
Membership pendingNegarMANAGEMENT_INVITE_PENDING
Remover ownerBloquearPRIMARY_OWNER_REQUIRED
11º gestorAvisar/bloquear conforme limite configuradoMANAGER_LIMIT_REACHED
Override inválido para entidadeRejeitarINVALID_PERMISSION_KEY
Convite duplicadoRetornar existente ativo/pendingMANAGEMENT_INVITE_EXISTS

Privacidade e exposição pública

  • DTO público nunca inclui memberships/permissions.
  • Lista de gestores é privada, salvo nomes públicos definidos pela entidade.
  • Audit log só aparece a usuários autorizados.
  • Convite por e-mail não expõe existência de conta para terceiros.

Notificações e auditoria

  • Convite, aceite, rejeição e expiração.
  • Mudança de role/overrides.
  • Revogação.
  • Transferência de ownership.
  • Ações críticas produzem AuditLog com actor, entity, action, before/after e requestId.

API relacionada

MétodoRotaAcessoFinalidade
GET/api/v1/management/my-entitiesAutenticadoEntidades geridas
GET/api/v1/management/:type/:id/managersmanagement.manageManagers/viewListar
POST/api/v1/management/:type/:id/managers/invitemanagement.manageManagersConvidar
POST/api/v1/management/invites/:id/respondConvidadoResponder
PATCH/api/v1/management/:type/:id/managers/:membershipIdmanagement.manageManagersEditar
DELETE/api/v1/management/:type/:id/managers/:membershipIdmanagement.manageManagersRevogar
POST/api/v1/management/:type/:id/transfer-primary-ownerOwnerTransferir
POST/api/v1/permissions/checkAutenticadoChecar permission
GET/api/v1/management/:type/:id/audit-logsPermissãoAuditoria

Contratos compartilhados

  • ManageableEntityType
  • ManagementMembershipDto
  • ManagementRole
  • PermissionKey
  • PermissionOverrideDto
  • InviteManagerRequest
  • TransferPrimaryOwnerRequest
  • PermissionCheckResponse
  • AuditLogDto

Requisitos de UX

  • Minha Gestão lista entidades agrupadas por tipo; não vira dashboard geral pesado.
  • Ações sem permission ficam visíveis e desabilitadas quando ajudam descoberta.
  • Editor de role mostra resumo legível, não lista crua de keys por padrão.
  • Ownership tem confirmação extra e explica irreversibilidade.

Comportamento dos mocks

  • Usuário com múltiplas memberships.
  • Roles e overrides.
  • Convites pending/expired.
  • Revogação imediata.
  • Owner transfer in-memory.

Critérios de aceite

  • Backend é autoridade.
  • Owner único e obrigatório.
  • Roles fixas com overrides.
  • Convite exige aceite.
  • Jogador não é gerenciável.
  • Audit log em ações críticas.

Testes obrigatórios

  • Permission resolution.
  • Overrides.
  • Invite lifecycle.
  • Manager limit.
  • Owner transfer atomic.
  • Revoke.
  • Status da entidade.

Pós-MVP

  • Co-owners.
  • Roles customizadas.
  • Policies condicionais.
  • Delegação temporária.

Decisões registradas

  • Modelo inspirado em GitHub: funções fixas e ajustes manuais.
  • Permissões positivas somam; restrições via override.
  • Máximo recomendado 10.
  • Um primary owner por entidade.

Machine summary

spec: SPEC-DOMAIN-PERMISSION-001
domain: Gestão e permissões
must_preserve:
- Toda entidade gerenciável ativa possui exatamente um primary_owner.
- Primary owner possui todas as permissions e não pode ser negado por override.
- Membership pending não concede acesso.
- Permissões são avaliadas no backend.
- Usuário pode gerir múltiplas entidades.
- Jogador não é ManageableEntityType.
- Último full-access não deve ser removido sem confirmação e owner preservado.
- Convite expira e é idempotente.
touches:
- contracts
- mocks
- api
- frontend
- backend
- tests
- documentation