From 511490b64971c05c7d03fe70b2d68fe2544eec4d Mon Sep 17 00:00:00 2001 From: otsmr Date: Tue, 7 Jul 2026 22:36:13 +0200 Subject: [PATCH] filter annouced users --- lib/src/database/daos/user_discovery.dao.dart | 55 ++++++++++++++----- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/lib/src/database/daos/user_discovery.dao.dart b/lib/src/database/daos/user_discovery.dao.dart index 07104a01..7c8fb157 100644 --- a/lib/src/database/daos/user_discovery.dao.dart +++ b/lib/src/database/daos/user_discovery.dao.dart @@ -1,4 +1,5 @@ import 'package:drift/drift.dart'; +import 'package:twonly/locator.dart'; import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/tables/user_discovery.table.dart'; import 'package:twonly/src/database/twonly.db.dart'; @@ -184,23 +185,51 @@ class UserDiscoveryDao extends DatabaseAccessor results[user]!.add(relationData); } + final threshold = userService.currentUser.userDiscoveryThreshold; + results.removeWhere((user, relations) => relations.length < threshold); + return results; }); } Stream watchNewAnnouncementsWithDataCount() { - final countExp = userDiscoveryAnnouncedUsers.announcedUserId.count(); + final announcedContact = alias(contacts, 'announcedContact'); + final query = + select(userDiscoveryAnnouncedUsers).join([ + innerJoin( + userDiscoveryUserRelations, + userDiscoveryUserRelations.announcedUserId.equalsExp( + userDiscoveryAnnouncedUsers.announcedUserId, + ), + ), + leftOuterJoin( + announcedContact, + announcedContact.userId.equalsExp( + userDiscoveryAnnouncedUsers.announcedUserId, + ), + ), + ])..where( + // Filters: Has a username AND has not been shown to the user yet AND is not an existing contact + userDiscoveryAnnouncedUsers.username.isNotNull() & + userDiscoveryAnnouncedUsers.wasShownToTheUser.equals(false) & + userDiscoveryAnnouncedUsers.isHidden.equals(false) & + (announcedContact.userId.isNull() | + announcedContact.deletedByUser.equals(true)), + ); - final query = selectOnly(userDiscoveryAnnouncedUsers) - ..addColumns([countExp]) - ..where( - // Filters: Has a username AND has not been shown to the user yet - userDiscoveryAnnouncedUsers.username.isNotNull() & - userDiscoveryAnnouncedUsers.wasShownToTheUser.equals(false) & - userDiscoveryAnnouncedUsers.isHidden.equals(false), - ); + return query.watch().map((rows) { + final relationCounts = {}; + for (final row in rows) { + final announcedUserId = row + .readTable(userDiscoveryAnnouncedUsers) + .announcedUserId; + relationCounts[announcedUserId] = + (relationCounts[announcedUserId] ?? 0) + 1; + } - return query.watchSingle().map((row) => row.read(countExp) ?? 0); + final threshold = userService.currentUser.userDiscoveryThreshold; + return relationCounts.values.where((count) => count >= threshold).length; + }); } Future markAllValidAnnouncedUsersAsShown() async { @@ -235,9 +264,9 @@ class UserDiscoveryDao extends DatabaseAccessor } Stream watchAnnouncedUser(int id) { - return (select(userDiscoveryAnnouncedUsers) - ..where((tbl) => tbl.announcedUserId.equals(id))) - .watchSingleOrNull(); + return (select( + userDiscoveryAnnouncedUsers, + )..where((tbl) => tbl.announcedUserId.equals(id))).watchSingleOrNull(); } Stream> watchAllAnnouncedUsers() =>