diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/id/IdProviders.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/id/IdProviders.kt index ce45830715..0e6d36ce12 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/id/IdProviders.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/id/IdProviders.kt @@ -25,6 +25,10 @@ fun interface CurrentClientIdProvider { suspend operator fun invoke(): Either } +fun interface ContactsSizeProvider { + suspend operator fun invoke(): Either +} + internal fun interface SelfTeamIdProvider { suspend operator fun invoke(): Either } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/user/UserRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/user/UserRepository.kt index 8b383d2b20..4833d5b431 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/user/UserRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/user/UserRepository.kt @@ -173,6 +173,7 @@ interface UserRepository { suspend fun migrateUserToTeam(teamName: String): Either suspend fun updateTeamId(userId: UserId, teamId: TeamId): Either suspend fun isClientMlsCapable(userId: UserId, clientId: ClientId): Either + suspend fun getContactsSize(): Either } @Suppress("LongParameterList", "TooManyFunctions") @@ -386,8 +387,8 @@ internal class UserDataSource internal constructor( userProfile = userProfileDTO, connectionState = ConnectionEntity.State.ACCEPTED, userTypeEntity = - if (userProfileDTO.service != null) UserTypeEntity.SERVICE - else userTypeEntityMapper.teamRoleCodeToUserType(mapTeamMemberDTO[userProfileDTO.id.value]?.permissions?.own) + if (userProfileDTO.service != null) UserTypeEntity.SERVICE + else userTypeEntityMapper.teamRoleCodeToUserType(mapTeamMemberDTO[userProfileDTO.id.value]?.permissions?.own) ) } val otherUsers = listUserProfileDTO @@ -708,6 +709,10 @@ internal class UserDataSource internal constructor( clientDAO.isMLSCapable(userId.toDao(), clientId.value) } + override suspend fun getContactsSize(): Either = wrapStorageRequest { + userDAO.countUsers() + } + companion object { internal const val SELF_USER_ID_KEY = "selfUserID" diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt index ea26e77119..3ec940f122 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt @@ -93,6 +93,7 @@ import com.wire.kalium.logic.data.event.EventDataSource import com.wire.kalium.logic.data.event.EventRepository import com.wire.kalium.logic.data.featureConfig.FeatureConfigDataSource import com.wire.kalium.logic.data.featureConfig.FeatureConfigRepository +import com.wire.kalium.logic.data.id.ContactsSizeProvider import com.wire.kalium.logic.data.id.CurrentClientIdProvider import com.wire.kalium.logic.data.id.FederatedIdMapper import com.wire.kalium.logic.data.id.GroupID @@ -498,6 +499,7 @@ class UserSessionScope internal constructor( ) private var _clientId: ClientId? = null + private var _contactsSize: Int? = null @OptIn(DelicateKaliumApi::class) // Use the uncached client ID in order to create the cache itself. private suspend fun clientId(): Either = @@ -507,6 +509,13 @@ class UserSessionScope internal constructor( } } + private suspend fun contactsSize(): Either = + if (_contactsSize != null) Either.Right(_contactsSize!!) else { + userRepository.getContactsSize().onSuccess { + _contactsSize = it + } + } + private val userScopedLogger: KaliumLogger = kaliumLogger.withUserDeviceData { KaliumLogger.UserClientData(userId.toLogString(), _clientId?.value?.obfuscateId() ?: "") } @@ -527,6 +536,8 @@ class UserSessionScope internal constructor( ) val clientIdProvider = CurrentClientIdProvider { clientId() } + val contactsSizeProvider = ContactsSizeProvider { contactsSize() } + private val mlsSelfConversationIdProvider: MLSSelfConversationIdProvider by lazy { MLSSelfConversationIdProviderImpl( conversationRepository @@ -1205,19 +1216,22 @@ class UserSessionScope internal constructor( callRepository ) - internal val keyPackageManager: KeyPackageManager = KeyPackageManagerImpl(featureSupport, + internal val keyPackageManager: KeyPackageManager = KeyPackageManagerImpl( + featureSupport, incrementalSyncRepository, lazy { clientRepository }, lazy { client.refillKeyPackages }, lazy { client.mlsKeyPackageCountUseCase }, lazy { users.timestampKeyRepository }) - internal val keyingMaterialsManager: KeyingMaterialsManager = KeyingMaterialsManagerImpl(featureSupport, + internal val keyingMaterialsManager: KeyingMaterialsManager = KeyingMaterialsManagerImpl( + featureSupport, incrementalSyncRepository, lazy { clientRepository }, lazy { conversations.updateMLSGroupsKeyingMaterials }, lazy { users.timestampKeyRepository }) - val mlsClientManager: MLSClientManager = MLSClientManagerImpl(clientIdProvider, + val mlsClientManager: MLSClientManager = MLSClientManagerImpl( + clientIdProvider, isAllowedToRegisterMLSClient, incrementalSyncRepository, lazy { slowSyncRepository }, diff --git a/persistence/src/commonMain/db_user/com/wire/kalium/persistence/Users.sq b/persistence/src/commonMain/db_user/com/wire/kalium/persistence/Users.sq index 1a36f2801f..06d575324e 100644 --- a/persistence/src/commonMain/db_user/com/wire/kalium/persistence/Users.sq +++ b/persistence/src/commonMain/db_user/com/wire/kalium/persistence/Users.sq @@ -280,3 +280,7 @@ UPDATE User SET team = ? WHERE qualified_id = ?; selectNameByMessageId: SELECT name FROM User WHERE qualified_id = (SELECT Message.sender_user_id FROM Message WHERE Message.id = :messageId AND Message.conversation_id = :conversationId); + +countUsers: +SELECT COUNT(*) +FROM User WHERE connection_status == 'ACCEPTED'; diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/UserDAO.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/UserDAO.kt index 858c7428d8..05b18731c3 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/UserDAO.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/UserDAO.kt @@ -317,4 +317,5 @@ interface UserDAO { suspend fun getUsersMinimizedByQualifiedIDs(qualifiedIDs: List): List suspend fun getNameAndHandle(userId: UserIDEntity): NameAndHandleEntity? suspend fun updateTeamId(userId: UserIDEntity, teamId: String) + suspend fun countUsers(): Int? } diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/UserDAOImpl.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/UserDAOImpl.kt index e14128e0d6..69271ca3c9 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/UserDAOImpl.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/UserDAOImpl.kt @@ -482,6 +482,12 @@ class UserDAOImpl internal constructor( } override suspend fun updateTeamId(userId: UserIDEntity, teamId: String) { - userQueries.updateTeamId(teamId, userId) + withContext(queriesContext) { + userQueries.updateTeamId(teamId, userId) + } + } + + override suspend fun countUsers(): Int? = withContext(queriesContext) { + userQueries.countUsers().executeAsOneOrNull()?.toInt() } }