aboutsummaryrefslogtreecommitdiffhomepage
path: root/frontend/app/api
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-18 22:38:15 +0900
committernsfisis <nsfisis@gmail.com>2026-02-18 22:38:15 +0900
commit9f9efc2bc07810d2e06b37bad94e5922681eadef (patch)
tree79bcce2bf065a7ea282aa7855822c3bdee92ee7c /frontend/app/api
parentc095200dc79f24c0cd17a2e3ba15c85a2971ea9a (diff)
downloadphperkaigi-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.ts12
-rw-r--r--frontend/app/api/schema.d.ts31
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;