From 56562b22bb3353f43d1e05d411fde988ef3a8646 Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:16:02 +0100 Subject: [PATCH 01/11] add description to player --- lib/data/db/tables/player_table.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/data/db/tables/player_table.dart b/lib/data/db/tables/player_table.dart index 794958e..63b666e 100644 --- a/lib/data/db/tables/player_table.dart +++ b/lib/data/db/tables/player_table.dart @@ -4,6 +4,7 @@ class PlayerTable extends Table { TextColumn get id => text()(); TextColumn get name => text()(); DateTimeColumn get createdAt => dateTime()(); + TextColumn get description => text().nullable()(); @override Set> get primaryKey => {id}; -- 2.49.1 From 9b66e58dc08bc820859313d5f45c3503e81b7f98 Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:17:13 +0100 Subject: [PATCH 02/11] add team table --- lib/data/db/tables/team_table.dart | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 lib/data/db/tables/team_table.dart diff --git a/lib/data/db/tables/team_table.dart b/lib/data/db/tables/team_table.dart new file mode 100644 index 0000000..73e9998 --- /dev/null +++ b/lib/data/db/tables/team_table.dart @@ -0,0 +1,9 @@ +import 'package:drift/drift.dart'; + +class TeamTable extends Table { + TextColumn get id => text()(); + TextColumn get name => text()(); + + @override + Set> get primaryKey => {id}; +} -- 2.49.1 From 3344575132b77b2fed035988ef48d9e208150ae4 Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:20:40 +0100 Subject: [PATCH 03/11] add team id and score --- lib/data/db/tables/player_match_table.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/data/db/tables/player_match_table.dart b/lib/data/db/tables/player_match_table.dart index e155cd5..721e222 100644 --- a/lib/data/db/tables/player_match_table.dart +++ b/lib/data/db/tables/player_match_table.dart @@ -1,12 +1,16 @@ import 'package:drift/drift.dart'; import 'package:game_tracker/data/db/tables/match_table.dart'; import 'package:game_tracker/data/db/tables/player_table.dart'; +import 'package:game_tracker/data/db/tables/team_table.dart'; class PlayerMatchTable extends Table { TextColumn get playerId => text().references(PlayerTable, #id, onDelete: KeyAction.cascade)(); TextColumn get matchId => text().references(MatchTable, #id, onDelete: KeyAction.cascade)(); + TextColumn get teamId => + text().references(TeamTable, #id).nullable()(); + IntColumn get score => integer()(); @override Set> get primaryKey => {playerId, matchId}; -- 2.49.1 From 7e6c309de044d86fb8b793d62252973471b3ef70 Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:26:39 +0100 Subject: [PATCH 04/11] add game table --- lib/data/db/tables/game_table.dart | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 lib/data/db/tables/game_table.dart diff --git a/lib/data/db/tables/game_table.dart b/lib/data/db/tables/game_table.dart new file mode 100644 index 0000000..2074ae7 --- /dev/null +++ b/lib/data/db/tables/game_table.dart @@ -0,0 +1,14 @@ +import 'package:drift/drift.dart'; + +class GameTable extends Table { + TextColumn get id => text()(); + TextColumn get name => text()(); + TextColumn get ruleset => text()(); + TextColumn get description => text().nullable()(); + TextColumn get color => text().nullable()(); + TextColumn get icon => text().nullable()(); + DateTimeColumn get createdAt => dateTime()(); + + @override + Set> get primaryKey => {id}; +} -- 2.49.1 From d8abad6fd822c0e16d17557215a5742b95c5b4ee Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:30:37 +0100 Subject: [PATCH 05/11] add groupid gameid and notes to match --- lib/data/db/tables/match_table.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/data/db/tables/match_table.dart b/lib/data/db/tables/match_table.dart index 96aff2a..c71f8bd 100644 --- a/lib/data/db/tables/match_table.dart +++ b/lib/data/db/tables/match_table.dart @@ -1,9 +1,15 @@ import 'package:drift/drift.dart'; +import 'package:game_tracker/data/db/tables/game_table.dart'; +import 'package:game_tracker/data/db/tables/group_table.dart'; class MatchTable extends Table { TextColumn get id => text()(); - TextColumn get name => text()(); - late final winnerId = text().nullable()(); + TextColumn get name => text().nullable()(); + TextColumn get gameId => + text().references(GameTable, #id, onDelete: KeyAction.cascade)(); + TextColumn get groupId => + text().references(GroupTable, #id, onDelete: KeyAction.cascade).nullable()(); // Nullable if not part of a group + TextColumn get notes => text().nullable()(); DateTimeColumn get createdAt => dateTime()(); @override -- 2.49.1 From 0394f5edf954b68ac41d951498b205fd84dfdfee Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:32:23 +0100 Subject: [PATCH 06/11] delete group_match_table.dart --- lib/data/db/tables/group_match_table.dart | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 lib/data/db/tables/group_match_table.dart diff --git a/lib/data/db/tables/group_match_table.dart b/lib/data/db/tables/group_match_table.dart deleted file mode 100644 index 3f77dcb..0000000 --- a/lib/data/db/tables/group_match_table.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:drift/drift.dart'; -import 'package:game_tracker/data/db/tables/group_table.dart'; -import 'package:game_tracker/data/db/tables/match_table.dart'; - -class GroupMatchTable extends Table { - TextColumn get groupId => - text().references(GroupTable, #id, onDelete: KeyAction.cascade)(); - TextColumn get matchId => - text().references(MatchTable, #id, onDelete: KeyAction.cascade)(); - - @override - Set> get primaryKey => {groupId, matchId}; -} -- 2.49.1 From 5dd8f31942e4cc278c791061e2fdf08a7e17a372 Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:33:00 +0100 Subject: [PATCH 07/11] add description to group_table.dart --- lib/data/db/tables/group_table.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/data/db/tables/group_table.dart b/lib/data/db/tables/group_table.dart index 5c52355..09bf79d 100644 --- a/lib/data/db/tables/group_table.dart +++ b/lib/data/db/tables/group_table.dart @@ -3,6 +3,7 @@ import 'package:drift/drift.dart'; class GroupTable extends Table { TextColumn get id => text()(); TextColumn get name => text()(); + TextColumn get description => text().nullable()(); DateTimeColumn get createdAt => dateTime()(); @override -- 2.49.1 From 0f987f4c7adbd5328288049380bebf5e0e01cb15 Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:34:02 +0100 Subject: [PATCH 08/11] move match below ids --- lib/data/db/tables/match_table.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/data/db/tables/match_table.dart b/lib/data/db/tables/match_table.dart index c71f8bd..5deb5c5 100644 --- a/lib/data/db/tables/match_table.dart +++ b/lib/data/db/tables/match_table.dart @@ -4,14 +4,14 @@ import 'package:game_tracker/data/db/tables/group_table.dart'; class MatchTable extends Table { TextColumn get id => text()(); - TextColumn get name => text().nullable()(); TextColumn get gameId => text().references(GameTable, #id, onDelete: KeyAction.cascade)(); TextColumn get groupId => text().references(GroupTable, #id, onDelete: KeyAction.cascade).nullable()(); // Nullable if not part of a group + TextColumn get name => text().nullable()(); TextColumn get notes => text().nullable()(); DateTimeColumn get createdAt => dateTime()(); @override Set> get primaryKey => {id}; -} +} \ No newline at end of file -- 2.49.1 From 189daf76ddd9a2cfbcb3ac8fc3e410d803c73a6a Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:35:57 +0100 Subject: [PATCH 09/11] move createdAt below description --- lib/data/db/tables/player_table.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/data/db/tables/player_table.dart b/lib/data/db/tables/player_table.dart index 63b666e..3e061a0 100644 --- a/lib/data/db/tables/player_table.dart +++ b/lib/data/db/tables/player_table.dart @@ -3,8 +3,8 @@ import 'package:drift/drift.dart'; class PlayerTable extends Table { TextColumn get id => text()(); TextColumn get name => text()(); - DateTimeColumn get createdAt => dateTime()(); TextColumn get description => text().nullable()(); + DateTimeColumn get createdAt => dateTime()(); @override Set> get primaryKey => {id}; -- 2.49.1 From b72ab70e02a3030654049b0d635bf087f20955cb Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:38:38 +0100 Subject: [PATCH 10/11] add score table --- lib/data/db/tables/score_table.dart | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 lib/data/db/tables/score_table.dart diff --git a/lib/data/db/tables/score_table.dart b/lib/data/db/tables/score_table.dart new file mode 100644 index 0000000..93542c3 --- /dev/null +++ b/lib/data/db/tables/score_table.dart @@ -0,0 +1,16 @@ +import 'package:drift/drift.dart'; +import 'package:game_tracker/data/db/tables/match_table.dart'; +import 'package:game_tracker/data/db/tables/player_table.dart'; + +class ScoreTable extends Table { + TextColumn get playerId => + text().references(PlayerTable, #id, onDelete: KeyAction.cascade)(); + TextColumn get matchId => + text().references(MatchTable, #id, onDelete: KeyAction.cascade)(); + IntColumn get roundNumber => integer()(); + IntColumn get score => integer()(); + IntColumn get change => integer()(); + + @override + Set> get primaryKey => {playerId, matchId, roundNumber}; +} \ No newline at end of file -- 2.49.1 From e2fe0c7d4dacc4952d8caa27a29ab6f6d0d8a04d Mon Sep 17 00:00:00 2001 From: gelbeinhalb Date: Mon, 12 Jan 2026 11:42:03 +0100 Subject: [PATCH 11/11] remove group_match_dao --- lib/data/dao/group_match_dao.dart | 98 ----------------------------- lib/data/dao/group_match_dao.g.dart | 10 --- lib/data/db/database.dart | 8 +-- 3 files changed, 2 insertions(+), 114 deletions(-) delete mode 100644 lib/data/dao/group_match_dao.dart delete mode 100644 lib/data/dao/group_match_dao.g.dart diff --git a/lib/data/dao/group_match_dao.dart b/lib/data/dao/group_match_dao.dart deleted file mode 100644 index d428fb5..0000000 --- a/lib/data/dao/group_match_dao.dart +++ /dev/null @@ -1,98 +0,0 @@ -import 'package:drift/drift.dart'; -import 'package:game_tracker/data/db/database.dart'; -import 'package:game_tracker/data/db/tables/group_match_table.dart'; -import 'package:game_tracker/data/dto/group.dart'; - -part 'group_match_dao.g.dart'; - -@DriftAccessor(tables: [GroupMatchTable]) -class GroupMatchDao extends DatabaseAccessor - with _$GroupMatchDaoMixin { - GroupMatchDao(super.db); - - /// Associates a group with a match by inserting a record into the - /// [GroupMatchTable]. - Future addGroupToMatch({ - required String matchId, - required String groupId, - }) async { - if (await matchHasGroup(matchId: matchId)) { - throw Exception('Match already has a group'); - } - await into(groupMatchTable).insert( - GroupMatchTableCompanion.insert(groupId: groupId, matchId: matchId), - mode: InsertMode.insertOrIgnore, - ); - } - - /// Retrieves the [Group] associated with the given [matchId]. - /// Returns `null` if no group is found. - Future getGroupOfMatch({required String matchId}) async { - final result = await (select( - groupMatchTable, - )..where((g) => g.matchId.equals(matchId))).getSingleOrNull(); - - if (result == null) { - return null; - } - - final group = await db.groupDao.getGroupById(groupId: result.groupId); - return group; - } - - /// Checks if there is a group associated with the given [matchId]. - /// Returns `true` if there is a group, otherwise `false`. - Future matchHasGroup({required String matchId}) async { - final count = - await (selectOnly(groupMatchTable) - ..where(groupMatchTable.matchId.equals(matchId)) - ..addColumns([groupMatchTable.groupId.count()])) - .map((row) => row.read(groupMatchTable.groupId.count())) - .getSingle(); - return (count ?? 0) > 0; - } - - /// Checks if a specific group is associated with a specific match. - /// Returns `true` if the group is in the match, otherwise `false`. - Future isGroupInMatch({ - required String matchId, - required String groupId, - }) async { - final count = - await (selectOnly(groupMatchTable) - ..where( - groupMatchTable.matchId.equals(matchId) & - groupMatchTable.groupId.equals(groupId), - ) - ..addColumns([groupMatchTable.groupId.count()])) - .map((row) => row.read(groupMatchTable.groupId.count())) - .getSingle(); - return (count ?? 0) > 0; - } - - /// Removes the association of a group from a match based on [groupId] and - /// [matchId]. - /// Returns `true` if more than 0 rows were affected, otherwise `false`. - Future removeGroupFromMatch({ - required String matchId, - required String groupId, - }) async { - final query = delete(groupMatchTable) - ..where((g) => g.matchId.equals(matchId) & g.groupId.equals(groupId)); - final rowsAffected = await query.go(); - return rowsAffected > 0; - } - - /// Updates the group associated with a match to [newGroupId] based on - /// [matchId]. - /// Returns `true` if more than 0 rows were affected, otherwise `false`. - Future updateGroupOfMatch({ - required String matchId, - required String newGroupId, - }) async { - final updatedRows = - await (update(groupMatchTable)..where((g) => g.matchId.equals(matchId))) - .write(GroupMatchTableCompanion(groupId: Value(newGroupId))); - return updatedRows > 0; - } -} diff --git a/lib/data/dao/group_match_dao.g.dart b/lib/data/dao/group_match_dao.g.dart deleted file mode 100644 index 5cc0b82..0000000 --- a/lib/data/dao/group_match_dao.g.dart +++ /dev/null @@ -1,10 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'group_match_dao.dart'; - -// ignore_for_file: type=lint -mixin _$GroupMatchDaoMixin on DatabaseAccessor { - $GroupTableTable get groupTable => attachedDatabase.groupTable; - $MatchTableTable get matchTable => attachedDatabase.matchTable; - $GroupMatchTableTable get groupMatchTable => attachedDatabase.groupMatchTable; -} diff --git a/lib/data/db/database.dart b/lib/data/db/database.dart index e6c322f..632a4c6 100644 --- a/lib/data/db/database.dart +++ b/lib/data/db/database.dart @@ -1,12 +1,10 @@ import 'package:drift/drift.dart'; import 'package:drift_flutter/drift_flutter.dart'; import 'package:game_tracker/data/dao/group_dao.dart'; -import 'package:game_tracker/data/dao/group_match_dao.dart'; import 'package:game_tracker/data/dao/match_dao.dart'; import 'package:game_tracker/data/dao/player_dao.dart'; import 'package:game_tracker/data/dao/player_group_dao.dart'; import 'package:game_tracker/data/dao/player_match_dao.dart'; -import 'package:game_tracker/data/db/tables/group_match_table.dart'; import 'package:game_tracker/data/db/tables/group_table.dart'; import 'package:game_tracker/data/db/tables/match_table.dart'; import 'package:game_tracker/data/db/tables/player_group_table.dart'; @@ -22,16 +20,14 @@ part 'database.g.dart'; GroupTable, MatchTable, PlayerGroupTable, - PlayerMatchTable, - GroupMatchTable, + PlayerMatchTable ], daos: [ PlayerDao, GroupDao, MatchDao, PlayerGroupDao, - PlayerMatchDao, - GroupMatchDao, + PlayerMatchDao ], ) class AppDatabase extends _$AppDatabase { -- 2.49.1