Renamed folder to "models"

This commit is contained in:
2026-04-08 22:27:50 +02:00
parent 14d46d7e52
commit ad6d08374e
46 changed files with 795 additions and 569 deletions

View File

@@ -1,6 +1,6 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
/// Translates a [Ruleset] enum value to its corresponding localized string. /// Translates a [Ruleset] enum value to its corresponding localized string.

View File

@@ -1,8 +1,8 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/game_table.dart'; import 'package:tallee/data/db/tables/game_table.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/core/enums.dart';
part 'game_dao.g.dart'; part 'game_dao.g.dart';
@@ -111,14 +111,20 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
} }
/// Updates the name of the game with the given [gameId] to [newName]. /// Updates the name of the game with the given [gameId] to [newName].
Future<void> updateGameName({required String gameId, required String newName}) async { Future<void> updateGameName({
await (update( required String gameId,
gameTable, required String newName,
)..where((g) => g.id.equals(gameId))).write(GameTableCompanion(name: Value(newName))); }) async {
await (update(gameTable)..where((g) => g.id.equals(gameId))).write(
GameTableCompanion(name: Value(newName)),
);
} }
/// Updates the ruleset of the game with the given [gameId]. /// Updates the ruleset of the game with the given [gameId].
Future<void> updateGameRuleset({required String gameId, required Ruleset newRuleset}) async { Future<void> updateGameRuleset({
required String gameId,
required Ruleset newRuleset,
}) async {
await (update(gameTable)..where((g) => g.id.equals(gameId))).write( await (update(gameTable)..where((g) => g.id.equals(gameId))).write(
GameTableCompanion(ruleset: Value(newRuleset.name)), GameTableCompanion(ruleset: Value(newRuleset.name)),
); );
@@ -135,24 +141,31 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
} }
/// Updates the color of the game with the given [gameId]. /// Updates the color of the game with the given [gameId].
Future<void> updateGameColor({required String gameId, required GameColor newColor}) async { Future<void> updateGameColor({
await (update( required String gameId,
gameTable, required GameColor newColor,
)..where((g) => g.id.equals(gameId))).write(GameTableCompanion(color: Value(newColor.name))); }) async {
await (update(gameTable)..where((g) => g.id.equals(gameId))).write(
GameTableCompanion(color: Value(newColor.name)),
);
} }
/// Updates the icon of the game with the given [gameId]. /// Updates the icon of the game with the given [gameId].
Future<void> updateGameIcon({required String gameId, required String newIcon}) async { Future<void> updateGameIcon({
await (update( required String gameId,
gameTable, required String newIcon,
)..where((g) => g.id.equals(gameId))).write(GameTableCompanion(icon: Value(newIcon))); }) async {
await (update(gameTable)..where((g) => g.id.equals(gameId))).write(
GameTableCompanion(icon: Value(newIcon)),
);
} }
/// Retrieves the total count of games in the database. /// Retrieves the total count of games in the database.
Future<int> getGameCount() async { Future<int> getGameCount() async {
final count = await (selectOnly( final count =
gameTable, await (selectOnly(gameTable)..addColumns([gameTable.id.count()]))
)..addColumns([gameTable.id.count()])).map((row) => row.read(gameTable.id.count())).getSingle(); .map((row) => row.read(gameTable.id.count()))
.getSingle();
return count ?? 0; return count ?? 0;
} }

View File

@@ -5,4 +5,12 @@ part of 'game_dao.dart';
// ignore_for_file: type=lint // ignore_for_file: type=lint
mixin _$GameDaoMixin on DatabaseAccessor<AppDatabase> { mixin _$GameDaoMixin on DatabaseAccessor<AppDatabase> {
$GameTableTable get gameTable => attachedDatabase.gameTable; $GameTableTable get gameTable => attachedDatabase.gameTable;
GameDaoManager get managers => GameDaoManager(this);
}
class GameDaoManager {
final _$GameDaoMixin _db;
GameDaoManager(this._db);
$$GameTableTableTableManager get gameTable =>
$$GameTableTableTableManager(_db.attachedDatabase, _db.gameTable);
} }

View File

@@ -3,8 +3,8 @@ import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/group_table.dart'; import 'package:tallee/data/db/tables/group_table.dart';
import 'package:tallee/data/db/tables/match_table.dart'; import 'package:tallee/data/db/tables/match_table.dart';
import 'package:tallee/data/db/tables/player_group_table.dart'; import 'package:tallee/data/db/tables/player_group_table.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
part 'group_dao.g.dart'; part 'group_dao.g.dart';

View File

@@ -10,4 +10,23 @@ mixin _$GroupDaoMixin on DatabaseAccessor<AppDatabase> {
attachedDatabase.playerGroupTable; attachedDatabase.playerGroupTable;
$GameTableTable get gameTable => attachedDatabase.gameTable; $GameTableTable get gameTable => attachedDatabase.gameTable;
$MatchTableTable get matchTable => attachedDatabase.matchTable; $MatchTableTable get matchTable => attachedDatabase.matchTable;
GroupDaoManager get managers => GroupDaoManager(this);
}
class GroupDaoManager {
final _$GroupDaoMixin _db;
GroupDaoManager(this._db);
$$GroupTableTableTableManager get groupTable =>
$$GroupTableTableTableManager(_db.attachedDatabase, _db.groupTable);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
$$PlayerGroupTableTableTableManager get playerGroupTable =>
$$PlayerGroupTableTableTableManager(
_db.attachedDatabase,
_db.playerGroupTable,
);
$$GameTableTableTableManager get gameTable =>
$$GameTableTableTableManager(_db.attachedDatabase, _db.gameTable);
$$MatchTableTableTableManager get matchTable =>
$$MatchTableTableTableManager(_db.attachedDatabase, _db.matchTable);
} }

View File

@@ -4,10 +4,10 @@ import 'package:tallee/data/db/tables/game_table.dart';
import 'package:tallee/data/db/tables/group_table.dart'; import 'package:tallee/data/db/tables/group_table.dart';
import 'package:tallee/data/db/tables/match_table.dart'; import 'package:tallee/data/db/tables/match_table.dart';
import 'package:tallee/data/db/tables/player_match_table.dart'; import 'package:tallee/data/db/tables/player_match_table.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
part 'match_dao.g.dart'; part 'match_dao.g.dart';

View File

@@ -11,4 +11,25 @@ mixin _$MatchDaoMixin on DatabaseAccessor<AppDatabase> {
$TeamTableTable get teamTable => attachedDatabase.teamTable; $TeamTableTable get teamTable => attachedDatabase.teamTable;
$PlayerMatchTableTable get playerMatchTable => $PlayerMatchTableTable get playerMatchTable =>
attachedDatabase.playerMatchTable; attachedDatabase.playerMatchTable;
MatchDaoManager get managers => MatchDaoManager(this);
}
class MatchDaoManager {
final _$MatchDaoMixin _db;
MatchDaoManager(this._db);
$$GameTableTableTableManager get gameTable =>
$$GameTableTableTableManager(_db.attachedDatabase, _db.gameTable);
$$GroupTableTableTableManager get groupTable =>
$$GroupTableTableTableManager(_db.attachedDatabase, _db.groupTable);
$$MatchTableTableTableManager get matchTable =>
$$MatchTableTableTableManager(_db.attachedDatabase, _db.matchTable);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
$$TeamTableTableTableManager get teamTable =>
$$TeamTableTableTableManager(_db.attachedDatabase, _db.teamTable);
$$PlayerMatchTableTableTableManager get playerMatchTable =>
$$PlayerMatchTableTableTableManager(
_db.attachedDatabase,
_db.playerMatchTable,
);
} }

View File

@@ -1,7 +1,7 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/player_table.dart'; import 'package:tallee/data/db/tables/player_table.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
part 'player_dao.g.dart'; part 'player_dao.g.dart';

View File

@@ -5,4 +5,12 @@ part of 'player_dao.dart';
// ignore_for_file: type=lint // ignore_for_file: type=lint
mixin _$PlayerDaoMixin on DatabaseAccessor<AppDatabase> { mixin _$PlayerDaoMixin on DatabaseAccessor<AppDatabase> {
$PlayerTableTable get playerTable => attachedDatabase.playerTable; $PlayerTableTable get playerTable => attachedDatabase.playerTable;
PlayerDaoManager get managers => PlayerDaoManager(this);
}
class PlayerDaoManager {
final _$PlayerDaoMixin _db;
PlayerDaoManager(this._db);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
} }

View File

@@ -2,7 +2,7 @@ import 'package:drift/drift.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/player_group_table.dart'; import 'package:tallee/data/db/tables/player_group_table.dart';
import 'package:tallee/data/db/tables/player_table.dart'; import 'package:tallee/data/db/tables/player_table.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
part 'player_group_dao.g.dart'; part 'player_group_dao.g.dart';

View File

@@ -8,4 +8,19 @@ mixin _$PlayerGroupDaoMixin on DatabaseAccessor<AppDatabase> {
$GroupTableTable get groupTable => attachedDatabase.groupTable; $GroupTableTable get groupTable => attachedDatabase.groupTable;
$PlayerGroupTableTable get playerGroupTable => $PlayerGroupTableTable get playerGroupTable =>
attachedDatabase.playerGroupTable; attachedDatabase.playerGroupTable;
PlayerGroupDaoManager get managers => PlayerGroupDaoManager(this);
}
class PlayerGroupDaoManager {
final _$PlayerGroupDaoMixin _db;
PlayerGroupDaoManager(this._db);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
$$GroupTableTableTableManager get groupTable =>
$$GroupTableTableTableManager(_db.attachedDatabase, _db.groupTable);
$$PlayerGroupTableTableTableManager get playerGroupTable =>
$$PlayerGroupTableTableTableManager(
_db.attachedDatabase,
_db.playerGroupTable,
);
} }

View File

@@ -2,7 +2,7 @@ import 'package:drift/drift.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/player_match_table.dart'; import 'package:tallee/data/db/tables/player_match_table.dart';
import 'package:tallee/data/db/tables/team_table.dart'; import 'package:tallee/data/db/tables/team_table.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
part 'player_match_dao.g.dart'; part 'player_match_dao.g.dart';
@@ -40,7 +40,7 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
if (result.isEmpty) return null; if (result.isEmpty) return null;
final futures = result.map( final futures = result.map(
(row) => db.playerDao.getPlayerById(playerId: row.playerId), (row) => db.playerDao.getPlayerById(playerId: row.playerId),
); );
final players = await Future.wait(futures); final players = await Future.wait(futures);
return players; return players;
@@ -52,11 +52,11 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
required String matchId, required String matchId,
required String playerId, required String playerId,
}) async { }) async {
final result = await (select(playerMatchTable) final result =
..where( await (select(playerMatchTable)..where(
(p) => p.matchId.equals(matchId) & p.playerId.equals(playerId), (p) => p.matchId.equals(matchId) & p.playerId.equals(playerId),
)) ))
.getSingleOrNull(); .getSingleOrNull();
return result?.score; return result?.score;
} }
@@ -67,11 +67,11 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
required String playerId, required String playerId,
required int newScore, required int newScore,
}) async { }) async {
final rowsAffected = await (update(playerMatchTable) final rowsAffected =
..where( await (update(playerMatchTable)..where(
(p) => p.matchId.equals(matchId) & p.playerId.equals(playerId), (p) => p.matchId.equals(matchId) & p.playerId.equals(playerId),
)) ))
.write(PlayerMatchTableCompanion(score: Value(newScore))); .write(PlayerMatchTableCompanion(score: Value(newScore)));
return rowsAffected > 0; return rowsAffected > 0;
} }
@@ -82,11 +82,11 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
required String playerId, required String playerId,
required String? teamId, required String? teamId,
}) async { }) async {
final rowsAffected = await (update(playerMatchTable) final rowsAffected =
..where( await (update(playerMatchTable)..where(
(p) => p.matchId.equals(matchId) & p.playerId.equals(playerId), (p) => p.matchId.equals(matchId) & p.playerId.equals(playerId),
)) ))
.write(PlayerMatchTableCompanion(teamId: Value(teamId))); .write(PlayerMatchTableCompanion(teamId: Value(teamId)));
return rowsAffected > 0; return rowsAffected > 0;
} }
@@ -94,11 +94,11 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
/// Returns `true` if there are players, otherwise `false`. /// Returns `true` if there are players, otherwise `false`.
Future<bool> matchHasPlayers({required String matchId}) async { Future<bool> matchHasPlayers({required String matchId}) async {
final count = final count =
await (selectOnly(playerMatchTable) await (selectOnly(playerMatchTable)
..where(playerMatchTable.matchId.equals(matchId)) ..where(playerMatchTable.matchId.equals(matchId))
..addColumns([playerMatchTable.playerId.count()])) ..addColumns([playerMatchTable.playerId.count()]))
.map((row) => row.read(playerMatchTable.playerId.count())) .map((row) => row.read(playerMatchTable.playerId.count()))
.getSingle(); .getSingle();
return (count ?? 0) > 0; return (count ?? 0) > 0;
} }
@@ -109,12 +109,12 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
required String playerId, required String playerId,
}) async { }) async {
final count = final count =
await (selectOnly(playerMatchTable) await (selectOnly(playerMatchTable)
..where(playerMatchTable.matchId.equals(matchId)) ..where(playerMatchTable.matchId.equals(matchId))
..where(playerMatchTable.playerId.equals(playerId)) ..where(playerMatchTable.playerId.equals(playerId))
..addColumns([playerMatchTable.playerId.count()])) ..addColumns([playerMatchTable.playerId.count()]))
.map((row) => row.read(playerMatchTable.playerId.count())) .map((row) => row.read(playerMatchTable.playerId.count()))
.getSingle(); .getSingle();
return (count ?? 0) > 0; return (count ?? 0) > 0;
} }
@@ -153,9 +153,9 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
if (playersToRemove.isNotEmpty) { if (playersToRemove.isNotEmpty) {
await (delete(playerMatchTable)..where( await (delete(playerMatchTable)..where(
(pg) => (pg) =>
pg.matchId.equals(matchId) & pg.matchId.equals(matchId) &
pg.playerId.isIn(playersToRemove.toList()), pg.playerId.isIn(playersToRemove.toList()),
)) ))
.go(); .go();
} }
@@ -164,15 +164,15 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
final inserts = playersToAdd final inserts = playersToAdd
.map( .map(
(id) => PlayerMatchTableCompanion.insert( (id) => PlayerMatchTableCompanion.insert(
playerId: id, playerId: id,
matchId: matchId, matchId: matchId,
score: 0, score: 0,
), ),
) )
.toList(); .toList();
await Future.wait( await Future.wait(
inserts.map( inserts.map(
(c) => into( (c) => into(
playerMatchTable, playerMatchTable,
).insert(c, mode: InsertMode.insertOrIgnore), ).insert(c, mode: InsertMode.insertOrIgnore),
), ),
@@ -186,16 +186,14 @@ class PlayerMatchDao extends DatabaseAccessor<AppDatabase>
required String matchId, required String matchId,
required String teamId, required String teamId,
}) async { }) async {
final result = await (select(playerMatchTable) final result = await (select(
..where( playerMatchTable,
(p) => p.matchId.equals(matchId) & p.teamId.equals(teamId), )..where((p) => p.matchId.equals(matchId) & p.teamId.equals(teamId))).get();
))
.get();
if (result.isEmpty) return []; if (result.isEmpty) return [];
final futures = result.map( final futures = result.map(
(row) => db.playerDao.getPlayerById(playerId: row.playerId), (row) => db.playerDao.getPlayerById(playerId: row.playerId),
); );
return Future.wait(futures); return Future.wait(futures);
} }

