diff --git a/lib/data/dao/group_dao.dart b/lib/data/dao/group_dao.dart index 3489f5c..fbb4d6f 100644 --- a/lib/data/dao/group_dao.dart +++ b/lib/data/dao/group_dao.dart @@ -87,10 +87,17 @@ class GroupDao extends DatabaseAccessor with _$GroupDaoMixin { Future addGroups({required List groups}) async { if (groups.isEmpty) return; await db.transaction(() async { + // Deduplicate groups by id - keep first occurrence + final Map uniqueGroups = {}; + for (final g in groups) { + uniqueGroups.putIfAbsent(g.id, () => g); + } + + // Insert unique groups in batch await db.batch( (b) => b.insertAll( groupTable, - groups + uniqueGroups.values .map( (group) => GroupTableCompanion.insert( id: group.id, @@ -103,17 +110,24 @@ class GroupDao extends DatabaseAccessor with _$GroupDaoMixin { ), ); - for (final group in groups) { - await db.playerDao.addPlayers(players: group.members); + // Collect unique players from all groups + final uniquePlayers = {}; + for (final g in uniqueGroups.values) { + for (final m in g.members) { + uniquePlayers[m.id] = m; + } + } + if (uniquePlayers.isNotEmpty) { await db.batch( (b) => b.insertAll( - db.playerGroupTable, - group.members + db.playerTable, + uniquePlayers.values .map( - (member) => PlayerGroupTableCompanion.insert( - playerId: member.id, - groupId: group.id, + (p) => PlayerTableCompanion.insert( + id: p.id, + name: p.name, + createdAt: p.createdAt, ), ) .toList(), @@ -121,6 +135,29 @@ class GroupDao extends DatabaseAccessor with _$GroupDaoMixin { ), ); } + + // Prepare all player-group associations in one list (unique pairs) + final Set seenPairs = {}; + final List pgRows = []; + for (final g in uniqueGroups.values) { + for (final m in g.members) { + final key = '${m.id}|${g.id}'; + if (!seenPairs.contains(key)) { + seenPairs.add(key); + pgRows.add( + PlayerGroupTableCompanion.insert(playerId: m.id, groupId: g.id), + ); + } + } + } + + if (pgRows.isNotEmpty) { + await db.batch((b) { + for (final pg in pgRows) { + b.insert(db.playerGroupTable, pg, mode: InsertMode.insertOrReplace); + } + }); + } }); }