Pular para o conteúdo principal

Status: Approved · v2 · SPEC-API-TEAM-TORCIDA-001

depends_on: SPEC-DOMAIN-TEAM-001, SPEC-DOMAIN-TORCIDA-001, SPEC-DOMAIN-PERMISSION-001

used_by: IS-MVP-04.1, IS-MVP-04.2, IS-MVP-04.3, IS-MVP-04.4, IS-MVP-04.5, IS-MVP-05.2, IS-MVP-08.1, IS-MVP-08.2

API de gestão de times e torcidas

Casos de uso administrativos completos, respeitando vínculos, categories, aprovação e permission keys.

Princípios e padrões

  • Base path /api/v1; JSON UTF-8; chaves em camelCase.
  • Toda resposta usa ApiResponse<T> com ok, data|error e meta contendo requestId e timestamp.
  • IDs são strings opacas; datas são ISO-8601 UTC; dinheiro é inteiro em centavos com moeda BRL.
  • Listas usam page e pageSize no MVP; default 20, máximo 100; metadados ficam em meta.pagination.
  • Endpoints públicos usam DTOs públicos específicos; entidades internas, memberships, saldos e dados privados nunca vazam.
  • Erros de domínio são estáveis e acionáveis; stack traces e detalhes internos não são retornados.
  • Alterações sensíveis usam Idempotency-Key, confirmação recente quando necessário e audit log.
  • Uploads usam fluxo presigned; o backend valida propósito, MIME, tamanho e ownership antes de confirmar o asset.

Endpoints

MétodoRotaAcessoRequestResponseRegras principais
POST/teamsAutenticadoCreateTeamRequestCreateTeamResponseCriador vira primary_owner; district obrigatório.
PATCH/teams/:teamIdteam.editProfileUpdateTeamRequestTeamManagementResponseSlug/território/identity auditados.
GET/teams/:teamId/management-summaryMembershipTeamManagementSummaryResponseDados por permission.
POST/teams/:teamId/categoriesteam.manageCategoriesCreateCategoryRequestTeamCategoryResponseTag do mesmo time.
PATCH/teams/:teamId/categories/:categoryIdteam.manageCategoriesUpdateCategoryRequestTeamCategoryResponseNão remove histórico.
GET/teams/:teamId/player-linksteam.viewSquadPlayerLinkQueryTeamPlayerLinksResponseActive/invited/guest/former.
POST/teams/:teamId/player-invitesteam.manageSquadInvitePlayerRequestTeamPlayerLinkResponseCadastrado precisa aceitar.
POST/teams/:teamId/gueststeam.manageSquadCreateGuestPlayerRequestTeamPlayerLinkResponseDados privados mínimos.
POST/team-player-links/:linkId/respondJogador alvoRespondPlayerInviteRequestTeamPlayerLinkResponseAccept/reject.
POST/team-player-links/:linkId/endJogador ou team.manageSquadEndPlayerLinkRequestTeamPlayerLinkResponseVira former.
GET/teams/:teamId/torcida-requeststeam.manageTorcidasTorcidaRequestsResponsePending approvals.
POST/teams/:teamId/torcida-requests/:torcidaId/approveteam.manageTorcidasDecisionReasonRequestTorcidaLinkResponseAprova existência.
POST/torcidasAutenticadoCreateTorcidaRequestCreateTorcidaResponseOwner + wallet + pending team approval.
PATCH/torcidas/:torcidaIdtorcida.editProfileUpdateTorcidaRequestTorcidaManagementResponseDados públicos.
GET/torcidas/:torcidaId/memberstorcida.manageMembersMembershipQueryTorcidaMembersResponseFila e ativos.
POST/torcidas/:torcidaId/joinAutenticadoJoinTorcidaRequestTorcidaMemberResponseConforme join mode.
POST/torcidas/:torcidaId/members/:memberId/approvetorcida.manageMembersDecisionReasonRequestTorcidaMemberResponseAtiva vínculo.

Autenticação e autorização

  • Toda rota de gestão exige membership active e permission adequada.
  • Primary owner actions usam auth recente/confirmation.
  • Gestor do time não recebe automaticamente acesso da torcida aprovada.

Erros de domínio

CódigoHTTPQuando ocorreAção esperada no cliente
DISTRICT_MISMATCH422Neighborhood/time fora do distritoCorrigir território.
PLAYER_ALREADY_LINKED409Active/invited existenteAbrir vínculo atual.
PLAYER_NOT_INVITABLE409Jogador retired ou perfil não ativoBuscar outro jogador.
PLAYER_INVITE_EXPIRED410Convite expiradoSolicitar novo.
INVITE_ALREADY_RESOLVED409Convite já aceito/rejeitadoAtualizar.
PLAYER_RETIRED409Jogador aposentado tenta aceitar conviteBloquear; ver SPEC-DOMAIN-PLAYER-001.
TORCIDA_NOT_APPROVED409Ação pública/financeira antes de aprovaçãoMostrar checklist.
MANAGER_LIMIT_REACHED409Limite recomendado/duro configuradoRemover ou revisar acessos.

Idempotência e concorrência

  • Create team/torcida/invite/guest/end/approve usam idempotência para evitar duplicação por retry.
  • Vínculos usam versão para evitar duas decisões simultâneas.

Auditoria e efeitos colaterais

  • Mudanças de identidade, categorias, vínculos, aprovação e ownership geram audit log.
  • Convites e decisões geram notifications pessoais/gestão.

Exemplos

createTeam

{
"name": "Unidos do 6",
"districtId": "district_001",
"neighborhoodId": "neighborhood_001",
"categories": [
{
"name": "Principal"
}
]
}

invitePlayer

{
"playerId": "player_004",
"categoryIds": [
"cat_001"
],
"message": "Chega junto para o próximo jogo."
}

Mocks

  • Handlers stateful para categorias e player links.
  • Cenários pending/rejected/approved torcida.
  • Permissions variam por role.

Testes obrigatórios

  • Creator becomes owner.
  • District mismatch.
  • Invite accept/reject/expire.
  • Guest privacy.
  • End link former.
  • Torcida approval independent management.

Critérios de aceite

  • Fluxo completo de elenco e torcida sem bypass.
  • Nenhum endpoint cria subtime por categoria.
  • Todos os efeitos são refletidos nos mocks.

Machine summary

spec: SPEC-API-TEAM-TORCIDA-001
api_group: API de gestão de times e torcidas
base_path: /api/v1
response_envelope: ApiResponse<T>
ids: string
dates: ISO-8601
money: integer_cents