View File

@@ -11,4 +11,25 @@ mixin _$PlayerMatchDaoMixin on DatabaseAccessor<AppDatabase> {
$TeamTableTable get teamTable => attachedDatabase.teamTable; $TeamTableTable get teamTable => attachedDatabase.teamTable;
$PlayerMatchTableTable get playerMatchTable => $PlayerMatchTableTable get playerMatchTable =>
attachedDatabase.playerMatchTable; attachedDatabase.playerMatchTable;
PlayerMatchDaoManager get managers => PlayerMatchDaoManager(this);
}
class PlayerMatchDaoManager {
final _$PlayerMatchDaoMixin _db;
PlayerMatchDaoManager(this._db);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
$$GameTableTableTableManager get gameTable =>
$$GameTableTableTableManager(_db.attachedDatabase, _db.gameTable);
$$GroupTableTableTableManager get groupTable =>
$$GroupTableTableTableManager(_db.attachedDatabase, _db.groupTable);
$$MatchTableTableTableManager get matchTable =>
$$MatchTableTableTableManager(_db.attachedDatabase, _db.matchTable);
$$TeamTableTableTableManager get teamTable =>
$$TeamTableTableTableManager(_db.attachedDatabase, _db.teamTable);
$$PlayerMatchTableTableTableManager get playerMatchTable =>
$$PlayerMatchTableTableTableManager(
_db.attachedDatabase,
_db.playerMatchTable,
);
} }

View File

@@ -1,7 +1,7 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/score_table.dart'; import 'package:tallee/data/db/tables/score_table.dart';
import 'package:tallee/data/dto/score_entry.dart'; import 'package:tallee/data/models/score_entry.dart';
part 'score_dao.g.dart'; part 'score_dao.g.dart';

View File

@@ -9,4 +9,20 @@ mixin _$ScoreDaoMixin on DatabaseAccessor<AppDatabase> {
$GroupTableTable get groupTable => attachedDatabase.groupTable; $GroupTableTable get groupTable => attachedDatabase.groupTable;
$MatchTableTable get matchTable => attachedDatabase.matchTable; $MatchTableTable get matchTable => attachedDatabase.matchTable;
$ScoreTableTable get scoreTable => attachedDatabase.scoreTable; $ScoreTableTable get scoreTable => attachedDatabase.scoreTable;
ScoreDaoManager get managers => ScoreDaoManager(this);
}
class ScoreDaoManager {
final _$ScoreDaoMixin _db;
ScoreDaoManager(this._db);
$$PlayerTableTableTableManager get playerTable =>
$$PlayerTableTableTableManager(_db.attachedDatabase, _db.playerTable);
$$GameTableTableTableManager get gameTable =>
$$GameTableTableTableManager(_db.attachedDatabase, _db.gameTable);
$$GroupTableTableTableManager get groupTable =>
$$GroupTableTableTableManager(_db.attachedDatabase, _db.groupTable);
$$MatchTableTableTableManager get matchTable =>
$$MatchTableTableTableManager(_db.attachedDatabase, _db.matchTable);
$$ScoreTableTableTableManager get scoreTable =>
$$ScoreTableTableTableManager(_db.attachedDatabase, _db.scoreTable);
} }

View File

@@ -1,8 +1,8 @@
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/db/tables/team_table.dart'; import 'package:tallee/data/db/tables/team_table.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/data/dto/team.dart'; import 'package:tallee/data/models/team.dart';
part 'team_dao.g.dart'; part 'team_dao.g.dart';
@@ -144,4 +144,3 @@ class TeamDao extends DatabaseAccessor<AppDatabase> with _$TeamDaoMixin {
return rowsAffected > 0; return rowsAffected > 0;
} }
} }

View File

@@ -5,4 +5,12 @@ part of 'team_dao.dart';
// ignore_for_file: type=lint // ignore_for_file: type=lint
mixin _$TeamDaoMixin on DatabaseAccessor<AppDatabase> { mixin _$TeamDaoMixin on DatabaseAccessor<AppDatabase> {
$TeamTableTable get teamTable => attachedDatabase.teamTable; $TeamTableTable get teamTable => attachedDatabase.teamTable;
TeamDaoManager get managers => TeamDaoManager(this);
}
class TeamDaoManager {
final _$TeamDaoMixin _db;
TeamDaoManager(this._db);
$$TeamTableTableTableManager get teamTable =>
$$TeamTableTableTableManager(_db.attachedDatabase, _db.teamTable);
} }

View File

