filter annouced users

This commit is contained in:
otsmr 2026-07-07 22:36:13 +02:00
parent 07037537e1
commit 511490b649

View file

@ -1,4 +1,5 @@
import 'package:drift/drift.dart'; 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/contacts.table.dart';
import 'package:twonly/src/database/tables/user_discovery.table.dart'; import 'package:twonly/src/database/tables/user_discovery.table.dart';
import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/database/twonly.db.dart';
@ -184,23 +185,51 @@ class UserDiscoveryDao extends DatabaseAccessor<TwonlyDB>
results[user]!.add(relationData); results[user]!.add(relationData);
} }
final threshold = userService.currentUser.userDiscoveryThreshold;
results.removeWhere((user, relations) => relations.length < threshold);
return results; return results;
}); });
} }
Stream<int> watchNewAnnouncementsWithDataCount() { Stream<int> 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) return query.watch().map((rows) {
..addColumns([countExp]) final relationCounts = <int, int>{};
..where( for (final row in rows) {
// Filters: Has a username AND has not been shown to the user yet final announcedUserId = row
userDiscoveryAnnouncedUsers.username.isNotNull() & .readTable(userDiscoveryAnnouncedUsers)
userDiscoveryAnnouncedUsers.wasShownToTheUser.equals(false) & .announcedUserId;
userDiscoveryAnnouncedUsers.isHidden.equals(false), 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<void> markAllValidAnnouncedUsersAsShown() async { Future<void> markAllValidAnnouncedUsersAsShown() async {
@ -235,9 +264,9 @@ class UserDiscoveryDao extends DatabaseAccessor<TwonlyDB>
} }
Stream<UserDiscoveryAnnouncedUser?> watchAnnouncedUser(int id) { Stream<UserDiscoveryAnnouncedUser?> watchAnnouncedUser(int id) {
return (select(userDiscoveryAnnouncedUsers) return (select(
..where((tbl) => tbl.announcedUserId.equals(id))) userDiscoveryAnnouncedUsers,
.watchSingleOrNull(); )..where((tbl) => tbl.announcedUserId.equals(id))).watchSingleOrNull();
} }
Stream<List<UserDiscoveryAnnouncedUser>> watchAllAnnouncedUsers() => Stream<List<UserDiscoveryAnnouncedUser>> watchAllAnnouncedUsers() =>