Pular para o conteúdo principal

Status: Approved · v2 · SPEC-API-MATCH-001

depends_on: SPEC-DOMAIN-MATCH-001, SPEC-DOMAIN-PLAYER-001

used_by: IS-MVP-06.1, IS-MVP-06.2, IS-MVP-06.3, IS-MVP-06.4, IS-MVP-06.5

API de partidas, resultados e súmulas

Ciclo completo de criação, agenda, eventos, resultado, validação, contestação e retificação.

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/matchesContextual team/champ permissionCreateMatchRequestMatchManagementResponseDois times; campo ou local livre; data pending opcional.
PATCH/matches/:matchIdmatch.editUpdateMatchRequestMatchManagementResponseRespeita status/authority.
GET/matchesPúblicoMatchSearchQueryMatchesResponseFiltros e paginação.
POST/matches/:matchId/startmatch.manageStartMatchRequestMatchManagementResponseScheduled → in_progress.
POST/matches/:matchId/resultmatch.reportResultReportMatchResultRequestMatchResultResponsePlacar e origem.
POST/matches/:matchId/validateOponente/champ authorityValidateResultRequestMatchResultResponseConsolida stats/ranking.
POST/matches/:matchId/contestElegívelContestResultRequestMatchDisputeResponseMotivo/evidências/prazo.
POST/matches/:matchId/retificationsAuthorityCreateRetificationRequestRetificationResponseAudit e recompute.
GET/matches/:matchId/reportPúblico/gestãoMatchReportResponseView filtrada.
PUT/matches/:matchId/reportmatch.manageReportUpsertMatchReportRequestMatchReportResponseRelacionados/titulares/banco/eventos.
POST/matches/:matchId/eventsmatch.manageReportCreateMatchEventRequestMatchEventResponseGoal/card/substitution.
POST/matches/:matchId/guest-playersmatch.manageReportCreateMatchGuestRequestMatchParticipantResponseGuest no contexto.
DELETE/matches/:matchId/events/:eventIdmatch.manageReportDeleteEventRequestOperationResponseSomente antes do lock ou via retificação.

Autenticação e autorização

  • Autoridade varia entre amistoso e campeonato.
  • Participantes e gestores só veem dados privados necessários.
  • Public report omite documentos e dados de guests.

Erros de domínio

CódigoHTTPQuando ocorreAção esperada no cliente
MATCH_STATE_INVALID409Ação incompatível com statusRecarregar.
RESULT_ALREADY_VALIDATED409Validação já concluídaAbrir resultado.
VALIDATION_NOT_ALLOWED403Usuário/time sem autoridadeExplicar.
CONTEST_WINDOW_CLOSED410Prazo encerradoSuporte/retificação autorizada.
EVENT_INCONSISTENT422Jogador/time/minuto inválidoCorrigir súmula.
FIXTURE_LOCKED409Jogo controlado por campeonatoUsar gestão campeonato.

Idempotência e concorrência

  • Create/report/validate/contest/retification usam idempotência.
  • Validação concorrente consolida uma única vez.
  • Recompute de stats é transacional com alteração validada.

Auditoria e efeitos colaterais

  • Toda transição e mudança de resultado/súmula é auditada.
  • Notifications para times, campeonato e jogadores quando relevante.
  • Auto-validation job registra actor system e regra usada.

Exemplos

result

{
"homeScore": 2,
"awayScore": 1,
"reportedByTeamId": "team_001",
"notes": "Placar conferido com a súmula."
}

event

{
"type": "goal",
"teamId": "team_001",
"playerReference": {
"kind": "registered",
"playerId": "player_004"
},
"minute": 57
}

Mocks

  • Clock e auto-validation determinísticos.
  • Cenários friendly/championship/contested/validated.
  • Eventos alteram report state.

Testes obrigatórios

  • State machine completa.
  • Double validation.
  • Contest windows.
  • Guest stats privacy.
  • Retification recompute.
  • Invalid event.

Critérios de aceite

  • Stats/ranking apenas após validação.
  • Contestados não consolidam.
  • Súmula e resultado permanecem auditáveis.

Machine summary

spec: SPEC-API-MATCH-001
api_group: API de partidas, resultados e súmulas
base_path: /api/v1
response_envelope: ApiResponse<T>
ids: string
dates: ISO-8601
money: integer_cents