From 9f9efc2bc07810d2e06b37bad94e5922681eadef Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 18 Feb 2026 22:38:15 +0900 Subject: feat: refactor tournament to generic DB-backed N-person bracket Replace hardcoded 6-person tournament with a generic single-elimination bracket system backed by new DB tables (tournaments, tournament_entries, tournament_matches). Includes admin CRUD, standard seeding algorithm, bye handling, and a CSS Grid bracket renderer on the frontend. Add comprehensive tests for backend API/admin handlers, seeding logic, and frontend bracket component. Co-Authored-By: Claude Opus 4.6 --- typespec/api-server/models.tsp | 18 ++++++++++++++++-- typespec/api-server/routes.tsp | 10 ++-------- 2 files changed, 18 insertions(+), 10 deletions(-) (limited to 'typespec/api-server') diff --git a/typespec/api-server/models.tsp b/typespec/api-server/models.tsp index 47519be..6605767 100644 --- a/typespec/api-server/models.tsp +++ b/typespec/api-server/models.tsp @@ -106,14 +106,28 @@ model RankingEntry { } model Tournament { + tournament_id: integer; + display_name: string; + bracket_size: integer; + num_rounds: integer; + entries: TournamentEntry[]; matches: TournamentMatch[]; } +model TournamentEntry { + user: User; + seed: integer; +} + model TournamentMatch { - game_id: integer; + tournament_match_id: integer; + round: integer; + position: integer; + game_id?: integer; player1?: User; player2?: User; player1_score?: integer; player2_score?: integer; - winner?: integer; + winner_user_id?: integer; + is_bye: boolean; } diff --git a/typespec/api-server/routes.tsp b/typespec/api-server/routes.tsp index 3409cea..a67ab8f 100644 --- a/typespec/api-server/routes.tsp +++ b/typespec/api-server/routes.tsp @@ -110,16 +110,10 @@ op getGameWatchLatestStates(@path game_id: integer): { // ---------- Tournament ---------- -@route("/tournament") +@route("/tournaments/{tournament_id}") @get @operationId("getTournament") -op getTournament( - @query game1: integer, - @query game2: integer, - @query game3: integer, - @query game4: integer, - @query game5: integer, -): { +op getTournament(@path tournament_id: integer): { @body body: { tournament: Tournament; }; -- cgit v1.3.1