diff --git a/lib/src/database/daos/key_verification.dao.dart b/lib/src/database/daos/key_verification.dao.dart index 1664a3c1..cdcadea3 100644 --- a/lib/src/database/daos/key_verification.dao.dart +++ b/lib/src/database/daos/key_verification.dao.dart @@ -126,6 +126,35 @@ class KeyVerificationDao extends DatabaseAccessor return rows.length; } + Future getCountOfContactsWithVerificationBadge() async { + final kv = keyVerifications; + final ur = userDiscoveryUserRelations; + + final query = selectOnly(ur, distinct: true) + ..addColumns([ur.announcedUserId]) + ..join([ + innerJoin(contacts, contacts.userId.equalsExp(ur.fromContactId)), + innerJoin(kv, kv.contactId.equalsExp(ur.fromContactId)), + ]) + ..where( + ur.publicKeyVerifiedTimestamp.isNotNull() & + ur.announcedUserId.equalsExp(ur.fromContactId).not(), + ) + ..groupBy([ur.announcedUserId]); + + final rows = await query.get(); + final transferredIds = rows.map((r) => r.read(ur.announcedUserId)!).toSet(); + + final directVerifications = await select(kv).get(); + final directIds = directVerifications.map((v) => v.contactId).toSet(); + + // Reduce transferred contacts where announcedUserId is already in KeyVerifications + transferredIds.removeWhere(directIds.contains); + + // Add count of all users who are in the KeyVerification table + return transferredIds.length + directIds.length; + } + Stream watchAllGroupMembersVerified(String groupId) { final gm = groupMembers; final directKv = alias(keyVerifications, 'directKv'); diff --git a/lib/src/services/user_study.service.dart b/lib/src/services/user_study.service.dart index 79b9cb07..0a28c893 100644 --- a/lib/src/services/user_study.service.dart +++ b/lib/src/services/user_study.service.dart @@ -49,6 +49,9 @@ Future handleUserStudyUpload() async { final udVerifiedByContactsCount = await twonlyDB.keyVerificationDao .getTransferredTrustVerificationsCount(); + final totalContactsWithVerificationBadge = await twonlyDB.keyVerificationDao + .getCountOfContactsWithVerificationBadge(); + final udFriendsShared = await twonlyDB.contactsDao .getContactsAnnouncedViaUserDiscovery(); @@ -87,6 +90,8 @@ Future handleUserStudyUpload() async { 'accepted_contacts': contacts.where((c) => c.accepted).length, 'verified_contacts': verifications.length, + 'total_contacts_with_verification_badge': + totalContactsWithVerificationBadge, 'verified_contacts_via_migrated_from_old_version': verifications.values .where((c) => c == VerificationType.migratedFromOldVersion) .length,