Pular para o conteúdo principal

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

depends_on: SPEC-DOMAIN-AUTH-001, SPEC-DOMAIN-TERRITORY-001

used_by: IS-MVP-01.1, IS-MVP-04.1, IS-MVP-04.2, IS-MVP-04.3

Times

Entidade central do ecossistema, com identidade pública, gestão, elenco, jogos, torcidas e carteira.

Objetivo e limites

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

Incluído no MVP

  • Criação por usuário autenticado.
  • Página pública completa.
  • Categorias como tags do mesmo time.
  • Vínculos de jogadores ativos, convidados e ex-atletas.
  • Múltiplas torcidas aprovadas pelo time.
  • Carteira, apoio e até três patrocinadores ativos.
  • Identidade visual básica e posts oficiais.

Fora do MVP

  • Subtimes independentes por categoria.
  • Reserva de campo.
  • Loja integrada.
  • Aceitar amistosos com agenda automática.
  • Gestão profissional de contratos.

Atores e responsabilidades

AtorResponsabilidade
VisitanteLê página, jogos, elenco público e patrocinadores.
TorcedorSegue, torce, apoia e compartilha.
JogadorAceita convite e aparece conforme privacidade.
Gestor esportivoAdministra categorias, elenco e partidas.
Gestor de mídiaAdministra identidade e posts.
Gestor financeiroVê carteira, patrocínios e transferências.
Responsável principalControla todas as permissões e propriedade.

Conceitos canônicos

Team

Agregado que concentra identidade e relações esportivas.

TeamCategory

Tag/categoria no mesmo time; jogador pode atuar em várias.

Vínculo entre time e jogador cadastrado ou convidado.

Cheer

Apoio público; cria follow.

Loyal Supporter

Usuário que torce para apenas um time de várzea.

Invariantes

  • Time possui um único primary_owner no MVP.
  • Time possui districtId obrigatório e neighborhood compatível quando informado.
  • Slug público é único e preserva redirects após alteração.
  • Categorias não criam outra torcida, carteira ou página principal.
  • Jogador cadastrado só vira active após aceite, salvo se já ativo e regra de campeonato permitir escalação.
  • Convidado não confirmado não alimenta histórico público pessoal.
  • Torcer sempre cria follow; deixar de seguir não remove cheer sem confirmação explícita.
  • Time tem no máximo três patrocínios ativos/reservados simultaneamente.
  • Carteira nunca é sacável.

Estados

EstadoSignificadoVisibilidade/efeito
activeTime operacionalPágina e gestão normais.
inactiveSem atividade atualPágina preservada com aviso.
abandonedSem gestão reconhecidaPágina pode ser reivindicada.
closedAtividades encerradasHistórico preservado, gestão limitada.
under_reviewEm análisePode exibir aviso; ações sensíveis limitadas.
suspendedBloqueadoPágina limitada/indisponível conforme gravidade.
duplicated_mergedUnificado a outroRota redireciona ao time canônico.

Transições permitidas

OrigemAçãoDestinoAutoridadeEfeitos
createactiveUsuário autenticadoCria primary_owner, página e wallet.
activemark_inactiveinactivePrimary owner/operaçãoMantém histórico.
active/inactivemark_abandonedabandonedOperaçãoAbre reivindicação.
abandonedapprove_claimactiveOperaçãoTransfere primary_owner.
active/inactivecloseclosedPrimary owner/operaçãoBloqueia novas partidas/vínculos.
anysuspendsuspendedOperaçãoSuspende ações e registra motivo.
active/inactive/abandonedmergeduplicated_mergedOperaçãoMigra referências e redirects.

Permissões

