MVP #141

Merged
flixcoo merged 705 commits from development into main 2026-01-09 12:55:50 +00:00
Showing only changes of commit 1b3334f3e0 - Show all commits

View File

@@ -87,10 +87,17 @@ class GroupDao extends DatabaseAccessor<AppDatabase> with _$GroupDaoMixin {
Future<void> addGroups({required List<Group> groups}) async { Future<void> addGroups({required List<Group> groups}) async {
if (groups.isEmpty) return; if (groups.isEmpty) return;
await db.transaction(() async { await db.transaction(() async {
// Deduplicate groups by id - keep first occurrence
final Map<String, Group> uniqueGroups = {};
for (final g in groups) {
uniqueGroups.putIfAbsent(g.id, () => g);
}
// Insert unique groups in batch
await db.batch( await db.batch(
(b) => b.insertAll( (b) => b.insertAll(
groupTable, groupTable,
groups uniqueGroups.values
.map( .map(
(group) => GroupTableCompanion.insert( (group) => GroupTableCompanion.insert(
id: group.id, id: group.id,
@@ -103,17 +110,24 @@ class GroupDao extends DatabaseAccessor<AppDatabase> with _$GroupDaoMixin {
), ),
); );
for (final group in groups) { // Collect unique players from all groups
await db.playerDao.addPlayers(players: group.members); final uniquePlayers = <String, Player>{};
for (final g in uniqueGroups.values) {
for (final m in g.members) {
uniquePlayers[m.id] = m;
}
}
if (uniquePlayers.isNotEmpty) {
await db.batch( await db.batch(
(b) => b.insertAll( (b) => b.insertAll(
db.playerGroupTable, db.playerTable,
group.members uniquePlayers.values
.map( .map(
(member) => PlayerGroupTableCompanion.insert( (p) => PlayerTableCompanion.insert(
playerId: member.id, id: p.id,
groupId: group.id, name: p.name,
createdAt: p.createdAt,
), ),
) )
.toList(), .toList(),
@@ -121,6 +135,29 @@ class GroupDao extends DatabaseAccessor<AppDatabase> with _$GroupDaoMixin {
), ),
); );
} }
// Prepare all player-group associations in one list (unique pairs)
final Set<String> seenPairs = {};
final List<PlayerGroupTableCompanion> 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);
}
});
}
}); });
} }