StatisticsView erstellen #30

Merged
sneeex merged 6 commits from feature/6-statisticsview-erstellen into development 2025-11-23 12:59:40 +00:00
5 changed files with 39 additions and 17 deletions
Showing only changes of commit c38c731b41 - Show all commits

View File

@@ -88,13 +88,12 @@
]
},
"winner": {
"type": ["string","null"]
"type": ["object","null"]
},
"required": [
"id",
"createdAt",
"name",
"winner"
"name"
]
}
]

View File

@@ -20,13 +20,16 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
result.map((row) async {
final group = await db.groupGameDao.getGroupOfGame(gameId: row.id);
final players = await db.playerGameDao.getPlayersOfGame(gameId: row.id);
final winner = row.winnerId != null
? await db.playerDao.getPlayerById(playerId: row.winnerId!)
: null;
return Game(
id: row.id,
name: row.name,
group: group,
players: players,
createdAt: row.createdAt,
winner: row.winnerId,
winner: winner,
);
}),
);
@@ -45,13 +48,17 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
if (await db.groupGameDao.gameHasGroup(gameId: gameId)) {
group = await db.groupGameDao.getGroupOfGame(gameId: gameId);
}
Player? winner;
if (result.winnerId != null) {
winner = await db.playerDao.getPlayerById(playerId: result.winnerId!);
}
return Game(
id: result.id,
name: result.name,
players: players,
group: group,
winner: result.winnerId,
winner: winner,
createdAt: result.createdAt,
);
}
@@ -64,7 +71,7 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
GameTableCompanion.insert(
id: game.id,
name: game.name,
winnerId: Value(game.winner),
winnerId: Value(game.winner?.id),
createdAt: game.createdAt,
),
mode: InsertMode.insertOrReplace,
@@ -100,7 +107,7 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
id: game.id,
name: game.name,
createdAt: game.createdAt,
winnerId: Value(game.winner),
winnerId: Value(game.winner?.id),
),
)
.toList(),

View File

@@ -9,7 +9,7 @@ class Game {
final String name;
final List<Player>? players;
final Group? group;
final String? winner;
final Player? winner;
Game({
String? id,
@@ -17,7 +17,7 @@ class Game {
required this.name,
this.players,
this.group,
this.winner = '',
this.winner,
}) : id = id ?? const Uuid().v4(),
createdAt = createdAt ?? clock.now();
@@ -37,7 +37,7 @@ class Game {
.toList()
: null,
group = json['group'] != null ? Group.fromJson(json['group']) : null,
winner = json['winner'] ?? '';
winner = json['winner'] != null ? Player.fromJson(json['winner']) : null;
/// Converts the Game instance to a JSON object.
Map<String, dynamic> toJson() => {
@@ -46,6 +46,6 @@ class Game {
'name': name,
'players': players?.map((player) => player.toJson()).toList(),
'group': group?.toJson(),
'winner': winner,
'winner': winner?.toJson(),
};
}

View File

@@ -127,14 +127,14 @@ class _StatisticsViewState extends State<StatisticsView> {
// Getting the winners
for (var game in games) {
final winner = game.winner;
if (winner != null && winner.isNotEmpty) {
final index = winCounts.indexWhere((entry) => entry.$1 == winner);
if (winner != null) {
final index = winCounts.indexWhere((entry) => entry.$1 == winner.id);
// -1 means winner not found in winCounts
sneeex marked this conversation as resolved Outdated

maybe comment, dass -1 heißt nicht gefunden, war mir jetzt nicht klar.
Falls du's machst, natürlich bei allen

maybe comment, dass -1 heißt nicht gefunden, war mir jetzt nicht klar. Falls du's machst, natürlich bei allen

Habs jetzt mal für euch hinzugefügt, weil ihr ja beide relativ neu seid, ist halt aber einfach der return Wert dieser Funktion. Können es dann bei Zeiten wieder entfernen

Habs jetzt mal für euch hinzugefügt, weil ihr ja beide relativ neu seid, ist halt aber einfach der return Wert dieser Funktion. Können es dann bei Zeiten wieder entfernen
if (index != -1) {
final current = winCounts[index].$2;
winCounts[index] = (winner, current + 1);
winCounts[index] = (winner.id, current + 1);
} else {
winCounts.add((winner, 1));
winCounts.add((winner.id, 1));
}
}
}

View File

@@ -50,15 +50,18 @@ void main() {
name: 'First Test Game',
group: testGroup1,
players: [testPlayer4, testPlayer5],
winner: testPlayer4,
);
testGame2 = Game(
name: 'Second Test Game',
group: testGroup2,
players: [testPlayer1, testPlayer2, testPlayer3],
winner: testPlayer2,
);
testGameOnlyPlayers = Game(
name: 'Test Game with Players',
players: [testPlayer1, testPlayer2, testPlayer3],
winner: testPlayer3,
);
testGameOnlyGroup = Game(name: 'Test Game with Group', group: testGroup2);
});
@@ -75,9 +78,16 @@ void main() {
expect(result.id, testGame1.id);
expect(result.name, testGame1.name);
expect(result.winner, testGame1.winner);
expect(result.createdAt, testGame1.createdAt);
if (result.winner != null && testGame1.winner != null) {
expect(result.winner!.id, testGame1.winner!.id);
expect(result.winner!.name, testGame1.winner!.name);
expect(result.winner!.createdAt, testGame1.winner!.createdAt);
} else {
expect(result.winner, testGame1.winner);
}
if (result.group != null) {
expect(result.group!.members.length, testGroup1.members.length);
@@ -123,7 +133,13 @@ void main() {
expect(game.id, testGame.id);
expect(game.name, testGame.name);
expect(game.createdAt, testGame.createdAt);
expect(game.winner, testGame.winner);
if (game.winner != null && testGame.winner != null) {
expect(game.winner!.id, testGame.winner!.id);
expect(game.winner!.name, testGame.winner!.name);
expect(game.winner!.createdAt, testGame.winner!.createdAt);
} else {
expect(game.winner, testGame.winner);
}
// Group-Checks
if (testGame.group != null) {