Permission keyQuem recebe por padrãoAção protegidaAuditoria
team.viewManagementViewer e gestoresAbrir painelNão
team.editProfileAdmin/MediaEditar identidade e dados públicosSim
team.manageCategoriesSports/AdminCriar e ordenar categoriasSim
team.manageSquadSquad/Sports/AdminConvidar, encerrar e gerir vínculosSim
team.manageMatchesSports/AdminCriar e administrar partidasSim
team.managePostsMedia/AdminPublicar e aprovar sugestõesSim
team.manageWalletFinancial/AdminVer extrato e usar créditosSim
team.manageSponsorsFinancial/AdminContratar/editar patrocinadoresSim
team.manageManagersAdmin/Primary ownerGerir acessosSim
team.transferOwnershipPrimary ownerTransferir responsabilidadeSim

Fluxos funcionais

Criação do time

  1. Usuário autenticado informa nome, distrito, slug sugerido e categorias iniciais.
  2. Backend valida duplicidade por slug/nome/território.
  3. Time é criado active.
  4. Criador recebe membership primary_owner.
  5. Wallet vazia é criada.
  6. Página pública fica disponível imediatamente e pode ser denunciada.

Convite de jogador cadastrado

  1. Gestor com team.manageSquad busca jogador.
  2. Cria TeamPlayerLink invited com categorias propostas.
  3. Jogador recebe notificação.
  4. Ao aceitar, link vira active e passa a aparecer conforme privacidade.
  5. Ao rejeitar, link vira rejected e não entra no elenco.

Adição de convidado não cadastrado

  1. Gestor registra nome de exibição e dados privados mínimos.
  2. Link guest é criado.
  3. Convidado pode ser relacionado em amistosos/festivais/desafios.
  4. Se futuramente reivindicado e confirmado, histórico elegível é associado.

Encerramento de vínculo

  1. Jogador ou gestor solicita encerramento.
  2. Sistema verifica partidas/campeonatos em andamento sem bloquear histórico.
  3. Link vira former com endedAt.
  4. Perfil público pode ocultar ex-times conforme privacidade do jogador.

Torcer

  1. Usuário autenticado confirma apoio público.
  2. Cheer é criado e follow garantido.
  3. Métricas do time e status de loyal supporter são recalculados.

Aprovação de torcida

  1. Torcida criada fica pending_team_approval.
  2. Gestor do time recebe pendência.
  3. Ao aprovar, torcida pode operar publicamente e trocar créditos com o time.

Casos-limite e erros

CenárioComportamento esperadoCódigo/estado
Slug em usoSugerir alternativa e impedir criaçãoTEAM_SLUG_TAKEN
Time duplicadoOrientar reivindicação ou denúnciaTEAM_POSSIBLE_DUPLICATE
Neighborhood incompatívelRejeitarNEIGHBORHOOD_DISTRICT_MISMATCH
Último primary owner tenta sairBloquear até transferirPRIMARY_OWNER_REQUIRED
Jogador já ativoNão duplicar vínculo; permitir atualização de categoriasPLAYER_ALREADY_ACTIVE
Patrocínio lotadoNão criar checkout enquanto três slots ativos/reservadosSPONSOR_LIMIT_REACHED
Time suspensoBloquear gestão e ações financeirasTEAM_SUSPENDED

Privacidade e exposição pública

  • Página pública nunca mostra saldo, extrato, permissões ou dados privados de convidados.
  • Contatos do time possuem configuração de visibilidade.
  • Elenco respeita privacidade de cada jogador.
  • Apoiadores públicos aparecem sem valor e até o limite configurado.
  • Patrocinadores exibem apenas conteúdo aprovado.

Notificações e auditoria

  • Convites e respostas de jogadores.
  • Pedidos e aprovação de torcidas.
  • Resultados aguardando validação.
  • Contestações e retificações.
  • Entradas/expirações/transferências de créditos para gestores financeiros.
  • Mudanças de gestores e ownership.
  • Audit log para identidade, vínculos, jogos, financeiro e permissões.

API relacionada

