Endpoints de partidas API
Esta coleção contém endpoints para gerenciar partidas (matches) — criar partidas, listar, obter, atualizar, apagar e controlar inscrições e trocas de time. Todos os endpoints requerem autenticação JWT via header Authorization: Bearer <token> (os handlers usam middleware auth).
Base URL: http://localhost:4000
Guia de Uso Geral
- Utilize os endpoints para criar, atualizar, listar, obter e deletar partidas, além de endpoints para inscrever/desinscrever jogadores e trocar de time (switch).
- Sempre envie o token JWT no header
Authorization. - Os esquemas de validação são aplicados nos endpoints (Zod): verifique formato de UUIDs, tamanho mínimo de campos e paginação (limit/page).
Endpoints disponíveis
- Create_match: Cria uma nova partida.
- Get_match: Busca uma partida por id.
- List_matches: Lista partidas (paginação).
- Update_match: Atualiza uma partida existente.
- Delete_match: Remove uma partida.
- Subscribe: Inscrever usuário em uma partida.
- Unsubscribe: Remover inscrição do usuário.
- Switch_team: Troca o usuário de time dentro da inscrição.
POST Create_Match
POST http://localhost:4000/match/
Descrição:
Cria uma partida com os dados fornecidos e retorna os dados da partida criada.
Headers obrigatórios:
- Authorization: Bearer <token>
Body (JSON) - campos principais (validação via Zod presente em match.validation.ts):
userId(string, UUID) — obrigatório — id do autor/usuário que cria a partida.title(string) — obrigatório, mínimo 3 caracteres.description(string) — opcional/mínimo 2 caracteres quando presente.maxPlayers(int) — obrigatório, número máximo de jogadores.MatchDate(DateTime / ISO8601) — obrigatório — data da partida.location(string) — obrigatório.teamNameA(string) — opcional, defaultTIME_A.teamNameB(string) — opcional, defaultTIME_B.
Respostas esperadas:
201 Created: Retorna o objeto de Match (id, title, description, authorId, maxPlayers, MatchDate, MatchStatus, location, createdAt, updatedAt, players[] etc.).400 Bad Request: campos obrigatórios ausentes ou inválidos.401 Unauthorized: token JWT ausente/inválido.403 Forbidden: usuário sem permissão.404 Not Found: author (user) não encontrado (se aplicável).
Exemplo de uso:
Request:
POST http://localhost:4000/match/
Headers:
Authorization: Bearer <token>
Body (JSON):
{
"author": "{ "id": "a8f1b2c3-....", "name": ..., ...}",
"title": "Pelada de Domingo",
"description": "Partida amistosa - todos são bem-vindos",
"maxPlayers": 10,
"MatchDate": "2025-11-15T10:00:00.000Z",
"location": "Campo Central"
}
Response (201):
{
"id": "d4e5f6g7-....",
"title": "Pelada de Domingo",
"description": "Partida amistosa - todos são bem-vindos",
"author": "{ "id": "a8f1b2c3-....", "name": ..., ...}",
"authorId": "a8f1b2c3-....",
"maxPlayers": 10,
"players": [],
"MatchDate": "2025-11-15T10:00:00.000Z",
"MatchStatus": "EM_BREVE",
"location": "Campo Central",
"teamNameA": "TIME_A",
"teamNameB": "TIME_B",
"createdAt": "2025-10-25T14:10:29.170Z",
"updatedAt": "2025-10-25T14:10:29.170Z"
}
GET Get_Match
GET http://localhost:4000/match/:id
Descrição:
Retorna os detalhes completos, incluindo os times divididos (A e B) e os jogadores inscritos.
Parâmetros obrigatórios:
id(string, path) — id da partida (UUID).
Respostas esperadas:
200 OK: Objeto Match complayers(lista de PlayerSubscription com dados básicos do user).404 Not Found: partida não encontrada.400 Bad Request: id inválido (validação de UUID).
Exemplo de uso:
GET http://localhost:4000/match/d4e5f6g7-....
Headers:
Authorization: Bearer <token>
Response (200):
{
"id": "uuid-partida-1",
"title": "Futsal da Computação",
"description": "Descrição",
"author": {
"id": "a8f1b2c3-....",
"name": "João",
"username": "joao",
"...": "..."
},
"authorId": "a8f1b2c3-....",
"MatchDate": "2025-11-10T17:30:00.000Z",
"MatchStatus": "EM_BREVE",
"location": "Quadra",
"maxPlayers": 20,
"teamNameA": "Veteranos",
"teamNameB": "Calouros",
"createdAt": "2025-11-09T10:00:00.000Z",
"updatedAt": "2025-11-09T10:00:00.000Z",
"isSubscriptionOpen": true,
"spots": {
"totalMax": 14,
"totalFilled": 2
},
"teamA": {
"name": "Veteranos",
"max": 7,
"filled": 1,
"isOpen": true,
"players": [
{
"id": "user-uuid-1",
"name": "Autor",
"userName": "autor_user"
}
]
},
"teamB": {
"name": "Calouros",
"max": 7,
"filled": 1,
"isOpen": true,
"players": [
{
"id": "user-uuid-2",
"name": "Jogador",
"userName": "player_two"
}
]
}
}
GET List_Matches (paginação)
GET http://localhost:4000/match/?limit=10&page=1
Descrição:
Lista partidas paginadas.
Query params (validados):
limit(number): máximo por página, coerção numérica, int positivo, max 50, default (ex.: 10).page(number): página, int positivo, default (ex.: 1).
Respostas esperadas:
200 OK: objeto com lista de partidas, page metadata (total/pages) (implementação específica do repositório).400 Bad Request: Erro de validação do Zod (ex:limitmaior que 50).
Exemplo de uso:
GET http://localhost:4000/match/?limit=10&page=1
Headers:
Authorization: Bearer <token>
Response (200):
{
"data": [
{
"id": "uuid-partida-1",
"title": "Futsal da Eng.",
"description": "Amistoso das engenharias",
"author": { "..." },
"authorId": "uuid-do-autor",
"MatchDate": "2025-11-10T17:30:00.000Z",
"MatchStatus": "EM_ANDAMENTO",
"location": "Quadra Padrão UnB",
"maxPlayers": 20,
"teamNameA": "Time Legal",
"teamNameB": "Time Ruim",
"createdAt": "2025-11-09T10:00:00.000Z",
"updatedAt": "2025-11-09T10:00:00.000Z",
"isSubscriptionOpen": true,
"spots": {
"filled": 5,
"open": 15
}
}
// ... (mais partidas)
],
"meta": {
"page": 1,
"limit": 10,
"totalCount": 12,
"totalPages": 2,
"hasNextPage": true,
"hasPrevPage": false
}
}
PATCH Update_Match
PATCH http://localhost:4000/match/:id
Descrição:
Atualiza campos da partida. Pelo menos um dos campos editáveis deve ser enviado.
Headers: Authorization: Bearer <token>
Parâmetros Path:
- id (UUID) — id da partida.
Body (opcional):
- title (string), description (string), maxPlayers (int), MatchDate (DateTime), location (string), teamNameA, teamNameB etc.
Respostas esperadas:
- 200 OK: partida atualizada (objeto).
- 400 Bad Request: validação falhou.
- 401 Unauthorized: token inválido.
- 403 Forbidden: usuário não autorizado a editar (ex.: não é o author).
- 404 Not Found: partida não encontrada.
Exemplo:
PATCH http://localhost:4000/match/d4e5f6g7-....
Headers:
Authorization: Bearer <token>
Body:
{
"title": "Pelada - Horário Atualizado",
"MatchDate": "2025-11-15T11:00:00.000Z"
}
Response (201):
{
"id": "d4e5f6g7-....",
"title": "Pelada - Horário Atualizado",
"description": "Partida amistosa - todos são bem-vindos",
"author": "{ "id": "a8f1b2c3-....", "name": ..., ...}",
"authorId": "a8f1b2c3-....",
"maxPlayers": 10,
"players": [],
"MatchDate": "2025-11-15T11:00:00.000Z",
"MatchStatus": "EM_BREVE",
"location": "Campo Central",
"teamNameA": "TIME_A",
"teamNameB": "TIME_B",
"createdAt": "2025-10-25T14:10:29.170Z",
"updatedAt": "2025-11-10T12:00:13.170Z"
}
DELETE Delete_Match
DELETE http://localhost:4000/match/:id
Descrição:
Remove uma partida do banco de dados.
Headers: Authorization: Bearer <token>
Parâmetros Path:
- id (UUID)
Respostas esperadas:
- 204 No Content: partida deletada com sucesso.
- 404 Not Found: partida não encontrada.
- 401 Unauthorized: token inválido.
- 403 Forbidden: usuário sem permissão para deletar (ex.: não é o autor).
Exemplo:
DELETE http://localhost:4000/match/d4e5f6g7-....
Headers:
Authorization: Bearer <token>
POST Subscribe (inscrição do jogador)
POST http://localhost:4000/match/:id/subscribe
Descrição:
Inscreve o usuário logado na partida. Lógica: O sistema usa Round Robin. O usuário será alocado automaticamente no time com menos jogadores. Se empatado, vai para o Time A.
Headers: Authorization: Bearer <token>
Path params:
- id (UUID) — id da partida.
Respostas esperadas:
- 201 Created: Inscrição realizada.
- 400 Bad Request: Dados inválidos.
- 401 Unauthorized: Token ausente/inválido.
- 403 Forbidden: Limite de players atingido ou partida já inicializada.
- 404 Not Found: Partida não encontrada.
- 409 Conflict: Usuário já está inscrito.
Exemplo:
POST http://localhost:4000/match/d4e5f6g7-.... /subscribe
Headers:
Authorization: Bearer <token>
DELETE Unsubscribe
DELETE http://localhost:4000/match/:id/unsubscribe
Descrição:
Remove a inscrição do usuário da partida.
Headers: Authorization: Bearer <token>
Path params:
- id (UUID) — match id.
Respostas esperadas:
- 200 Ok: Inscrição removida com sucesso.
- 404 Not Found: Inscrição ou partida não encontrada.
- 401 Unauthorized: Token ausente/inválido.
Exemplo:
DELETE http://localhost:4000/match/d4e5f6g7-.... /unsubscribe
Headers:
Authorization: Bearer <token>
POST Switch_Team
POST http://localhost:4000/match/:id/switch
Descrição:
Troca o time da inscrição do usuário (A <-> B). Requer autenticação.
Headers: Authorization: Bearer <token>
Path params:
- id (UUID) — match id.
Respostas esperadas:
- 200 OK: troca de time realizada com sucesso.
- 403 Forbidden: O time de destino está cheio ou a partida já iniciou.
- 404 Not Found: inscrição ou partida não encontrada.
- 401 Unauthorized: token inválido.
Exemplo:
POST http://localhost:4000/match/d4e5f6g7-.... /switch
Headers:
Authorization: Bearer <token>