@@ -1131,9 +1131,9 @@ class $MatchTableTable extends MatchTable
late final GeneratedColumn<String> name = GeneratedColumn<String>( late final GeneratedColumn<String> name = GeneratedColumn<String>(
'name', 'name',
aliasedName, aliasedName,
true, false,
type: DriftSqlType.string, type: DriftSqlType.string,
requiredDuringInsert: false, requiredDuringInsert: true,
); );
static const VerificationMeta _notesMeta = const VerificationMeta('notes'); static const VerificationMeta _notesMeta = const VerificationMeta('notes');
@override @override
@@ -1212,6 +1212,8 @@ class $MatchTableTable extends MatchTable
_nameMeta, _nameMeta,
name.isAcceptableOrUnknown(data['name']!, _nameMeta), name.isAcceptableOrUnknown(data['name']!, _nameMeta),
); );
} else if (isInserting) {
context.missing(_nameMeta);
} }
if (data.containsKey('notes')) { if (data.containsKey('notes')) {
context.handle( context.handle(
@@ -1257,7 +1259,7 @@ class $MatchTableTable extends MatchTable
name: attachedDatabase.typeMapping.read( name: attachedDatabase.typeMapping.read(
DriftSqlType.string, DriftSqlType.string,
data['${effectivePrefix}name'], data['${effectivePrefix}name'],
), )!,
notes: attachedDatabase.typeMapping.read( notes: attachedDatabase.typeMapping.read(
DriftSqlType.string, DriftSqlType.string,
data['${effectivePrefix}notes'], data['${effectivePrefix}notes'],
@@ -1283,7 +1285,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
final String id; final String id;
final String gameId; final String gameId;
final String? groupId; final String? groupId;
final String? name; final String name;
final String? notes; final String? notes;
final DateTime createdAt; final DateTime createdAt;
final DateTime? endedAt; final DateTime? endedAt;
@@ -1291,7 +1293,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
required this.id, required this.id,
required this.gameId, required this.gameId,
this.groupId, this.groupId,
this.name, required this.name,
this.notes, this.notes,
required this.createdAt, required this.createdAt,
this.endedAt, this.endedAt,
@@ -1304,9 +1306,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
if (!nullToAbsent || groupId != null) { if (!nullToAbsent || groupId != null) {
map['group_id'] = Variable<String>(groupId); map['group_id'] = Variable<String>(groupId);
} }
if (!nullToAbsent || name != null) { map['name'] = Variable<String>(name);
map['name'] = Variable<String>(name);
}
if (!nullToAbsent || notes != null) { if (!nullToAbsent || notes != null) {
map['notes'] = Variable<String>(notes); map['notes'] = Variable<String>(notes);
} }
@@ -1324,7 +1324,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
groupId: groupId == null && nullToAbsent groupId: groupId == null && nullToAbsent
? const Value.absent() ? const Value.absent()
: Value(groupId), : Value(groupId),
name: name == null && nullToAbsent ? const Value.absent() : Value(name), name: Value(name),
notes: notes == null && nullToAbsent notes: notes == null && nullToAbsent
? const Value.absent() ? const Value.absent()
: Value(notes), : Value(notes),
@@ -1344,7 +1344,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
id: serializer.fromJson<String>(json['id']), id: serializer.fromJson<String>(json['id']),
gameId: serializer.fromJson<String>(json['gameId']), gameId: serializer.fromJson<String>(json['gameId']),
groupId: serializer.fromJson<String?>(json['groupId']), groupId: serializer.fromJson<String?>(json['groupId']),
name: serializer.fromJson<String?>(json['name']), name: serializer.fromJson<String>(json['name']),
notes: serializer.fromJson<String?>(json['notes']), notes: serializer.fromJson<String?>(json['notes']),
createdAt: serializer.fromJson<DateTime>(json['createdAt']), createdAt: serializer.fromJson<DateTime>(json['createdAt']),
endedAt: serializer.fromJson<DateTime?>(json['endedAt']), endedAt: serializer.fromJson<DateTime?>(json['endedAt']),
@@ -1357,7 +1357,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
'id': serializer.toJson<String>(id), 'id': serializer.toJson<String>(id),
'gameId': serializer.toJson<String>(gameId), 'gameId': serializer.toJson<String>(gameId),
'groupId': serializer.toJson<String?>(groupId), 'groupId': serializer.toJson<String?>(groupId),
'name': serializer.toJson<String?>(name), 'name': serializer.toJson<String>(name),
'notes': serializer.toJson<String?>(notes), 'notes': serializer.toJson<String?>(notes),
'createdAt': serializer.toJson<DateTime>(createdAt), 'createdAt': serializer.toJson<DateTime>(createdAt),
'endedAt': serializer.toJson<DateTime?>(endedAt), 'endedAt': serializer.toJson<DateTime?>(endedAt),
@@ -1368,7 +1368,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
String? id, String? id,
String? gameId, String? gameId,
Value<String?> groupId = const Value.absent(), Value<String?> groupId = const Value.absent(),
Value<String?> name = const Value.absent(), String? name,
Value<String?> notes = const Value.absent(), Value<String?> notes = const Value.absent(),
DateTime? createdAt, DateTime? createdAt,
Value<DateTime?> endedAt = const Value.absent(), Value<DateTime?> endedAt = const Value.absent(),
@@ -1376,7 +1376,7 @@ class MatchTableData extends DataClass implements Insertable<MatchTableData> {
id: id ?? this.id, id: id ?? this.id,
gameId: gameId ?? this.gameId, gameId: gameId ?? this.gameId,
groupId: groupId.present ? groupId.value : this.groupId, groupId: groupId.present ? groupId.value : this.groupId,
name: name.present ? name.value : this.name, name: name ?? this.name,
notes: notes.present ? notes.value : this.notes, notes: notes.present ? notes.value : this.notes,
createdAt: createdAt ?? this.createdAt, createdAt: createdAt ?? this.createdAt,
endedAt: endedAt.present ? endedAt.value : this.endedAt, endedAt: endedAt.present ? endedAt.value : this.endedAt,
@@ -1427,7 +1427,7 @@ class MatchTableCompanion extends UpdateCompanion<MatchTableData> {
final Value<String> id; final Value<String> id;
final Value<String> gameId; final Value<String> gameId;
final Value<String?> groupId; final Value<String?> groupId;
final Value<String?> name; final Value<String> name;
final Value<String?> notes; final Value<String?> notes;
final Value<DateTime> createdAt; final Value<DateTime> createdAt;
final Value<DateTime?> endedAt; final Value<DateTime?> endedAt;
@@ -1446,13 +1446,14 @@ class MatchTableCompanion extends UpdateCompanion<MatchTableData> {
required String id, required String id,
required String gameId, required String gameId,
this.groupId = const Value.absent(), this.groupId = const Value.absent(),
this.name = const Value.absent(), required String name,
this.notes = const Value.absent(), this.notes = const Value.absent(),
required DateTime createdAt, required DateTime createdAt,
this.endedAt = const Value.absent(), this.endedAt = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : id = Value(id), }) : id = Value(id),
gameId = Value(gameId), gameId = Value(gameId),
name = Value(name),
createdAt = Value(createdAt); createdAt = Value(createdAt);
static Insertable<MatchTableData> custom({ static Insertable<MatchTableData> custom({
Expression<String>? id, Expression<String>? id,
@@ -1480,7 +1481,7 @@ class MatchTableCompanion extends UpdateCompanion<MatchTableData> {
Value<String>? id, Value<String>? id,
Value<String>? gameId, Value<String>? gameId,
Value<String?>? groupId, Value<String?>? groupId,
Value<String?>? name, Value<String>? name,
Value<String?>? notes, Value<String?>? notes,
Value<DateTime>? createdAt, Value<DateTime>? createdAt,
Value<DateTime?>? endedAt, Value<DateTime?>? endedAt,
@@ -2074,17 +2075,8 @@ class $PlayerMatchTableTable extends PlayerMatchTable
'REFERENCES team_table (id)', 'REFERENCES team_table (id)',
), ),
); );
static const VerificationMeta _scoreMeta = const VerificationMeta('score');
@override @override
late final GeneratedColumn<int> score = GeneratedColumn<int>( List<GeneratedColumn> get $columns => [playerId, matchId, teamId];
'score',
aliasedName,
false,
type: DriftSqlType.int,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [playerId, matchId, teamId, score];
@override @override
String get aliasedName => _alias ?? actualTableName; String get aliasedName => _alias ?? actualTableName;
@override @override
@@ -2119,14 +2111,6 @@ class $PlayerMatchTableTable extends PlayerMatchTable
teamId.isAcceptableOrUnknown(data['team_id']!, _teamIdMeta), teamId.isAcceptableOrUnknown(data['team_id']!, _teamIdMeta),
); );
} }
if (data.containsKey('score')) {
context.handle(
_scoreMeta,
score.isAcceptableOrUnknown(data['score']!, _scoreMeta),
);
} else if (isInserting) {
context.missing(_scoreMeta);
}
return context; return context;
} }
@@ -2148,10 +2132,6 @@ class $PlayerMatchTableTable extends PlayerMatchTable
DriftSqlType.string, DriftSqlType.string,
data['${effectivePrefix}team_id'], data['${effectivePrefix}team_id'],
), ),
score: attachedDatabase.typeMapping.read(
DriftSqlType.int,
data['${effectivePrefix}score'],
)!,
); );
} }
@@ -2166,12 +2146,10 @@ class PlayerMatchTableData extends DataClass
final String playerId; final String playerId;
final String matchId; final String matchId;
final String? teamId; final String? teamId;
final int score;
const PlayerMatchTableData({ const PlayerMatchTableData({
required this.playerId, required this.playerId,
required this.matchId, required this.matchId,
this.teamId, this.teamId,
required this.score,
}); });
@override @override
Map<String, Expression> toColumns(bool nullToAbsent) { Map<String, Expression> toColumns(bool nullToAbsent) {
@@ -2181,7 +2159,6 @@ class PlayerMatchTableData extends DataClass
if (!nullToAbsent || teamId != null) { if (!nullToAbsent || teamId != null) {
map['team_id'] = Variable<String>(teamId); map['team_id'] = Variable<String>(teamId);
} }
map['score'] = Variable<int>(score);
return map; return map;
} }
@@ -2192,7 +2169,6 @@ class PlayerMatchTableData extends DataClass
teamId: teamId == null && nullToAbsent teamId: teamId == null && nullToAbsent
? const Value.absent() ? const Value.absent()
: Value(teamId), : Value(teamId),
score: Value(score),
); );
} }
@@ -2205,7 +2181,6 @@ class PlayerMatchTableData extends DataClass
playerId: serializer.fromJson<String>(json['playerId']), playerId: serializer.fromJson<String>(json['playerId']),
matchId: serializer.fromJson<String>(json['matchId']), matchId: serializer.fromJson<String>(json['matchId']),
teamId: serializer.fromJson<String?>(json['teamId']), teamId: serializer.fromJson<String?>(json['teamId']),
score: serializer.fromJson<int>(json['score']),
); );
} }
@override @override
@@ -2215,7 +2190,6 @@ class PlayerMatchTableData extends DataClass
'playerId': serializer.toJson<String>(playerId), 'playerId': serializer.toJson<String>(playerId),
'matchId': serializer.toJson<String>(matchId), 'matchId': serializer.toJson<String>(matchId),
'teamId': serializer.toJson<String?>(teamId), 'teamId': serializer.toJson<String?>(teamId),
'score': serializer.toJson<int>(score),
}; };
} }
@@ -2223,19 +2197,16 @@ class PlayerMatchTableData extends DataClass
String? playerId, String? playerId,
String? matchId, String? matchId,
Value<String?> teamId = const Value.absent(), Value<String?> teamId = const Value.absent(),
int? score,
}) => PlayerMatchTableData( }) => PlayerMatchTableData(
playerId: playerId ?? this.playerId, playerId: playerId ?? this.playerId,
matchId: matchId ?? this.matchId, matchId: matchId ?? this.matchId,
teamId: teamId.present ? teamId.value : this.teamId, teamId: teamId.present ? teamId.value : this.teamId,
score: score ?? this.score,
); );
PlayerMatchTableData copyWithCompanion(PlayerMatchTableCompanion data) { PlayerMatchTableData copyWithCompanion(PlayerMatchTableCompanion data) {
return PlayerMatchTableData( return PlayerMatchTableData(
playerId: data.playerId.present ? data.playerId.value : this.playerId, playerId: data.playerId.present ? data.playerId.value : this.playerId,
matchId: data.matchId.present ? data.matchId.value : this.matchId, matchId: data.matchId.present ? data.matchId.value : this.matchId,
teamId: data.teamId.present ? data.teamId.value : this.teamId, teamId: data.teamId.present ? data.teamId.value : this.teamId,
score: data.score.present ? data.score.value : this.score,
); );
} }
@@ -2244,58 +2215,50 @@ class PlayerMatchTableData extends DataClass
return (StringBuffer('PlayerMatchTableData(') return (StringBuffer('PlayerMatchTableData(')
..write('playerId: $playerId, ') ..write('playerId: $playerId, ')
..write('matchId: $matchId, ') ..write('matchId: $matchId, ')
..write('teamId: $teamId, ') ..write('teamId: $teamId')
..write('score: $score')
..write(')')) ..write(')'))
.toString(); .toString();
} }
@override @override
int get hashCode => Object.hash(playerId, matchId, teamId, score); int get hashCode => Object.hash(playerId, matchId, teamId);
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>
identical(this, other) || identical(this, other) ||
(other is PlayerMatchTableData && (other is PlayerMatchTableData &&
other.playerId == this.playerId && other.playerId == this.playerId &&
other.matchId == this.matchId && other.matchId == this.matchId &&
other.teamId == this.teamId && other.teamId == this.teamId);
other.score == this.score);
} }
class PlayerMatchTableCompanion extends UpdateCompanion<PlayerMatchTableData> { class PlayerMatchTableCompanion extends UpdateCompanion<PlayerMatchTableData> {
final Value<String> playerId; final Value<String> playerId;
final Value<String> matchId; final Value<String> matchId;
final Value<String?> teamId; final Value<String?> teamId;
final Value<int> score;
final Value<int> rowid; final Value<int> rowid;
const PlayerMatchTableCompanion({ const PlayerMatchTableCompanion({
this.playerId = const Value.absent(), this.playerId = const Value.absent(),
this.matchId = const Value.absent(), this.matchId = const Value.absent(),
this.teamId = const Value.absent(), this.teamId = const Value.absent(),
this.score = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}); });
PlayerMatchTableCompanion.insert({ PlayerMatchTableCompanion.insert({
required String playerId, required String playerId,
required String matchId, required String matchId,
this.teamId = const Value.absent(), this.teamId = const Value.absent(),
required int score,
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : playerId = Value(playerId), }) : playerId = Value(playerId),
matchId = Value(matchId), matchId = Value(matchId);
score = Value(score);
static Insertable<PlayerMatchTableData> custom({ static Insertable<PlayerMatchTableData> custom({
Expression<String>? playerId, Expression<String>? playerId,
Expression<String>? matchId, Expression<String>? matchId,
Expression<String>? teamId, Expression<String>? teamId,
Expression<int>? score,
Expression<int>? rowid, Expression<int>? rowid,
}) { }) {
return RawValuesInsertable({ return RawValuesInsertable({
if (playerId != null) 'player_id': playerId, if (playerId != null) 'player_id': playerId,
if (matchId != null) 'match_id': matchId, if (matchId != null) 'match_id': matchId,
if (teamId != null) 'team_id': teamId, if (teamId != null) 'team_id': teamId,
if (score != null) 'score': score,
if (rowid != null) 'rowid': rowid, if (rowid != null) 'rowid': rowid,
}); });
} }
@@ -2304,14 +2267,12 @@ class PlayerMatchTableCompanion extends UpdateCompanion<PlayerMatchTableData> {
Value<String>? playerId, Value<String>? playerId,
Value<String>? matchId, Value<String>? matchId,
Value<String?>? teamId, Value<String?>? teamId,
Value<int>? score,
Value<int>? rowid, Value<int>? rowid,
}) { }) {
return PlayerMatchTableCompanion( return PlayerMatchTableCompanion(
playerId: playerId ?? this.playerId, playerId: playerId ?? this.playerId,
matchId: matchId ?? this.matchId, matchId: matchId ?? this.matchId,
teamId: teamId ?? this.teamId, teamId: teamId ?? this.teamId,
score: score ?? this.score,
rowid: rowid ?? this.rowid, rowid: rowid ?? this.rowid,
); );
} }
@@ -2328,9 +2289,6 @@ class PlayerMatchTableCompanion extends UpdateCompanion<PlayerMatchTableData> {
if (teamId.present) { if (teamId.present) {
map['team_id'] = Variable<String>(teamId.value); map['team_id'] = Variable<String>(teamId.value);
} }
if (score.present) {
map['score'] = Variable<int>(score.value);
}
if (rowid.present) { if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value); map['rowid'] = Variable<int>(rowid.value);
} }
@@ -2343,7 +2301,6 @@ class PlayerMatchTableCompanion extends UpdateCompanion<PlayerMatchTableData> {
..write('playerId: $playerId, ') ..write('playerId: $playerId, ')
..write('matchId: $matchId, ') ..write('matchId: $matchId, ')
..write('teamId: $teamId, ') ..write('teamId: $teamId, ')
..write('score: $score, ')
..write('rowid: $rowid') ..write('rowid: $rowid')
..write(')')) ..write(')'))
.toString(); .toString();
@@ -4051,7 +4008,7 @@ typedef $$MatchTableTableCreateCompanionBuilder =
required String id, required String id,
required String gameId, required String gameId,
Value<String?> groupId, Value<String?> groupId,
Value<String?> name, required String name,
Value<String?> notes, Value<String?> notes,
required DateTime createdAt, required DateTime createdAt,
Value<DateTime?> endedAt, Value<DateTime?> endedAt,
@@ -4062,7 +4019,7 @@ typedef $$MatchTableTableUpdateCompanionBuilder =
Value<String> id, Value<String> id,
Value<String> gameId, Value<String> gameId,
Value<String?> groupId, Value<String?> groupId,
Value<String?> name, Value<String> name,
Value<String?> notes, Value<String?> notes,
Value<DateTime> createdAt, Value<DateTime> createdAt,
Value<DateTime?> endedAt, Value<DateTime?> endedAt,
@@ -4520,7 +4477,7 @@ class $$MatchTableTableTableManager
Value<String> id = const Value.absent(), Value<String> id = const Value.absent(),
Value<String> gameId = const Value.absent(), Value<String> gameId = const Value.absent(),
Value<String?> groupId = const Value.absent(), Value<String?> groupId = const Value.absent(),
Value<String?> name = const Value.absent(), Value<String> name = const Value.absent(),
Value<String?> notes = const Value.absent(), Value<String?> notes = const Value.absent(),
Value<DateTime> createdAt = const Value.absent(), Value<DateTime> createdAt = const Value.absent(),
Value<DateTime?> endedAt = const Value.absent(), Value<DateTime?> endedAt = const Value.absent(),
@@ -4540,7 +4497,7 @@ class $$MatchTableTableTableManager
required String id, required String id,
required String gameId, required String gameId,
Value<String?> groupId = const Value.absent(), Value<String?> groupId = const Value.absent(),
Value<String?> name = const Value.absent(), required String name,
Value<String?> notes = const Value.absent(), Value<String?> notes = const Value.absent(),
required DateTime createdAt, required DateTime createdAt,
Value<DateTime?> endedAt = const Value.absent(), Value<DateTime?> endedAt = const Value.absent(),
@@ -5334,7 +5291,6 @@ typedef $$PlayerMatchTableTableCreateCompanionBuilder =
required String playerId, required String playerId,
required String matchId, required String matchId,
Value<String?> teamId, Value<String?> teamId,
required int score,
Value<int> rowid, Value<int> rowid,
}); });
typedef $$PlayerMatchTableTableUpdateCompanionBuilder = typedef $$PlayerMatchTableTableUpdateCompanionBuilder =
@@ -5342,7 +5298,6 @@ typedef $$PlayerMatchTableTableUpdateCompanionBuilder =
Value<String> playerId, Value<String> playerId,
Value<String> matchId, Value<String> matchId,
Value<String?> teamId, Value<String?> teamId,
Value<int> score,
Value<int> rowid, Value<int> rowid,
}); });
@@ -5426,11 +5381,6 @@ class $$PlayerMatchTableTableFilterComposer
super.$addJoinBuilderToRootComposer, super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer, super.$removeJoinBuilderFromRootComposer,
}); });
ColumnFilters<int> get score => $composableBuilder(
column: $table.score,
builder: (column) => ColumnFilters(column),
);
$$PlayerTableTableFilterComposer get playerId { $$PlayerTableTableFilterComposer get playerId {
final $$PlayerTableTableFilterComposer composer = $composerBuilder( final $$PlayerTableTableFilterComposer composer = $composerBuilder(
composer: this, composer: this,
@@ -5510,11 +5460,6 @@ class $$PlayerMatchTableTableOrderingComposer
super.$addJoinBuilderToRootComposer, super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer, super.$removeJoinBuilderFromRootComposer,
}); });
ColumnOrderings<int> get score => $composableBuilder(
column: $table.score,
builder: (column) => ColumnOrderings(column),
);
$$PlayerTableTableOrderingComposer get playerId { $$PlayerTableTableOrderingComposer get playerId {
final $$PlayerTableTableOrderingComposer composer = $composerBuilder( final $$PlayerTableTableOrderingComposer composer = $composerBuilder(
composer: this, composer: this,
@@ -5594,9 +5539,6 @@ class $$PlayerMatchTableTableAnnotationComposer
super.$addJoinBuilderToRootComposer, super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer, super.$removeJoinBuilderFromRootComposer,
}); });
GeneratedColumn<int> get score =>
$composableBuilder(column: $table.score, builder: (column) => column);
$$PlayerTableTableAnnotationComposer get playerId { $$PlayerTableTableAnnotationComposer get playerId {
final $$PlayerTableTableAnnotationComposer composer = $composerBuilder( final $$PlayerTableTableAnnotationComposer composer = $composerBuilder(
composer: this, composer: this,
@@ -5700,13 +5642,11 @@ class $$PlayerMatchTableTableTableManager
Value<String> playerId = const Value.absent(), Value<String> playerId = const Value.absent(),
Value<String> matchId = const Value.absent(), Value<String> matchId = const Value.absent(),
Value<String?> teamId = const Value.absent(), Value<String?> teamId = const Value.absent(),
Value<int> score = const Value.absent(),
Value<int> rowid = const Value.absent(), Value<int> rowid = const Value.absent(),
}) => PlayerMatchTableCompanion( }) => PlayerMatchTableCompanion(
playerId: playerId, playerId: playerId,
matchId: matchId, matchId: matchId,
teamId: teamId, teamId: teamId,
score: score,
rowid: rowid, rowid: rowid,
), ),
createCompanionCallback: createCompanionCallback:
@@ -5714,13 +5654,11 @@ class $$PlayerMatchTableTableTableManager
required String playerId, required String playerId,
required String matchId, required String matchId,
Value<String?> teamId = const Value.absent(), Value<String?> teamId = const Value.absent(),
required int score,
Value<int> rowid = const Value.absent(), Value<int> rowid = const Value.absent(),
}) => PlayerMatchTableCompanion.insert( }) => PlayerMatchTableCompanion.insert(
playerId: playerId, playerId: playerId,
matchId: matchId, matchId: matchId,
teamId: teamId, teamId: teamId,
score: score,
rowid: rowid, rowid: rowid,
), ),
withReferenceMapper: (p0) => p0 withReferenceMapper: (p0) => p0

