diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-18 22:38:15 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-18 22:38:15 +0900 |
| commit | 9f9efc2bc07810d2e06b37bad94e5922681eadef (patch) | |
| tree | 79bcce2bf065a7ea282aa7855822c3bdee92ee7c /frontend/app/api | |
| parent | c095200dc79f24c0cd17a2e3ba15c85a2971ea9a (diff) | |
| download | phperkaigi-2026-albatross-9f9efc2bc07810d2e06b37bad94e5922681eadef.tar.gz phperkaigi-2026-albatross-9f9efc2bc07810d2e06b37bad94e5922681eadef.tar.zst phperkaigi-2026-albatross-9f9efc2bc07810d2e06b37bad94e5922681eadef.zip | |
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 <noreply@anthropic.com>
Diffstat (limited to 'frontend/app/api')
| -rw-r--r-- | frontend/app/api/client.ts | 12 | ||||
| -rw-r--r-- | frontend/app/api/schema.d.ts | 31 |
2 files changed, 23 insertions, 20 deletions
diff --git a/frontend/app/api/client.ts b/frontend/app/api/client.ts index 26c20d1..c9647ba 100644 --- a/frontend/app/api/client.ts +++ b/frontend/app/api/client.ts @@ -108,16 +108,10 @@ class AuthenticatedApiClient { return data; } - async getTournament( - game1: number, - game2: number, - game3: number, - game4: number, - game5: number, - ) { - const { data, error } = await client.GET("/tournament", { + async getTournament(tournamentId: number) { + const { data, error } = await client.GET("/tournaments/{tournament_id}", { params: { - query: { game1, game2, game3, game4, game5 }, + path: { tournament_id: tournamentId }, }, }); if (error) throw new Error(error.message); diff --git a/frontend/app/api/schema.d.ts b/frontend/app/api/schema.d.ts index 6d27df0..b891bfa 100644 --- a/frontend/app/api/schema.d.ts +++ b/frontend/app/api/schema.d.ts @@ -164,7 +164,7 @@ export interface paths { patch?: never; trace?: never; }; - "/tournament": { + "/tournaments/{tournament_id}": { parameters: { query?: never; header?: never; @@ -223,15 +223,28 @@ export interface components { code: string | null; }; Tournament: { + tournament_id: number; + display_name: string; + bracket_size: number; + num_rounds: number; + entries: components["schemas"]["TournamentEntry"][]; matches: components["schemas"]["TournamentMatch"][]; }; + TournamentEntry: { + user: components["schemas"]["User"]; + seed: number; + }; TournamentMatch: { - game_id: number; + tournament_match_id: number; + round: number; + position: number; + game_id?: number; player1?: components["schemas"]["User"]; player2?: components["schemas"]["User"]; player1_score?: number; player2_score?: number; - winner?: number; + winner_user_id?: number; + is_bye: boolean; }; User: { user_id: number; @@ -700,15 +713,11 @@ export interface operations { }; getTournament: { parameters: { - query: { - game1: number; - game2: number; - game3: number; - game4: number; - game5: number; - }; + query?: never; header?: never; - path?: never; + path: { + tournament_id: number; + }; cookie?: never; }; requestBody?: never; |
