From 9817f7080e9cd69a0ecce5e6ea97a65da4268ccf Mon Sep 17 00:00:00 2001 From: Tim Kainz Date: Fri, 13 Mar 2026 19:04:07 +0100 Subject: [PATCH] Add validation for maxTeams amount and refresh Team count properly --- backend_splatournament_manager/src/app.ts | 6 +++ .../src/services/team-service.ts | 43 +++++++++++++------ docs/prompts.md | 8 +++- .../lib/pages/tournament_detail_page.dart | 21 ++++++--- 4 files changed, 60 insertions(+), 18 deletions(-) diff --git a/backend_splatournament_manager/src/app.ts b/backend_splatournament_manager/src/app.ts index c9923d8..a7dec62 100644 --- a/backend_splatournament_manager/src/app.ts +++ b/backend_splatournament_manager/src/app.ts @@ -199,6 +199,12 @@ app.post('/tournaments/:id/teams', authMiddleware, async (req: Request, res: Res const entry = await teamService.registerTeamForTournament(+req.params.id, +teamId); res.status(201).send(entry); } catch (err: any) { + if (err.message === 'Turnier nicht gefunden') { + return res.status(404).send({error: err.message}); + } + if (err.message === 'Das Turnier hat bereits die maximale Anzahl an Teams erreicht') { + return res.status(409).send({error: err.message}); + } if (err.message?.includes('UNIQUE constraint failed')) { return res.status(409).send({error: 'Das Team ist bereits für dieses Turnier angemeldet'}); } diff --git a/backend_splatournament_manager/src/services/team-service.ts b/backend_splatournament_manager/src/services/team-service.ts index 80415a8..f39cda9 100644 --- a/backend_splatournament_manager/src/services/team-service.ts +++ b/backend_splatournament_manager/src/services/team-service.ts @@ -145,19 +145,38 @@ export class TeamService { registerTeamForTournament(tournamentId: number, teamId: number): Promise { return new Promise((resolve, reject) => { - const stmt = this.db.prepare( - `INSERT INTO TournamentTeams (tournamentId, teamId) VALUES (?, ?)` + this.db.get( + `SELECT t.maxTeamAmount as maxTeamAmount, + COUNT(tt.id) as currentTeamAmount + FROM Tournaments t + LEFT JOIN TournamentTeams tt ON t.id = tt.tournamentId + WHERE t.id = ? + GROUP BY t.id`, + [tournamentId], + (err: Error | null, row: any) => { + if (err) return reject(err); + if (!row) { + return reject(new Error('Turnier nicht gefunden')); + } + if (row.currentTeamAmount >= row.maxTeamAmount) { + return reject(new Error('Das Turnier hat bereits die maximale Anzahl an Teams erreicht')); + } + + const stmt = this.db.prepare( + `INSERT INTO TournamentTeams (tournamentId, teamId) VALUES (?, ?)` + ); + stmt.run(tournamentId, teamId, function (this: RunResult, err: Error | null) { + if (err) return reject(err); + resolve({ + id: (this as any).lastID, + tournamentId, + teamId, + registeredAt: new Date().toISOString(), + }); + }); + stmt.finalize(); + } ); - stmt.run(tournamentId, teamId, function (this: RunResult, err: Error | null) { - if (err) return reject(err); - resolve({ - id: (this as any).lastID, - tournamentId, - teamId, - registeredAt: new Date().toISOString(), - }); - }); - stmt.finalize(); }); } diff --git a/docs/prompts.md b/docs/prompts.md index 05ca3ad..5f99bd7 100644 --- a/docs/prompts.md +++ b/docs/prompts.md @@ -191,4 +191,10 @@ Folgende Dateien wurden in diesem Prompt verändert: - lock the matches if the next game match winner was already chosen. Folgende Dateien wurden in diesem Prompt verändert: - backend_splatournament_manager/src/services/match-service.ts - - frontend_splatournament_manager/lib/pages/tournament_bracket_page.dart \ No newline at end of file + - frontend_splatournament_manager/lib/pages/tournament_bracket_page.dart + +- Add a validation that you can only enter a tournament with at most maxTeams teams. +Folgende Dateien wurden in diesem Prompt verändert: + - backend_splatournament_manager/src/services/team-service.ts + - backend_splatournament_manager/src/app.ts + - docs/prompts.md \ No newline at end of file diff --git a/frontend_splatournament_manager/lib/pages/tournament_detail_page.dart b/frontend_splatournament_manager/lib/pages/tournament_detail_page.dart index bf4b4e2..7dae9d7 100644 --- a/frontend_splatournament_manager/lib/pages/tournament_detail_page.dart +++ b/frontend_splatournament_manager/lib/pages/tournament_detail_page.dart @@ -3,6 +3,7 @@ import 'package:frontend_splatournament_manager/models/team.dart'; import 'package:frontend_splatournament_manager/models/tournament.dart'; import 'package:frontend_splatournament_manager/pages/tournament_bracket_page.dart'; import 'package:frontend_splatournament_manager/providers/team_provider.dart'; +import 'package:frontend_splatournament_manager/providers/tournament_provider.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -84,7 +85,12 @@ class _TournamentDetailPageState extends State { ); if (!context.mounted) return; + await Provider.of( + context, + listen: false, + ).refreshAvailableTournaments(); + if (!context.mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( @@ -413,11 +419,16 @@ class DetailHeader extends StatelessWidget { Spacer(), Row( children: [ - InputChip( - onPressed: () => onTeamsChipClicked(), - label: Text( - '${tournament.currentTeamAmount} von ${tournament.maxTeamAmount} Teams', - ), + Consumer( + builder: (context, value, child){ + final currentTournament = value.availableTournaments.firstWhere((t) => t.id == tournament.id); + return InputChip( + onPressed: () => onTeamsChipClicked(), + label: Text( + '${currentTournament.currentTeamAmount} von ${currentTournament.maxTeamAmount} Teams', + ), + ); + } ), ], ),