View File

@@ -1,5 +1,5 @@
import 'package:clock/clock.dart'; import 'package:clock/clock.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class Group { class Group {

View File

@@ -1,9 +1,9 @@
import 'package:clock/clock.dart'; import 'package:clock/clock.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/data/dto/score_entry.dart'; import 'package:tallee/data/models/score_entry.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class Match { class Match {

View File

@@ -1,5 +1,5 @@
import 'package:clock/clock.dart'; import 'package:clock/clock.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class Team { class Team {
@@ -37,4 +37,3 @@ class Team {
'memberIds': members.map((member) => member.id).toList(), 'memberIds': members.map((member) => member.id).toList(),
}; };
} }

View File

@@ -4,8 +4,8 @@ import 'package:tallee/core/constants.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/buttons/custom_width_button.dart'; import 'package:tallee/presentation/widgets/buttons/custom_width_button.dart';
import 'package:tallee/presentation/widgets/player_selection.dart'; import 'package:tallee/presentation/widgets/player_selection.dart';

View File

@@ -4,9 +4,9 @@ import 'package:provider/provider.dart';
import 'package:tallee/core/adaptive_page_route.dart'; import 'package:tallee/core/adaptive_page_route.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/group_view/create_group_view.dart'; import 'package:tallee/presentation/views/main_menu/group_view/create_group_view.dart';
import 'package:tallee/presentation/widgets/app_skeleton.dart'; import 'package:tallee/presentation/widgets/app_skeleton.dart';

View File

@@ -4,8 +4,8 @@ import 'package:tallee/core/adaptive_page_route.dart';
import 'package:tallee/core/constants.dart'; import 'package:tallee/core/constants.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/group_view/create_group_view.dart'; import 'package:tallee/presentation/views/main_menu/group_view/create_group_view.dart';
import 'package:tallee/presentation/views/main_menu/group_view/group_detail_view.dart'; import 'package:tallee/presentation/views/main_menu/group_view/group_detail_view.dart';

View File

