limit team members to 4 and display member count in list
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
name,tag,description
|
name,tag,description
|
||||||
Team Alpha,ALPH,A competitive esports team
|
Team Alpha,ALP,A competitive esports team
|
||||||
Team Beta,BETA,New challengers on the scene
|
Team Beta,BET,New challengers on the scene
|
||||||
Team Gamma,GAMM,Veteran tournament winners
|
Team Gamma,GAM,Veteran tournament winners
|
||||||
Team Delta,DELT,Rising stars in the community
|
Team Delta,DEL,Rising stars in the community
|
||||||
Team Epsilon,EPSI,Strategic gameplay specialists
|
Team Epsilon,EPS,Strategic gameplay specialists
|
||||||
Team Zeta,ZETA,Fast-paced aggressive players
|
Team Zeta,ZET,Fast-paced aggressive players
|
||||||
|
|||||||
|
@@ -48,10 +48,16 @@ export class TeamService {
|
|||||||
|
|
||||||
getAllTeams(): Promise<Team[]> {
|
getAllTeams(): Promise<Team[]> {
|
||||||
return new Promise<Team[]>((resolve, reject) => {
|
return new Promise<Team[]>((resolve, reject) => {
|
||||||
this.db.all(`SELECT * FROM Teams`, (err: Error | null, rows: Team[]) => {
|
this.db.all(
|
||||||
if (err) return reject(err);
|
`SELECT t.*, COUNT(tm.id) as memberCount
|
||||||
resolve(rows);
|
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<TeamMember> {
|
addTeamMember(teamId: number, userId: number, role: 'owner' | 'member' = 'member'): Promise<TeamMember> {
|
||||||
return new Promise<TeamMember>((resolve, reject) => {
|
return new Promise<TeamMember>((resolve, reject) => {
|
||||||
const stmt = this.db.prepare(`INSERT INTO TeamMembers (teamId, userId, role) VALUES (?, ?, ?)`);
|
// First check if team already has 4 members
|
||||||
stmt.run(teamId, userId, role, function (this: RunResult, err: Error | null) {
|
this.db.get(
|
||||||
if (err) return reject(err);
|
`SELECT COUNT(*) as count FROM TeamMembers WHERE teamId = ?`,
|
||||||
resolve({
|
[teamId],
|
||||||
id: (this as any).lastID,
|
(err: Error | null, row: any) => {
|
||||||
teamId,
|
if (err) return reject(err);
|
||||||
userId,
|
if (row.count >= 4) {
|
||||||
role,
|
return reject(new Error('Team already has maximum of 4 members'));
|
||||||
joinedAt: new Date().toISOString(),
|
}
|
||||||
});
|
|
||||||
});
|
const stmt = this.db.prepare(`INSERT INTO TeamMembers (teamId, userId, role) VALUES (?, ?, ?)`);
|
||||||
stmt.finalize();
|
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();
|
||||||
|
}
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,4 +19,8 @@ Folgende Dateien wurden in diesem Prompt verändert:
|
|||||||
- tournament_detail_page.dart
|
- tournament_detail_page.dart
|
||||||
- teams_page.dart (erstellt, aber nicht verwendet)
|
- teams_page.dart (erstellt, aber nicht verwendet)
|
||||||
|
|
||||||
-
|
- Ensure a team can only have a maximum of four members, also show the member count in the team list.<br><br>
|
||||||
|
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
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ class Team {
|
|||||||
final String tag;
|
final String tag;
|
||||||
final String description;
|
final String description;
|
||||||
final String createdAt;
|
final String createdAt;
|
||||||
|
final int? memberCount;
|
||||||
|
|
||||||
Team({
|
Team({
|
||||||
required this.id,
|
required this.id,
|
||||||
@@ -11,6 +12,7 @@ class Team {
|
|||||||
required this.tag,
|
required this.tag,
|
||||||
required this.description,
|
required this.description,
|
||||||
required this.createdAt,
|
required this.createdAt,
|
||||||
|
this.memberCount,
|
||||||
});
|
});
|
||||||
|
|
||||||
factory Team.fromJson(Map<String, dynamic> json) {
|
factory Team.fromJson(Map<String, dynamic> json) {
|
||||||
@@ -20,6 +22,7 @@ class Team {
|
|||||||
tag: json['tag'] as String,
|
tag: json['tag'] as String,
|
||||||
description: (json['description'] as String?) ?? '',
|
description: (json['description'] as String?) ?? '',
|
||||||
createdAt: (json['createdAt'] as String?) ?? '',
|
createdAt: (json['createdAt'] as String?) ?? '',
|
||||||
|
memberCount: json['memberCount'] as int?,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,6 +33,7 @@ class Team {
|
|||||||
'tag': tag,
|
'tag': tag,
|
||||||
'description': description,
|
'description': description,
|
||||||
'createdAt': createdAt,
|
'createdAt': createdAt,
|
||||||
|
if (memberCount != null) 'memberCount': memberCount,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,6 +128,10 @@ class TeamListItem extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
final memberCountText = team.memberCount != null
|
||||||
|
? '${team.memberCount}/4 members'
|
||||||
|
: 'No members';
|
||||||
|
|
||||||
return Card(
|
return Card(
|
||||||
margin: const EdgeInsets.symmetric(vertical: 8),
|
margin: const EdgeInsets.symmetric(vertical: 8),
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
@@ -135,7 +139,21 @@ class TeamListItem extends StatelessWidget {
|
|||||||
child: Text(team.tag),
|
child: Text(team.tag),
|
||||||
),
|
),
|
||||||
title: Text(team.name),
|
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(
|
trailing: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
Reference in New Issue
Block a user