diff --git a/backend_splatournament_manager/dist/csv/teams.csv b/backend_splatournament_manager/dist/csv/teams.csv index 52f1196..35fabaa 100644 --- a/backend_splatournament_manager/dist/csv/teams.csv +++ b/backend_splatournament_manager/dist/csv/teams.csv @@ -1,7 +1,7 @@ name,tag,description -Team Alpha,ALPH,A competitive esports team -Team Beta,BETA,New challengers on the scene -Team Gamma,GAMM,Veteran tournament winners -Team Delta,DELT,Rising stars in the community -Team Epsilon,EPSI,Strategic gameplay specialists -Team Zeta,ZETA,Fast-paced aggressive players +Team Alpha,ALP,A competitive esports team +Team Beta,BET,New challengers on the scene +Team Gamma,GAM,Veteran tournament winners +Team Delta,DEL,Rising stars in the community +Team Epsilon,EPS,Strategic gameplay specialists +Team Zeta,ZET,Fast-paced aggressive players diff --git a/backend_splatournament_manager/src/services/team-service.ts b/backend_splatournament_manager/src/services/team-service.ts index 823ef07..e093bd3 100644 --- a/backend_splatournament_manager/src/services/team-service.ts +++ b/backend_splatournament_manager/src/services/team-service.ts @@ -48,10 +48,16 @@ export class TeamService { getAllTeams(): Promise { return new Promise((resolve, reject) => { - this.db.all(`SELECT * FROM Teams`, (err: Error | null, rows: Team[]) => { - if (err) return reject(err); - resolve(rows); - }); + this.db.all( + `SELECT t.*, COUNT(tm.id) as memberCount + FROM Teams t + LEFT JOIN TeamMembers tm ON t.id = tm.teamId + GROUP BY t.id`, + (err: Error | null, rows: Team[]) => { + if (err) return reject(err); + resolve(rows); + } + ); }); } @@ -165,18 +171,30 @@ export class TeamService { addTeamMember(teamId: number, userId: number, role: 'owner' | 'member' = 'member'): Promise { return new Promise((resolve, reject) => { - const stmt = this.db.prepare(`INSERT INTO TeamMembers (teamId, userId, role) VALUES (?, ?, ?)`); - stmt.run(teamId, userId, role, function (this: RunResult, err: Error | null) { - if (err) return reject(err); - resolve({ - id: (this as any).lastID, - teamId, - userId, - role, - joinedAt: new Date().toISOString(), - }); - }); - stmt.finalize(); + // First check if team already has 4 members + this.db.get( + `SELECT COUNT(*) as count FROM TeamMembers WHERE teamId = ?`, + [teamId], + (err: Error | null, row: any) => { + if (err) return reject(err); + if (row.count >= 4) { + return reject(new Error('Team already has maximum of 4 members')); + } + + const stmt = this.db.prepare(`INSERT INTO TeamMembers (teamId, userId, role) VALUES (?, ?, ?)`); + stmt.run(teamId, userId, role, function (this: RunResult, err: Error | null) { + if (err) return reject(err); + resolve({ + id: (this as any).lastID, + teamId, + userId, + role, + joinedAt: new Date().toISOString(), + }); + }); + stmt.finalize(); + } + ); }); } diff --git a/docs/prompt.md b/docs/prompt.md index b9c8191..9529cbf 100644 --- a/docs/prompt.md +++ b/docs/prompt.md @@ -19,4 +19,8 @@ Folgende Dateien wurden in diesem Prompt verändert: - tournament_detail_page.dart - teams_page.dart (erstellt, aber nicht verwendet) -- \ No newline at end of file +- Ensure a team can only have a maximum of four members, also show the member count in the team list.

+Folgende Dateien wurden in diesem Prompt verändert: + - backend_splatournament_manager/src/services/team-service.ts + - frontend_splatournament_manager/lib/models/team.dart + - frontend_splatournament_manager/lib/pages/teams_page.dart diff --git a/frontend_splatournament_manager/lib/models/team.dart b/frontend_splatournament_manager/lib/models/team.dart index fbd16bf..5f3c08b 100644 --- a/frontend_splatournament_manager/lib/models/team.dart +++ b/frontend_splatournament_manager/lib/models/team.dart @@ -4,6 +4,7 @@ class Team { final String tag; final String description; final String createdAt; + final int? memberCount; Team({ required this.id, @@ -11,6 +12,7 @@ class Team { required this.tag, required this.description, required this.createdAt, + this.memberCount, }); factory Team.fromJson(Map json) { @@ -20,6 +22,7 @@ class Team { tag: json['tag'] as String, description: (json['description'] as String?) ?? '', createdAt: (json['createdAt'] as String?) ?? '', + memberCount: json['memberCount'] as int?, ); } @@ -30,6 +33,7 @@ class Team { 'tag': tag, 'description': description, 'createdAt': createdAt, + if (memberCount != null) 'memberCount': memberCount, }; } } diff --git a/frontend_splatournament_manager/lib/pages/teams_page.dart b/frontend_splatournament_manager/lib/pages/teams_page.dart index 368b1cb..7326f95 100644 --- a/frontend_splatournament_manager/lib/pages/teams_page.dart +++ b/frontend_splatournament_manager/lib/pages/teams_page.dart @@ -128,6 +128,10 @@ class TeamListItem extends StatelessWidget { @override Widget build(BuildContext context) { + final memberCountText = team.memberCount != null + ? '${team.memberCount}/4 members' + : 'No members'; + return Card( margin: const EdgeInsets.symmetric(vertical: 8), child: ListTile( @@ -135,7 +139,21 @@ class TeamListItem extends StatelessWidget { child: Text(team.tag), ), title: Text(team.name), - subtitle: Text(team.description.isEmpty ? 'No description' : team.description), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(team.description.isEmpty ? 'No description' : team.description), + const SizedBox(height: 4), + Text( + memberCountText, + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + isThreeLine: true, trailing: Row( mainAxisSize: MainAxisSize.min, children: [