MétodoRotaAcessoFinalidade
POST/api/v1/teamsAutenticadoCriar time
GET/api/v1/teams/:slugPúblicoPágina pública
PATCH/api/v1/teams/:idteam.editProfileEditar
GET/api/v1/teams/:id/management-summaryGestãoResumo
POST/api/v1/teams/:id/categoriesteam.manageCategoriesCriar categoria
POST/api/v1/teams/:id/player-invitesteam.manageSquadConvidar jogador
POST/api/v1/teams/:id/guest-playersteam.manageSquadAdicionar convidado
PATCH/api/v1/teams/:id/player-links/:linkIdteam.manageSquadAlterar/encerrar vínculo
POST/api/v1/teams/:id/cheerAutenticadoTorcer
POST/api/v1/followsAutenticadoSeguir
GET/api/v1/teams/:id/torcidasPúblicoListar torcidas
POST/api/v1/teams/:id/torcidas/:torcidaId/approveteam.manageTorcidasAprovar torcida

Contratos compartilhados

  • TeamEntity
  • PublicTeamDto
  • TeamManagementDto
  • TeamSummaryDto
  • CreateTeamRequest/Response
  • UpdateTeamRequest
  • TeamCategoryDto
  • TeamPlayerLinkDto
  • InvitePlayerRequest
  • CreateGuestPlayerRequest
  • CheerTeamResponse

Requisitos de UX

  • Página pública detalhada com identidade, ações, jogos, ranking, stats, categorias, elenco, torcidas, apoiadores, sponsors e feed.
  • Painel de gestão separado em seções: dashboard, elenco, jogos, súmulas, publicações, torcidas, carteira, patrocínios, identidade, permissões e configurações.
  • Ações sem permissão aparecem desabilitadas com explicação.
  • Time abandoned/inactive/closed exibe aviso e ações compatíveis.
  • Mobile prioriza ações e jogos; desktop amplia navegação e informações laterais.

Comportamento dos mocks

  • Times em estados active, inactive, abandoned, suspended e merged.
  • Elenco com active, invited, guest e former.
  • Mutations de cheer/follow, convite, aceite, categorias e identidade alteram banco em memória.
  • Cenários de wallet vazia, sponsor lotado e permissões insuficientes.

Critérios de aceite

  • Criação gera owner, wallet e página pública.
  • Categorias permanecem no mesmo time.
  • Vínculo cadastrado exige aceite.
  • Guest não aparece como histórico público confirmado.
  • Torcer gera follow.
  • Gestão respeita permissions e status.
  • DTO público não vaza financeiro ou acessos.

Testes obrigatórios

  • Criação e duplicidade.
  • Membership primary_owner.
  • Categorias e validação territorial.
  • Convite/aceite/rejeição/encerramento.
  • Guest confirmation.
  • Cheer/follow/loyal supporter.
  • Status abandoned/closed/suspended/merged.
  • Limite de patrocinadores.

Pós-MVP

  • Agenda “aceita amistosos”.
  • Subpáginas independentes por categoria se evidência justificar.
  • Loja e produtos.
  • Gestão de contratos e mensalidades.

Decisões registradas

  • Time é entidade central do MVP.
  • Categorias são tags do mesmo time.
  • Qualquer autenticado pode criar; criador vira primary_owner.
  • Time possui wallet e sponsors; campeonato, campo e serviço não.
  • Página pública é imediata e moderada por denúncia.

Machine summary

spec: SPEC-DOMAIN-TEAM-001
domain: Times
must_preserve:
- Time possui um único primary_owner no MVP.
- Time possui districtId obrigatório e neighborhood compatível quando informado.
- Slug público é único e preserva redirects após alteração.
- Categorias não criam outra torcida, carteira ou página principal.
- Jogador cadastrado só vira active após aceite, salvo se já ativo e regra de campeonato permitir escalação.
- Convidado não confirmado não alimenta histórico público pessoal.
- Torcer sempre cria follow; deixar de seguir não remove cheer sem confirmação explícita.
- Time tem no máximo três patrocínios ativos/reservados simultaneamente.
touches:
- contracts
- mocks
- api
- frontend
- backend
- tests
- documentation