@@ -4,10 +4,10 @@ import 'package:tallee/core/adaptive_page_route.dart';
import 'package:tallee/core/constants.dart'; import 'package:tallee/core/constants.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/match_view/match_result_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/match_result_view.dart';
import 'package:tallee/presentation/widgets/app_skeleton.dart'; import 'package:tallee/presentation/widgets/app_skeleton.dart';
@@ -42,7 +42,13 @@ class _HomeViewState extends State<HomeView> {
2, 2,
Match( Match(
name: 'Skeleton Match', name: 'Skeleton Match',
game: Game(name: '', ruleset: Ruleset.singleWinner, description: '', color: GameColor.blue, icon: ''), game: Game(
name: '',
ruleset: Ruleset.singleWinner,
description: '',
color: GameColor.blue,
icon: '',
),
group: Group( group: Group(
name: 'Skeleton Group', name: 'Skeleton Group',
description: '', description: '',
@@ -104,7 +110,9 @@ class _HomeViewState extends State<HomeView> {
if (recentMatches.isNotEmpty) if (recentMatches.isNotEmpty)
for (Match match in recentMatches) for (Match match in recentMatches)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 6.0), padding: const EdgeInsets.symmetric(
vertical: 6.0,
),
child: MatchTile( child: MatchTile(
compact: true, compact: true,
width: constraints.maxWidth * 0.9, width: constraints.maxWidth * 0.9,
@@ -113,7 +121,8 @@ class _HomeViewState extends State<HomeView> {
await Navigator.of(context).push( await Navigator.of(context).push(
adaptivePageRoute( adaptivePageRoute(
fullscreenDialog: true, fullscreenDialog: true,
builder: (context) => MatchResultView(match: match), builder: (context) =>
MatchResultView(match: match),
), ),
); );
await updatedWinnerInRecentMatches(match.id); await updatedWinnerInRecentMatches(match.id);
@@ -121,7 +130,10 @@ class _HomeViewState extends State<HomeView> {
), ),
) )
else else
Center(heightFactor: 5, child: Text(loc.no_recent_matches_available)), Center(
heightFactor: 5,
child: Text(loc.no_recent_matches_available),
),
], ],
), ),
), ),
@@ -137,22 +149,40 @@ class _HomeViewState extends State<HomeView> {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
QuickCreateButton(text: 'Category 1', onPressed: () {}), QuickCreateButton(
QuickCreateButton(text: 'Category 2', onPressed: () {}), text: 'Category 1',
onPressed: () {},
),
QuickCreateButton(
text: 'Category 2',
onPressed: () {},
),
], ],
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
QuickCreateButton(text: 'Category 3', onPressed: () {}), QuickCreateButton(
QuickCreateButton(text: 'Category 4', onPressed: () {}), text: 'Category 3',
onPressed: () {},
),
QuickCreateButton(
text: 'Category 4',
onPressed: () {},
),
], ],
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
QuickCreateButton(text: 'Category 5', onPressed: () {}), QuickCreateButton(
QuickCreateButton(text: 'Category 6', onPressed: () {}), text: 'Category 5',
onPressed: () {},
),
QuickCreateButton(
text: 'Category 6',
onPressed: () {},
),
], ],
), ),
], ],
@@ -181,9 +211,11 @@ class _HomeViewState extends State<HomeView> {
matchCount = results[0] as int; matchCount = results[0] as int;
groupCount = results[1] as int; groupCount = results[1] as int;
loadedRecentMatches = results[2] as List<Match>; loadedRecentMatches = results[2] as List<Match>;
recentMatches = (loadedRecentMatches..sort((a, b) => b.createdAt.compareTo(a.createdAt))) recentMatches =
.take(2) (loadedRecentMatches
.toList(); ..sort((a, b) => b.createdAt.compareTo(a.createdAt)))
.take(2)
.toList();
if (mounted) { if (mounted) {
setState(() { setState(() {
isLoading = false; isLoading = false;

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/text_input/custom_search_bar.dart'; import 'package:tallee/presentation/widgets/text_input/custom_search_bar.dart';
import 'package:tallee/presentation/widgets/tiles/group_tile.dart'; import 'package:tallee/presentation/widgets/tiles/group_tile.dart';

View File

@@ -5,10 +5,10 @@ import 'package:tallee/core/constants.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/match_view/create_match/choose_game_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/create_match/choose_game_view.dart';
import 'package:tallee/presentation/views/main_menu/match_view/create_match/choose_group_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/create_match/choose_group_view.dart';

View File

@@ -5,7 +5,7 @@ import 'package:tallee/core/adaptive_page_route.dart';
import 'package:tallee/core/common.dart'; import 'package:tallee/core/common.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/match_view/create_match/create_match_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/create_match/create_match_view.dart';
import 'package:tallee/presentation/views/main_menu/match_view/match_result_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/match_result_view.dart';

View File

@@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/tiles/custom_radio_list_tile.dart'; import 'package:tallee/presentation/widgets/tiles/custom_radio_list_tile.dart';

View File

@@ -6,10 +6,10 @@ import 'package:tallee/core/constants.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/views/main_menu/match_view/create_match/create_match_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/create_match/create_match_view.dart';
import 'package:tallee/presentation/views/main_menu/match_view/match_detail_view.dart'; import 'package:tallee/presentation/views/main_menu/match_view/match_detail_view.dart';

View File

@@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tallee/core/constants.dart'; import 'package:tallee/core/constants.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/app_skeleton.dart'; import 'package:tallee/presentation/widgets/app_skeleton.dart';
import 'package:tallee/presentation/widgets/tiles/statistics_tile.dart'; import 'package:tallee/presentation/widgets/tiles/statistics_tile.dart';
@@ -167,7 +167,8 @@ class _StatisticsViewState extends State<StatisticsView> {
final playerId = winCounts[i].$1; final playerId = winCounts[i].$1;
final player = players.firstWhere( final player = players.firstWhere(
(p) => p.id == playerId, (p) => p.id == playerId,
orElse: () => Player(id: playerId, name: loc.not_available, description: ''), orElse: () =>
Player(id: playerId, name: loc.not_available, description: ''),
); );
winCounts[i] = (player.name, winCounts[i].$2); winCounts[i] = (player.name, winCounts[i].$2);
} }
@@ -208,11 +209,11 @@ class _StatisticsViewState extends State<StatisticsView> {
// -1 means player not found in matchCounts // -1 means player not found in matchCounts
if (index != -1) { if (index != -1) {
final current = matchCounts[index].$2; final current = matchCounts[index].$2;
matchCounts[index] = (playerId, current + 1); matchCounts[index] = (playerId, current + 1);
} else { } else {
matchCounts.add((playerId, 1)); matchCounts.add((playerId, 1));
}
} }
}
} }
// Adding all players with zero matches // Adding all players with zero matches
@@ -229,7 +230,8 @@ class _StatisticsViewState extends State<StatisticsView> {
final playerId = matchCounts[i].$1; final playerId = matchCounts[i].$1;
final player = players.firstWhere( final player = players.firstWhere(
(p) => p.id == playerId, (p) => p.id == playerId,
orElse: () => Player(id: playerId, name: loc.not_available, description: ''), orElse: () =>
Player(id: playerId, name: loc.not_available, description: ''),
); );
matchCounts[i] = (player.name, matchCounts[i].$2); matchCounts[i] = (player.name, matchCounts[i].$2);
} }

View File

@@ -3,7 +3,7 @@ import 'package:provider/provider.dart';
import 'package:tallee/core/constants.dart'; import 'package:tallee/core/constants.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/app_skeleton.dart'; import 'package:tallee/presentation/widgets/app_skeleton.dart';
import 'package:tallee/presentation/widgets/text_input/custom_search_bar.dart'; import 'package:tallee/presentation/widgets/text_input/custom_search_bar.dart';

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/presentation/widgets/tiles/text_icon_tile.dart'; import 'package:tallee/presentation/widgets/tiles/text_icon_tile.dart';
class GroupTile extends StatefulWidget { class GroupTile extends StatefulWidget {

View File

@@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:tallee/core/common.dart'; import 'package:tallee/core/common.dart';
import 'package:tallee/core/custom_theme.dart'; import 'package:tallee/core/custom_theme.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/l10n/generated/app_localizations.dart'; import 'package:tallee/l10n/generated/app_localizations.dart';
import 'package:tallee/presentation/widgets/tiles/text_icon_tile.dart'; import 'package:tallee/presentation/widgets/tiles/text_icon_tile.dart';

View File

@@ -8,11 +8,11 @@ import 'package:json_schema/json_schema.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/data/dto/team.dart'; import 'package:tallee/data/models/team.dart';
class DataTransferService { class DataTransferService {
/// Deletes all data from the database. /// Deletes all data from the database.
@@ -40,33 +40,39 @@ class DataTransferService {
'players': players.map((p) => p.toJson()).toList(), 'players': players.map((p) => p.toJson()).toList(),
'games': games.map((g) => g.toJson()).toList(), 'games': games.map((g) => g.toJson()).toList(),
'groups': groups 'groups': groups
.map((g) => { .map(
'id': g.id, (g) => {
'name': g.name, 'id': g.id,
'description': g.description, 'name': g.name,
'createdAt': g.createdAt.toIso8601String(), 'description': g.description,
'memberIds': (g.members).map((m) => m.id).toList(), 'createdAt': g.createdAt.toIso8601String(),
}) 'memberIds': (g.members).map((m) => m.id).toList(),
},
)
.toList(), .toList(),
'teams': teams 'teams': teams
.map((t) => { .map(
'id': t.id, (t) => {
'name': t.name, 'id': t.id,
'createdAt': t.createdAt.toIso8601String(), 'name': t.name,
'memberIds': (t.members).map((m) => m.id).toList(), 'createdAt': t.createdAt.toIso8601String(),
}) 'memberIds': (t.members).map((m) => m.id).toList(),
},
)
.toList(), .toList(),
'matches': matches 'matches': matches
.map((m) => { .map(
'id': m.id, (m) => {
'name': m.name, 'id': m.id,
'createdAt': m.createdAt.toIso8601String(), 'name': m.name,
'endedAt': m.endedAt?.toIso8601String(), 'createdAt': m.createdAt.toIso8601String(),
'gameId': m.game.id, 'endedAt': m.endedAt?.toIso8601String(),
'groupId': m.group?.id, 'gameId': m.game.id,
'playerIds': m.players.map((p) => p.id).toList(), 'groupId': m.group?.id,
'notes': m.notes, 'playerIds': m.players.map((p) => p.id).toList(),
}) 'notes': m.notes,
},
)
.toList(), .toList(),
}; };
@@ -79,9 +85,9 @@ class DataTransferService {
/// [jsonString] The JSON string to be exported. /// [jsonString] The JSON string to be exported.
/// [fileName] The desired name for the exported file (without extension). /// [fileName] The desired name for the exported file (without extension).
static Future<ExportResult> exportData( static Future<ExportResult> exportData(
String jsonString, String jsonString,
String fileName String fileName,
) async { ) async {
try { try {
final bytes = Uint8List.fromList(utf8.encode(jsonString)); final bytes = Uint8List.fromList(utf8.encode(jsonString));
final path = await FilePicker.platform.saveFile( final path = await FilePicker.platform.saveFile(
@@ -94,7 +100,6 @@ class DataTransferService {
} else { } else {
return ExportResult.success; return ExportResult.success;
} }
} catch (e, stack) { } catch (e, stack) {
print('[exportData] $e'); print('[exportData] $e');
print(stack); print(stack);
@@ -122,13 +127,19 @@ class DataTransferService {
final isValid = await _validateJsonSchema(jsonString); final isValid = await _validateJsonSchema(jsonString);
if (!isValid) return ImportResult.invalidSchema; if (!isValid) return ImportResult.invalidSchema;
final Map<String, dynamic> decoded = json.decode(jsonString) as Map<String, dynamic>; final Map<String, dynamic> decoded =
json.decode(jsonString) as Map<String, dynamic>;
final List<dynamic> playersJson = (decoded['players'] as List<dynamic>?) ?? []; final List<dynamic> playersJson =
final List<dynamic> gamesJson = (decoded['games'] as List<dynamic>?) ?? []; (decoded['players'] as List<dynamic>?) ?? [];
final List<dynamic> groupsJson = (decoded['groups'] as List<dynamic>?) ?? []; final List<dynamic> gamesJson =
final List<dynamic> teamsJson = (decoded['teams'] as List<dynamic>?) ?? []; (decoded['games'] as List<dynamic>?) ?? [];
final List<dynamic> matchesJson = (decoded['matches'] as List<dynamic>?) ?? []; final List<dynamic> groupsJson =
(decoded['groups'] as List<dynamic>?) ?? [];
final List<dynamic> teamsJson =
(decoded['teams'] as List<dynamic>?) ?? [];
final List<dynamic> matchesJson =
(decoded['matches'] as List<dynamic>?) ?? [];
// Import Players // Import Players
final List<Player> importedPlayers = playersJson final List<Player> importedPlayers = playersJson
@@ -151,7 +162,8 @@ class DataTransferService {
// Import Groups // Import Groups
final List<Group> importedGroups = groupsJson.map((g) { final List<Group> importedGroups = groupsJson.map((g) {
final map = g as Map<String, dynamic>; final map = g as Map<String, dynamic>;
final memberIds = (map['memberIds'] as List<dynamic>? ?? []).cast<String>(); final memberIds = (map['memberIds'] as List<dynamic>? ?? [])
.cast<String>();
final members = memberIds final members = memberIds
.map((id) => playerById[id]) .map((id) => playerById[id])
@@ -174,7 +186,8 @@ class DataTransferService {
// Import Teams // Import Teams
final List<Team> importedTeams = teamsJson.map((t) { final List<Team> importedTeams = teamsJson.map((t) {
final map = t as Map<String, dynamic>; final map = t as Map<String, dynamic>;
final memberIds = (map['memberIds'] as List<dynamic>? ?? []).cast<String>(); final memberIds = (map['memberIds'] as List<dynamic>? ?? [])
.cast<String>();
final members = memberIds final members = memberIds
.map((id) => playerById[id]) .map((id) => playerById[id])
@@ -195,8 +208,11 @@ class DataTransferService {
final String gameId = map['gameId'] as String; final String gameId = map['gameId'] as String;
final String? groupId = map['groupId'] as String?; final String? groupId = map['groupId'] as String?;
final List<String> playerIds = (map['playerIds'] as List<dynamic>? ?? []).cast<String>(); final List<String> playerIds =
final DateTime? endedAt = map['endedAt'] != null ? DateTime.parse(map['endedAt'] as String) : null; (map['playerIds'] as List<dynamic>? ?? []).cast<String>();
final DateTime? endedAt = map['endedAt'] != null
? DateTime.parse(map['endedAt'] as String)
: null;
final game = gameById[gameId]; final game = gameById[gameId];
final group = (groupId == null) ? null : groupById[groupId]; final group = (groupId == null) ? null : groupById[groupId];
@@ -208,7 +224,15 @@ class DataTransferService {
return Match( return Match(
id: map['id'] as String, id: map['id'] as String,
name: map['name'] as String, name: map['name'] as String,
game: game ?? Game(name: 'Unknown', ruleset: Ruleset.singleWinner, description: '', color: GameColor.blue, icon: ''), game:
game ??
Game(
name: 'Unknown',
ruleset: Ruleset.singleWinner,
description: '',
color: GameColor.blue,
icon: '',
),
group: group, group: group,
players: players, players: players,
createdAt: DateTime.parse(map['createdAt'] as String), createdAt: DateTime.parse(map['createdAt'] as String),
@@ -266,4 +290,4 @@ class DataTransferService {
return false; return false;
} }
} }
} }

View File

@@ -3,8 +3,8 @@ import 'package:drift/drift.dart' hide isNull;
import 'package:drift/native.dart'; import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -62,7 +62,6 @@ void main() {
await database.close(); await database.close();
}); });
group('Group Tests', () { group('Group Tests', () {
// Verifies that a single group can be added and retrieved with all fields and members intact. // Verifies that a single group can be added and retrieved with all fields and members intact.
test('Adding and fetching a single group works correctly', () async { test('Adding and fetching a single group works correctly', () async {
await database.groupDao.addGroup(group: testGroup1); await database.groupDao.addGroup(group: testGroup1);
@@ -277,20 +276,20 @@ void main() {
}); });
// Verifies that updateGroupDescription returns false for a non-existent group. // Verifies that updateGroupDescription returns false for a non-existent group.
test('updateGroupDescription returns false for non-existent group', test(
() async { 'updateGroupDescription returns false for non-existent group',
final updated = await database.groupDao.updateGroupDescription( () async {
groupId: 'non-existent-id', final updated = await database.groupDao.updateGroupDescription(
newDescription: 'New Description', groupId: 'non-existent-id',
); newDescription: 'New Description',
expect(updated, false); );
}); expect(updated, false);
},
);
// Verifies that deleteAllGroups removes all groups from the database. // Verifies that deleteAllGroups removes all groups from the database.
test('deleteAllGroups removes all groups', () async { test('deleteAllGroups removes all groups', () async {
await database.groupDao.addGroupsAsList( await database.groupDao.addGroupsAsList(groups: [testGroup1, testGroup2]);
groups: [testGroup1, testGroup2],
);
final countBefore = await database.groupDao.getGroupCount(); final countBefore = await database.groupDao.getGroupCount();
expect(countBefore, 2); expect(countBefore, 2);

View File

@@ -4,10 +4,10 @@ import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;

View File

@@ -2,12 +2,12 @@ import 'package:clock/clock.dart';
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:drift/native.dart'; import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart';
import 'package:tallee/data/dto/match.dart';
import 'package:tallee/data/dto/player.dart';
import 'package:tallee/data/dto/team.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/models/player.dart';
import 'package:tallee/data/models/team.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -37,20 +37,23 @@ void main() {
testPlayer2 = Player(name: 'Bob', description: ''); testPlayer2 = Player(name: 'Bob', description: '');
testPlayer3 = Player(name: 'Charlie', description: ''); testPlayer3 = Player(name: 'Charlie', description: '');
testPlayer4 = Player(name: 'Diana', description: ''); testPlayer4 = Player(name: 'Diana', description: '');
testTeam1 = Team( testTeam1 = Team(name: 'Team Alpha', members: [testPlayer1, testPlayer2]);
name: 'Team Alpha', testTeam2 = Team(name: 'Team Beta', members: [testPlayer3, testPlayer4]);
members: [testPlayer1, testPlayer2], testTeam3 = Team(name: 'Team Gamma', members: [testPlayer1, testPlayer3]);
testGame1 = Game(
name: 'Game 1',
ruleset: Ruleset.singleWinner,
description: 'Test game 1',
color: GameColor.blue,
icon: '',
); );
testTeam2 = Team( testGame2 = Game(
name: 'Team Beta', name: 'Game 2',
members: [testPlayer3, testPlayer4], ruleset: Ruleset.highestScore,
description: 'Test game 2',
color: GameColor.red,
icon: '',
); );
testTeam3 = Team(
name: 'Team Gamma',
members: [testPlayer1, testPlayer3],
);
testGame1 = Game(name: 'Game 1', ruleset: Ruleset.singleWinner, description: 'Test game 1', color: GameColor.blue, icon: '');
testGame2 = Game(name: 'Game 2', ruleset: Ruleset.highestScore, description: 'Test game 2', color: GameColor.red, icon: '');
}); });
await database.playerDao.addPlayersAsList( await database.playerDao.addPlayersAsList(
@@ -65,7 +68,6 @@ void main() {
}); });
group('Team Tests', () { group('Team Tests', () {
// Verifies that a single team can be added and retrieved with all fields intact. // Verifies that a single team can be added and retrieved with all fields intact.
test('Adding and fetching a single team works correctly', () async { test('Adding and fetching a single team works correctly', () async {
final added = await database.teamDao.addTeam(team: testTeam1); final added = await database.teamDao.addTeam(team: testTeam1);
@@ -285,10 +287,7 @@ void main() {
test('Updating team name to empty string works', () async { test('Updating team name to empty string works', () async {
await database.teamDao.addTeam(team: testTeam1); await database.teamDao.addTeam(team: testTeam1);
await database.teamDao.updateTeamName( await database.teamDao.updateTeamName(teamId: testTeam1.id, newName: '');
teamId: testTeam1.id,
newName: '',
);
final updatedTeam = await database.teamDao.getTeamById( final updatedTeam = await database.teamDao.getTeamById(
teamId: testTeam1.id, teamId: testTeam1.id,
@@ -350,9 +349,7 @@ void main() {
await database.matchDao.addMatch(match: match2); await database.matchDao.addMatch(match: match2);
// Add teams to database // Add teams to database
await database.teamDao.addTeamsAsList( await database.teamDao.addTeamsAsList(teams: [testTeam1, testTeam3]);
teams: [testTeam1, testTeam3],
);
// Associate players with teams through match1 // Associate players with teams through match1
// testTeam1: player1, player2 // testTeam1: player1, player2
@@ -420,10 +417,11 @@ void main() {
final allTeams = await database.teamDao.getAllTeams(); final allTeams = await database.teamDao.getAllTeams();
expect(allTeams.length, 3); expect(allTeams.length, 3);
expect( expect(allTeams.map((t) => t.id).toSet(), {
allTeams.map((t) => t.id).toSet(), testTeam1.id,
{testTeam1.id, testTeam2.id, testTeam3.id}, testTeam2.id,
); testTeam3.id,
});
}); });
// Verifies that teamExists returns false for deleted teams. // Verifies that teamExists returns false for deleted teams.
@@ -462,9 +460,7 @@ void main() {
// Verifies that addTeam after deleteAllTeams works correctly. // Verifies that addTeam after deleteAllTeams works correctly.
test('Adding team after deleteAllTeams works correctly', () async { test('Adding team after deleteAllTeams works correctly', () async {
await database.teamDao.addTeamsAsList( await database.teamDao.addTeamsAsList(teams: [testTeam1, testTeam2]);
teams: [testTeam1, testTeam2],
);
expect(await database.teamDao.getTeamCount(), 2); expect(await database.teamDao.getTeamCount(), 2);
await database.teamDao.deleteAllTeams(); await database.teamDao.deleteAllTeams();
@@ -524,4 +520,4 @@ void main() {
expect(fetchedTeam.createdAt, testTeam1.createdAt); expect(fetchedTeam.createdAt, testTeam1.createdAt);
}); });
}); });
} }

View File

@@ -4,7 +4,7 @@ import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -54,7 +54,6 @@ void main() {
}); });
group('Game Tests', () { group('Game Tests', () {
// Verifies that getAllGames returns an empty list when the database has no games. // Verifies that getAllGames returns an empty list when the database has no games.
test('getAllGames returns empty list when no games exist', () async { test('getAllGames returns empty list when no games exist', () async {
final allGames = await database.gameDao.getAllGames(); final allGames = await database.gameDao.getAllGames();
@@ -106,7 +105,7 @@ void main() {
// Verifies that getGameById throws a StateError when the game doesn't exist. // Verifies that getGameById throws a StateError when the game doesn't exist.
test('getGameById throws exception for non-existent game', () async { test('getGameById throws exception for non-existent game', () async {
expect( expect(
() => database.gameDao.getGameById(gameId: 'non-existent-id'), () => database.gameDao.getGameById(gameId: 'non-existent-id'),
throwsA(isA<StateError>()), throwsA(isA<StateError>()),
); );
}); });
@@ -134,7 +133,13 @@ void main() {
// Verifies that a game with empty optional fields can be added and retrieved. // Verifies that a game with empty optional fields can be added and retrieved.
test('addGame handles game with null optional fields', () async { test('addGame handles game with null optional fields', () async {
final gameWithNulls = Game(name: 'Simple Game', ruleset: Ruleset.lowestScore, description: 'A simple game', color: GameColor.green, icon: ''); final gameWithNulls = Game(
name: 'Simple Game',
ruleset: Ruleset.lowestScore,
description: 'A simple game',
color: GameColor.green,
icon: '',
);
final result = await database.gameDao.addGame(game: gameWithNulls); final result = await database.gameDao.addGame(game: gameWithNulls);
expect(result, true); expect(result, true);
@@ -419,9 +424,7 @@ void main() {
// Verifies that getGameCount updates correctly after deleting a game. // Verifies that getGameCount updates correctly after deleting a game.
test('getGameCount updates correctly after deletion', () async { test('getGameCount updates correctly after deletion', () async {
await database.gameDao.addGamesAsList( await database.gameDao.addGamesAsList(games: [testGame1, testGame2]);
games: [testGame1, testGame2],
);
final countBefore = await database.gameDao.getGameCount(); final countBefore = await database.gameDao.getGameCount();
expect(countBefore, 2); expect(countBefore, 2);

View File

@@ -3,7 +3,7 @@ import 'package:drift/drift.dart' hide isNull;
import 'package:drift/native.dart'; import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -35,7 +35,6 @@ void main() {
}); });
group('Player Tests', () { group('Player Tests', () {
// Verifies that players can be added and retrieved with all fields intact. // Verifies that players can be added and retrieved with all fields intact.
test('Adding and fetching single player works correctly', () async { test('Adding and fetching single player works correctly', () async {
await database.playerDao.addPlayer(player: testPlayer1); await database.playerDao.addPlayer(player: testPlayer1);
@@ -264,16 +263,22 @@ void main() {
}); });
// Verifies that a player with special characters in name is stored correctly. // Verifies that a player with special characters in name is stored correctly.
test('Player with special characters in name is stored correctly', () async { test(
final specialPlayer = Player(name: 'Test!@#\$%^&*()_+-=[]{}|;\':",.<>?/`~', description: ''); 'Player with special characters in name is stored correctly',
() async {
final specialPlayer = Player(
name: 'Test!@#\$%^&*()_+-=[]{}|;\':",.<>?/`~',
description: '',
);
await database.playerDao.addPlayer(player: specialPlayer); await database.playerDao.addPlayer(player: specialPlayer);
final fetchedPlayer = await database.playerDao.getPlayerById( final fetchedPlayer = await database.playerDao.getPlayerById(
playerId: specialPlayer.id, playerId: specialPlayer.id,
); );
expect(fetchedPlayer.name, specialPlayer.name); expect(fetchedPlayer.name, specialPlayer.name);
}); },
);
// Verifies that a player with description is stored correctly. // Verifies that a player with description is stored correctly.
test('Player with description is stored correctly', () async { test('Player with description is stored correctly', () async {
@@ -293,7 +298,10 @@ void main() {
// Verifies that a player with null description is stored correctly. // Verifies that a player with null description is stored correctly.
test('Player with null description is stored correctly', () async { test('Player with null description is stored correctly', () async {
final playerWithoutDescription = Player(name: 'No Description Player', description: ''); final playerWithoutDescription = Player(
name: 'No Description Player',
description: '',
);
await database.playerDao.addPlayer(player: playerWithoutDescription); await database.playerDao.addPlayer(player: playerWithoutDescription);

View File

@@ -3,8 +3,8 @@ import 'package:drift/drift.dart';
import 'package:drift/native.dart'; import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -42,7 +42,6 @@ void main() {
}); });
group('Player-Group Tests', () { group('Player-Group Tests', () {
// Verifies that a player can be added to an existing group and isPlayerInGroup returns true. // Verifies that a player can be added to an existing group and isPlayerInGroup returns true.
test('Adding a player to a group works correctly', () async { test('Adding a player to a group works correctly', () async {
await database.groupDao.addGroup(group: testGroup); await database.groupDao.addGroup(group: testGroup);
@@ -127,67 +126,83 @@ void main() {
}); });
// Verifies that addPlayerToGroup returns false when player already in group. // Verifies that addPlayerToGroup returns false when player already in group.
test('addPlayerToGroup returns false when player already in group', () async { test(
await database.groupDao.addGroup(group: testGroup); 'addPlayerToGroup returns false when player already in group',
() async {
await database.groupDao.addGroup(group: testGroup);
// testPlayer1 is already in testGroup via group creation // testPlayer1 is already in testGroup via group creation
final result = await database.playerGroupDao.addPlayerToGroup( final result = await database.playerGroupDao.addPlayerToGroup(
player: testPlayer1, player: testPlayer1,
groupId: testGroup.id, groupId: testGroup.id,
); );
expect(result, false); expect(result, false);
}); },
);
// Verifies that addPlayerToGroup adds player to player table if not exists. // Verifies that addPlayerToGroup adds player to player table if not exists.
test('addPlayerToGroup adds player to player table if not exists', () async { test(
await database.groupDao.addGroup(group: testGroup); 'addPlayerToGroup adds player to player table if not exists',
() async {
await database.groupDao.addGroup(group: testGroup);
// testPlayer4 is not in the database yet // testPlayer4 is not in the database yet
var playerExists = await database.playerDao.playerExists( var playerExists = await database.playerDao.playerExists(
playerId: testPlayer4.id, playerId: testPlayer4.id,
); );
expect(playerExists, false); expect(playerExists, false);
await database.playerGroupDao.addPlayerToGroup( await database.playerGroupDao.addPlayerToGroup(
player: testPlayer4, player: testPlayer4,
groupId: testGroup.id, groupId: testGroup.id,
); );
// Now player should exist in player table // Now player should exist in player table
playerExists = await database.playerDao.playerExists( playerExists = await database.playerDao.playerExists(
playerId: testPlayer4.id, playerId: testPlayer4.id,
); );
expect(playerExists, true); expect(playerExists, true);
}); },
);
// Verifies that removePlayerFromGroup returns false for non-existent player. // Verifies that removePlayerFromGroup returns false for non-existent player.
test('removePlayerFromGroup returns false for non-existent player', () async { test(
await database.groupDao.addGroup(group: testGroup); 'removePlayerFromGroup returns false for non-existent player',
() async {
await database.groupDao.addGroup(group: testGroup);
final result = await database.playerGroupDao.removePlayerFromGroup( final result = await database.playerGroupDao.removePlayerFromGroup(
playerId: 'non-existent-player-id', playerId: 'non-existent-player-id',
groupId: testGroup.id, groupId: testGroup.id,
); );
expect(result, false); expect(result, false);
}); },
);
// Verifies that removePlayerFromGroup returns false for non-existent group. // Verifies that removePlayerFromGroup returns false for non-existent group.
test('removePlayerFromGroup returns false for non-existent group', () async { test(
await database.playerDao.addPlayer(player: testPlayer1); 'removePlayerFromGroup returns false for non-existent group',
() async {
await database.playerDao.addPlayer(player: testPlayer1);
final result = await database.playerGroupDao.removePlayerFromGroup( final result = await database.playerGroupDao.removePlayerFromGroup(
playerId: testPlayer1.id, playerId: testPlayer1.id,
groupId: 'non-existent-group-id', groupId: 'non-existent-group-id',
); );
expect(result, false); expect(result, false);
}); },
);
// Verifies that getPlayersOfGroup returns empty list for group with no members. // Verifies that getPlayersOfGroup returns empty list for group with no members.
test('getPlayersOfGroup returns empty list for empty group', () async { test('getPlayersOfGroup returns empty list for empty group', () async {
final emptyGroup = Group(name: 'Empty Group', description: '', members: []); final emptyGroup = Group(
name: 'Empty Group',
description: '',
members: [],
);
await database.groupDao.addGroup(group: emptyGroup); await database.groupDao.addGroup(group: emptyGroup);
final players = await database.playerGroupDao.getPlayersOfGroup( final players = await database.playerGroupDao.getPlayersOfGroup(
@@ -198,13 +213,16 @@ void main() {
}); });
// Verifies that getPlayersOfGroup returns empty list for non-existent group. // Verifies that getPlayersOfGroup returns empty list for non-existent group.
test('getPlayersOfGroup returns empty list for non-existent group', () async { test(
final players = await database.playerGroupDao.getPlayersOfGroup( 'getPlayersOfGroup returns empty list for non-existent group',
groupId: 'non-existent-group-id', () async {
); final players = await database.playerGroupDao.getPlayersOfGroup(
groupId: 'non-existent-group-id',
);
expect(players, isEmpty); expect(players, isEmpty);
}); },
);
// Verifies that removing all players from a group leaves the group empty. // Verifies that removing all players from a group leaves the group empty.
test('Removing all players from a group leaves group empty', () async { test('Removing all players from a group leaves group empty', () async {
@@ -231,7 +249,11 @@ void main() {
// Verifies that a player can be in multiple groups. // Verifies that a player can be in multiple groups.
test('Player can be in multiple groups', () async { test('Player can be in multiple groups', () async {
final secondGroup = Group(name: 'Second Group', description: '', members: []); final secondGroup = Group(
name: 'Second Group',
description: '',
members: [],
);
await database.groupDao.addGroup(group: testGroup); await database.groupDao.addGroup(group: testGroup);
await database.groupDao.addGroup(group: secondGroup); await database.groupDao.addGroup(group: secondGroup);
@@ -255,29 +277,36 @@ void main() {
}); });
// Verifies that removing player from one group doesn't affect other groups. // Verifies that removing player from one group doesn't affect other groups.
test('Removing player from one group does not affect other groups', () async { test(
final secondGroup = Group(name: 'Second Group', description: '', members: [testPlayer1]); 'Removing player from one group does not affect other groups',
await database.groupDao.addGroup(group: testGroup); () async {
await database.groupDao.addGroup(group: secondGroup); final secondGroup = Group(
name: 'Second Group',
description: '',
members: [testPlayer1],
);
await database.groupDao.addGroup(group: testGroup);
await database.groupDao.addGroup(group: secondGroup);
// Remove testPlayer1 from testGroup // Remove testPlayer1 from testGroup
await database.playerGroupDao.removePlayerFromGroup( await database.playerGroupDao.removePlayerFromGroup(
playerId: testPlayer1.id, playerId: testPlayer1.id,
groupId: testGroup.id, groupId: testGroup.id,
); );
final inFirstGroup = await database.playerGroupDao.isPlayerInGroup( final inFirstGroup = await database.playerGroupDao.isPlayerInGroup(
playerId: testPlayer1.id, playerId: testPlayer1.id,
groupId: testGroup.id, groupId: testGroup.id,
); );
final inSecondGroup = await database.playerGroupDao.isPlayerInGroup( final inSecondGroup = await database.playerGroupDao.isPlayerInGroup(
playerId: testPlayer1.id, playerId: testPlayer1.id,
groupId: secondGroup.id, groupId: secondGroup.id,
); );
expect(inFirstGroup, false); expect(inFirstGroup, false);
expect(inSecondGroup, true); expect(inSecondGroup, true);
}); },
);
// Verifies that addPlayerToGroup returns true on successful addition. // Verifies that addPlayerToGroup returns true on successful addition.
test('addPlayerToGroup returns true on successful addition', () async { test('addPlayerToGroup returns true on successful addition', () async {
@@ -293,21 +322,26 @@ void main() {
}); });
// Verifies that removing the same player twice returns false on second attempt. // Verifies that removing the same player twice returns false on second attempt.
test('Removing same player twice returns false on second attempt', () async { test(
await database.groupDao.addGroup(group: testGroup); 'Removing same player twice returns false on second attempt',
() async {
await database.groupDao.addGroup(group: testGroup);
final firstRemoval = await database.playerGroupDao.removePlayerFromGroup( final firstRemoval = await database.playerGroupDao
playerId: testPlayer1.id, .removePlayerFromGroup(
groupId: testGroup.id, playerId: testPlayer1.id,
); groupId: testGroup.id,
expect(firstRemoval, true); );
expect(firstRemoval, true);
final secondRemoval = await database.playerGroupDao.removePlayerFromGroup( final secondRemoval = await database.playerGroupDao
playerId: testPlayer1.id, .removePlayerFromGroup(
groupId: testGroup.id, playerId: testPlayer1.id,
); groupId: testGroup.id,
expect(secondRemoval, false); );
}); expect(secondRemoval, false);
},
);
// Verifies that replaceGroupPlayers removes all existing players and replaces with new list. // Verifies that replaceGroupPlayers removes all existing players and replaces with new list.
test('replaceGroupPlayers replaces all group members correctly', () async { test('replaceGroupPlayers replaces all group members correctly', () async {

View File

@@ -4,11 +4,11 @@ import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart'; import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart'; import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/dto/group.dart'; import 'package:tallee/data/models/group.dart';
import 'package:tallee/data/dto/match.dart'; import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/dto/player.dart'; import 'package:tallee/data/models/player.dart';
import 'package:tallee/data/dto/team.dart'; import 'package:tallee/data/models/team.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -48,7 +48,13 @@ void main() {
description: '', description: '',
members: [testPlayer1, testPlayer2, testPlayer3], members: [testPlayer1, testPlayer2, testPlayer3],
); );
testGame = Game(name: 'Test Game', ruleset: Ruleset.singleWinner, description: 'A test game', color: GameColor.blue, icon: ''); testGame = Game(
name: 'Test Game',
ruleset: Ruleset.singleWinner,
description: 'A test game',
color: GameColor.blue,
icon: '',
);
testMatchOnlyGroup = Match( testMatchOnlyGroup = Match(
name: 'Test Match with Group', name: 'Test Match with Group',
game: testGame, game: testGame,
@@ -61,14 +67,8 @@ void main() {
players: [testPlayer4, testPlayer5, testPlayer6], players: [testPlayer4, testPlayer5, testPlayer6],
notes: '', notes: '',
); );
testTeam1 = Team( testTeam1 = Team(name: 'Team Alpha', members: [testPlayer1, testPlayer2]);
name: 'Team Alpha', testTeam2 = Team(name: 'Team Beta', members: [testPlayer3, testPlayer4]);
members: [testPlayer1, testPlayer2],
);
testTeam2 = Team(
name: 'Team Beta',
members: [testPlayer3, testPlayer4],
);
}); });
await database.playerDao.addPlayersAsList( await database.playerDao.addPlayersAsList(
players: [ players: [
@@ -88,7 +88,6 @@ void main() {
}); });
group('Player-Match Tests', () { group('Player-Match Tests', () {
// Verifies that matchHasPlayers returns false initially and true after adding a player. // Verifies that matchHasPlayers returns false initially and true after adding a player.
test('Match has player works correctly', () async { test('Match has player works correctly', () async {
await database.matchDao.addMatch(match: testMatchOnlyGroup); await database.matchDao.addMatch(match: testMatchOnlyGroup);
@@ -153,26 +152,23 @@ void main() {
); );
expect(result.players.length, testMatchOnlyPlayers.players.length - 1); expect(result.players.length, testMatchOnlyPlayers.players.length - 1);
final playerExists = result.players.any( final playerExists = result.players.any((p) => p.id == playerToRemove.id);
(p) => p.id == playerToRemove.id,
);
expect(playerExists, false); expect(playerExists, false);
}); });
// Verifies that getPlayersOfMatch returns all players of a match with correct data. // Verifies that getPlayersOfMatch returns all players of a match with correct data.
test('Retrieving players of a match works correctly', () async { test('Retrieving players of a match works correctly', () async {
await database.matchDao.addMatch(match: testMatchOnlyPlayers); await database.matchDao.addMatch(match: testMatchOnlyPlayers);
final players = await database.playerMatchDao.getPlayersOfMatch( final players =
matchId: testMatchOnlyPlayers.id, await database.playerMatchDao.getPlayersOfMatch(
) ?? []; matchId: testMatchOnlyPlayers.id,
) ??
[];
for (int i = 0; i < players.length; i++) { for (int i = 0; i < players.length; i++) {
expect(players[i].id, testMatchOnlyPlayers.players[i].id); expect(players[i].id, testMatchOnlyPlayers.players[i].id);
expect(players[i].name, testMatchOnlyPlayers.players[i].name); expect(players[i].name, testMatchOnlyPlayers.players[i].name);
expect( expect(players[i].createdAt, testMatchOnlyPlayers.players[i].createdAt);
players[i].createdAt,
testMatchOnlyPlayers.players[i].createdAt,
);
} }
}); });
@@ -223,10 +219,20 @@ void main() {
// Verifies that the same player can be added to multiple different matches. // Verifies that the same player can be added to multiple different matches.
test( test(
'Adding the same player to separate matches works correctly', 'Adding the same player to separate matches works correctly',
() async { () async {
final playersList = [testPlayer1, testPlayer2, testPlayer3]; final playersList = [testPlayer1, testPlayer2, testPlayer3];
final match1 = Match(name: 'Match 1', game: testGame, players: playersList, notes: ''); final match1 = Match(
final match2 = Match(name: 'Match 2', game: testGame, players: playersList, notes: ''); name: 'Match 1',
game: testGame,
players: playersList,
notes: '',
);
final match2 = Match(
name: 'Match 2',
game: testGame,
players: playersList,
notes: '',
);
await Future.wait([ await Future.wait([
database.matchDao.addMatch(match: match1), database.matchDao.addMatch(match: match1),
@@ -299,16 +305,19 @@ void main() {
}); });
// Verifies that getPlayerScore returns null for non-existent player-match combination. // Verifies that getPlayerScore returns null for non-existent player-match combination.
test('getPlayerScore returns null for non-existent player in match', () async { test(
await database.matchDao.addMatch(match: testMatchOnlyGroup); 'getPlayerScore returns null for non-existent player in match',
() async {
await database.matchDao.addMatch(match: testMatchOnlyGroup);
final score = await database.playerMatchDao.getPlayerScore( final score = await database.playerMatchDao.getPlayerScore(
matchId: testMatchOnlyGroup.id, matchId: testMatchOnlyGroup.id,
playerId: 'non-existent-player-id', playerId: 'non-existent-player-id',
); );
expect(score, isNull); expect(score, isNull);
}); },
);
// Verifies that updatePlayerScore updates the score correctly. // Verifies that updatePlayerScore updates the score correctly.
test('updatePlayerScore updates score correctly', () async { test('updatePlayerScore updates score correctly', () async {
@@ -331,17 +340,20 @@ void main() {
}); });
// Verifies that updatePlayerScore returns false for non-existent player-match. // Verifies that updatePlayerScore returns false for non-existent player-match.
test('updatePlayerScore returns false for non-existent player-match', () async { test(
await database.matchDao.addMatch(match: testMatchOnlyGroup); 'updatePlayerScore returns false for non-existent player-match',
() async {
await database.matchDao.addMatch(match: testMatchOnlyGroup);
final updated = await database.playerMatchDao.updatePlayerScore( final updated = await database.playerMatchDao.updatePlayerScore(
matchId: testMatchOnlyGroup.id, matchId: testMatchOnlyGroup.id,
playerId: 'non-existent-player-id', playerId: 'non-existent-player-id',
newScore: 50, newScore: 50,
); );
expect(updated, false); expect(updated, false);
}); },
);
// Verifies that adding a player with teamId works correctly. // Verifies that adding a player with teamId works correctly.
test('Adding player with teamId works correctly', () async { test('Adding player with teamId works correctly', () async {
@@ -431,17 +443,20 @@ void main() {
}); });
// Verifies that updatePlayerTeam returns false for non-existent player-match. // Verifies that updatePlayerTeam returns false for non-existent player-match.
test('updatePlayerTeam returns false for non-existent player-match', () async { test(
await database.matchDao.addMatch(match: testMatchOnlyGroup); 'updatePlayerTeam returns false for non-existent player-match',
() async {
await database.matchDao.addMatch(match: testMatchOnlyGroup);
final updated = await database.playerMatchDao.updatePlayerTeam( final updated = await database.playerMatchDao.updatePlayerTeam(
matchId: testMatchOnlyGroup.id, matchId: testMatchOnlyGroup.id,
playerId: 'non-existent-player-id', playerId: 'non-existent-player-id',
teamId: testTeam1.id, teamId: testTeam1.id,
); );
expect(updated, false); expect(updated, false);
}); },
);
// Verifies that getPlayersInTeam returns empty list for non-existent team. // Verifies that getPlayersInTeam returns empty list for non-existent team.
test('getPlayersInTeam returns empty list for non-existent team', () async { test('getPlayersInTeam returns empty list for non-existent team', () async {
@@ -483,16 +498,19 @@ void main() {
}); });
// Verifies that removePlayerFromMatch returns false for non-existent player. // Verifies that removePlayerFromMatch returns false for non-existent player.
test('removePlayerFromMatch returns false for non-existent player', () async { test(
await database.matchDao.addMatch(match: testMatchOnlyPlayers); 'removePlayerFromMatch returns false for non-existent player',
() async {
await database.matchDao.addMatch(match: testMatchOnlyPlayers);
final removed = await database.playerMatchDao.removePlayerFromMatch( final removed = await database.playerMatchDao.removePlayerFromMatch(
playerId: 'non-existent-player-id', playerId: 'non-existent-player-id',
matchId: testMatchOnlyPlayers.id, matchId: testMatchOnlyPlayers.id,
); );
expect(removed, false); expect(removed, false);
}); },
);
// Verifies that adding the same player twice to the same match is ignored. // Verifies that adding the same player twice to the same match is ignored.
test('Adding same player twice to same match is ignored', () async { test('Adding same player twice to same match is ignored', () async {
@@ -528,27 +546,30 @@ void main() {
}); });
// Verifies that updatePlayersFromMatch with empty list removes all players. // Verifies that updatePlayersFromMatch with empty list removes all players.
test('updatePlayersFromMatch with empty list removes all players', () async { test(
await database.matchDao.addMatch(match: testMatchOnlyPlayers); 'updatePlayersFromMatch with empty list removes all players',
() async {
await database.matchDao.addMatch(match: testMatchOnlyPlayers);
// Verify players exist initially // Verify players exist initially
var players = await database.playerMatchDao.getPlayersOfMatch( var players = await database.playerMatchDao.getPlayersOfMatch(
matchId: testMatchOnlyPlayers.id, matchId: testMatchOnlyPlayers.id,
); );
expect(players?.length, 3); expect(players?.length, 3);
// Update with empty list // Update with empty list
await database.playerMatchDao.updatePlayersFromMatch( await database.playerMatchDao.updatePlayersFromMatch(
matchId: testMatchOnlyPlayers.id, matchId: testMatchOnlyPlayers.id,
newPlayer: [], newPlayer: [],
); );
// Verify all players are removed // Verify all players are removed
players = await database.playerMatchDao.getPlayersOfMatch( players = await database.playerMatchDao.getPlayersOfMatch(
matchId: testMatchOnlyPlayers.id, matchId: testMatchOnlyPlayers.id,
); );
expect(players, isNull); expect(players, isNull);
}); },
);
// Verifies that updatePlayersFromMatch with same players makes no changes. // Verifies that updatePlayersFromMatch with same players makes no changes.
test('updatePlayersFromMatch with same players makes no changes', () async { test('updatePlayersFromMatch with same players makes no changes', () async {
@@ -702,16 +723,19 @@ void main() {
}); });
// Verifies that getPlayersInTeam returns empty list for non-existent match. // Verifies that getPlayersInTeam returns empty list for non-existent match.
test('getPlayersInTeam returns empty list for non-existent match', () async { test(
await database.teamDao.addTeam(team: testTeam1); 'getPlayersInTeam returns empty list for non-existent match',
() async {
await database.teamDao.addTeam(team: testTeam1);
final players = await database.playerMatchDao.getPlayersInTeam( final players = await database.playerMatchDao.getPlayersInTeam(
matchId: 'non-existent-match-id', matchId: 'non-existent-match-id',
teamId: testTeam1.id, teamId: testTeam1.id,
); );
expect(players.isEmpty, true); expect(players.isEmpty, true);
}); },
);
// Verifies that players in different teams within the same match are returned correctly. // Verifies that players in different teams within the same match are returned correctly.
test('Players in different teams within same match are separate', () async { test('Players in different teams within same match are separate', () async {
@@ -759,8 +783,18 @@ void main() {
// Verifies that removePlayerFromMatch does not affect other matches. // Verifies that removePlayerFromMatch does not affect other matches.
test('removePlayerFromMatch does not affect other matches', () async { test('removePlayerFromMatch does not affect other matches', () async {
final playersList = [testPlayer1, testPlayer2]; final playersList = [testPlayer1, testPlayer2];
final match1 = Match(name: 'Match 1', game: testGame, players: playersList, notes: ''); final match1 = Match(
final match2 = Match(name: 'Match 2', game: testGame, players: playersList, notes: ''); name: 'Match 1',
game: testGame,
players: playersList,
notes: '',
);
final match2 = Match(
name: 'Match 2',
game: testGame,
players: playersList,
notes: '',
);
await Future.wait([ await Future.wait([
database.matchDao.addMatch(match: match1), database.matchDao.addMatch(match: match1),
@@ -792,8 +826,18 @@ void main() {
// Verifies that updating scores for players in different matches are independent. // Verifies that updating scores for players in different matches are independent.
test('Player scores are independent across matches', () async { test('Player scores are independent across matches', () async {
final playersList = [testPlayer1]; final playersList = [testPlayer1];
final match1 = Match(name: 'Match 1', game: testGame, players: playersList, notes: ''); final match1 = Match(
final match2 = Match(name: 'Match 2', game: testGame, players: playersList, notes: ''); name: 'Match 1',
game: testGame,
players: playersList,
notes: '',
);
final match2 = Match(
name: 'Match 2',
game: testGame,
players: playersList,
notes: '',
);
await Future.wait([ await Future.wait([
database.matchDao.addMatch(match: match1), database.matchDao.addMatch(match: match1),
@@ -829,16 +873,19 @@ void main() {
}); });
// Verifies that updatePlayersFromMatch on non-existent match fails with constraint error. // Verifies that updatePlayersFromMatch on non-existent match fails with constraint error.
test('updatePlayersFromMatch on non-existent match fails with foreign key constraint', () async { test(
// Should throw due to foreign key constraint - match doesn't exist 'updatePlayersFromMatch on non-existent match fails with foreign key constraint',
await expectLater( () async {
database.playerMatchDao.updatePlayersFromMatch( // Should throw due to foreign key constraint - match doesn't exist
matchId: 'non-existent-match-id', await expectLater(
newPlayer: [testPlayer1, testPlayer2], database.playerMatchDao.updatePlayersFromMatch(
), matchId: 'non-existent-match-id',
throwsA(anything), newPlayer: [testPlayer1, testPlayer2],
); ),
}); throwsA(anything),
);
},
);
// Verifies that a player can be in a match without being assigned to a team. // Verifies that a player can be in a match without being assigned to a team.
test('Player can exist in match without team assignment', () async { test('Player can exist in match without team assignment', () async {

View File

@@ -2,11 +2,11 @@ import 'package:clock/clock.dart';
import 'package:drift/drift.dart' hide isNull, isNotNull; import 'package:drift/drift.dart' hide isNull, isNotNull;
import 'package:drift/native.dart'; import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/dto/game.dart';
import 'package:tallee/data/dto/match.dart';
import 'package:tallee/data/dto/player.dart';
import 'package:tallee/core/enums.dart'; import 'package:tallee/core/enums.dart';
import 'package:tallee/data/db/database.dart';
import 'package:tallee/data/models/game.dart';
import 'package:tallee/data/models/match.dart';
import 'package:tallee/data/models/player.dart';
void main() { void main() {
late AppDatabase database; late AppDatabase database;
@@ -32,7 +32,13 @@ void main() {
testPlayer1 = Player(name: 'Alice', description: ''); testPlayer1 = Player(name: 'Alice', description: '');
testPlayer2 = Player(name: 'Bob', description: ''); testPlayer2 = Player(name: 'Bob', description: '');
testPlayer3 = Player(name: 'Charlie', description: ''); testPlayer3 = Player(name: 'Charlie', description: '');
testGame = Game(name: 'Test Game', ruleset: Ruleset.singleWinner, description: 'A test game', color: GameColor.blue, icon: ''); testGame = Game(
name: 'Test Game',
ruleset: Ruleset.singleWinner,
description: 'A test game',
color: GameColor.blue,
icon: '',
);
testMatch1 = Match( testMatch1 = Match(
name: 'Test Match 1', name: 'Test Match 1',
game: testGame, game: testGame,
@@ -60,7 +66,6 @@ void main() {
}); });
group('Score Tests', () { group('Score Tests', () {
// Verifies that a score can be added and retrieved with all fields intact. // Verifies that a score can be added and retrieved with all fields intact.
test('Adding and fetching a score works correctly', () async { test('Adding and fetching a score works correctly', () async {
await database.scoreDao.addScore( await database.scoreDao.addScore(
@@ -431,13 +436,16 @@ void main() {
}); });
// Verifies that getScoresForMatch returns empty list for match with no scores. // Verifies that getScoresForMatch returns empty list for match with no scores.
test('Getting scores for match with no scores returns empty list', () async { test(
final scores = await database.scoreDao.getScoresForMatch( 'Getting scores for match with no scores returns empty list',
matchId: testMatch1.id, () async {
); final scores = await database.scoreDao.getScoresForMatch(
matchId: testMatch1.id,
);
expect(scores.isEmpty, true); expect(scores.isEmpty, true);
}); },
);
// Verifies that getPlayerScoresInMatch returns empty list when player has no scores. // Verifies that getPlayerScoresInMatch returns empty list when player has no scores.
test('Getting player scores with no scores returns empty list', () async { test('Getting player scores with no scores returns empty list', () async {
@@ -666,46 +674,58 @@ void main() {
}); });
// Verifies that updating one player's score doesn't affect another player's score in same round. // Verifies that updating one player's score doesn't affect another player's score in same round.
test('Updating one player score does not affect other players in same round', () async { test(
await database.scoreDao.addScore( 'Updating one player score does not affect other players in same round',
playerId: testPlayer1.id, () async {
matchId: testMatch1.id, await database.scoreDao.addScore(
roundNumber: 1, playerId: testPlayer1.id,
score: 10, matchId: testMatch1.id,
change: 10, roundNumber: 1,
); score: 10,
await database.scoreDao.addScore( change: 10,
playerId: testPlayer2.id, );
matchId: testMatch1.id, await database.scoreDao.addScore(
roundNumber: 1, playerId: testPlayer2.id,
score: 20, matchId: testMatch1.id,
change: 20, roundNumber: 1,
); score: 20,
await database.scoreDao.addScore( change: 20,
playerId: testPlayer3.id, );
matchId: testMatch1.id, await database.scoreDao.addScore(
roundNumber: 1, playerId: testPlayer3.id,
score: 30, matchId: testMatch1.id,
change: 30, roundNumber: 1,
); score: 30,
change: 30,
);
await database.scoreDao.updateScore( await database.scoreDao.updateScore(
playerId: testPlayer2.id, playerId: testPlayer2.id,
matchId: testMatch1.id, matchId: testMatch1.id,
roundNumber: 1, roundNumber: 1,
newScore: 99, newScore: 99,
newChange: 89, newChange: 89,
); );
final scores = await database.scoreDao.getScoresForMatch( final scores = await database.scoreDao.getScoresForMatch(
matchId: testMatch1.id, matchId: testMatch1.id,
); );
expect(scores.length, 3); expect(scores.length, 3);
expect(scores.where((s) => s.playerId == testPlayer1.id).first.score, 10); expect(
expect(scores.where((s) => s.playerId == testPlayer2.id).first.score, 99); scores.where((s) => s.playerId == testPlayer1.id).first.score,
expect(scores.where((s) => s.playerId == testPlayer3.id).first.score, 30); 10,
}); );
expect(
scores.where((s) => s.playerId == testPlayer2.id).first.score,
99,
);
expect(
scores.where((s) => s.playerId == testPlayer3.id).first.score,
30,
);
},
);
// Verifies that deleting a player's scores only affects that specific player. // Verifies that deleting a player's scores only affects that specific player.
test('Deleting player scores only affects target player', () async { test('Deleting player scores only affects target player', () async {
@@ -724,9 +744,7 @@ void main() {
change: 20, change: 20,
); );
await database.scoreDao.deleteScoresForPlayer( await database.scoreDao.deleteScoresForPlayer(playerId: testPlayer1.id);
playerId: testPlayer1.id,
);
final match1Scores = await database.scoreDao.getScoresForMatch( final match1Scores = await database.scoreDao.getScoresForMatch(
matchId: testMatch1.id, matchId: testMatch1.id,