Skip to content

Commit

Permalink
refactor: remove public user repository, move the search for wire use…
Browse files Browse the repository at this point in the history
…rs to seperated repository (#319)

* use common repository for the WireUser

* create wire user repository

* remove public user reopsitory

* fix the tests

* Fix tests

* Update logic/src/commonTest/kotlin/com/wire/kalium/logic/data/publicuser/WireUserRepositoryTest.kt

Co-authored-by: Alexandre Ferris <[email protected]>

* fix review comments

* remove extra line

* rename the methods

* Update logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/wireuser/search/SearchPublicWireUserUseCase.kt

Co-authored-by: Alexandre Ferris <[email protected]>

* change the name of the repo

* fix the naming

* Update logic/src/commonMain/kotlin/com/wire/kalium/logic/data/wireuser/SearchUserRepository.kt

Co-authored-by: Jacob Persson <[email protected]>

* Update logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/wireuser/search/WireUserSearchResult.kt

Co-authored-by: Jacob Persson <[email protected]>

* Update logic/src/commonMain/kotlin/com/wire/kalium/logic/data/wireuser/SearchUserRepository.kt

Co-authored-by: Jacob Persson <[email protected]>

* Update network/src/commonMain/kotlin/com/wire/kalium/network/api/contact/search/WireUserSearchApi.kt

Co-authored-by: Jacob Persson <[email protected]>

* Update network/src/commonMain/kotlin/com/wire/kalium/network/api/contact/search/WireUserSearchApi.kt

Co-authored-by: Jacob Persson <[email protected]>

* rename

* rename

* remove prefix

* further rename

* further rename

* remove prefix

* test

Co-authored-by: mateusz.pachulski <[email protected]>
Co-authored-by: Alexandre Ferris <[email protected]>
Co-authored-by: Vitor Hugo Schwaab <[email protected]>
Co-authored-by: Jacob Persson <[email protected]>
  • Loading branch information
5 people authored Mar 25, 2022
1 parent 16858f5 commit 8d95b8f
Show file tree
Hide file tree
Showing 25 changed files with 264 additions and 253 deletions.
Original file line number Diff line number Diff line change
@@ -1,17 +1,32 @@
package com.wire.kalium.logic.data.publicuser

import com.wire.kalium.logic.data.publicuser.model.PublicUser
import com.wire.kalium.logic.data.id.IdMapper
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.data.publicuser.model.PublicUser
import com.wire.kalium.network.api.model.getCompleteAssetOrNull
import com.wire.kalium.network.api.model.getPreviewAssetOrNull
import com.wire.kalium.network.api.user.details.UserDetailsResponse
import com.wire.kalium.persistence.dao.UserEntity

interface PublicUserMapper {
fun fromDaoModelToPublicUser(userEntity: UserEntity): PublicUser
fun fromUserDetailResponse(userDetailResponse: UserDetailsResponse): PublicUser
fun fromUserDetailResponses(userDetailResponse: List<UserDetailsResponse>): List<PublicUser>
}

class PublicUserMapperImpl : PublicUserMapper {
class PublicUserMapperImpl(private val idMapper: IdMapper) : PublicUserMapper {

override fun fromDaoModelToPublicUser(userEntity: UserEntity) = PublicUser(
idMapper.fromDaoModel(userEntity.id),
userEntity.name,
userEntity.handle,
userEntity.email,
userEntity.phone,
userEntity.accentId,
userEntity.team,
userEntity.previewAssetId,
userEntity.completeAssetId
)

override fun fromUserDetailResponse(userDetailResponse: UserDetailsResponse) = PublicUser(
id = UserId(userDetailResponse.id.value, userDetailResponse.id.domain),
Expand All @@ -24,8 +39,6 @@ class PublicUserMapperImpl : PublicUserMapper {
)

override fun fromUserDetailResponses(userDetailResponse: List<UserDetailsResponse>) =
userDetailResponse.map {
fromUserDetailResponse(it)
}
userDetailResponse.map { fromUserDetailResponse(it) }

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.wire.kalium.logic.data.publicuser

import com.wire.kalium.logic.CoreFailure
import com.wire.kalium.logic.data.publicuser.model.UserSearchResult
import com.wire.kalium.logic.di.MapperProvider
import com.wire.kalium.logic.functional.Either
import com.wire.kalium.logic.functional.suspending
import com.wire.kalium.logic.wrapApiRequest
import com.wire.kalium.network.api.contact.search.UserSearchApi
import com.wire.kalium.network.api.contact.search.UserSearchRequest
import com.wire.kalium.network.api.user.details.ListUserRequest
import com.wire.kalium.network.api.user.details.UserDetailsApi
import com.wire.kalium.network.api.user.details.qualifiedIds
import com.wire.kalium.persistence.dao.UserDAO
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

interface SearchUserRepository {
suspend fun searchKnownUsers(searchQuery: String): Flow<UserSearchResult>
suspend fun searchUserDirectory(
searchQuery: String,
domain: String,
maxResultSize: Int? = null
): Either<CoreFailure, UserSearchResult>
}

class SearchUserRepositoryImpl(
private val userDAO: UserDAO,
private val userSearchApi: UserSearchApi,
private val userDetailsApi: UserDetailsApi,
private val publicUserMapper: PublicUserMapper = MapperProvider.publicUserMapper()
) : SearchUserRepository {

override suspend fun searchKnownUsers(searchQuery: String) =
userDAO.getUserByNameOrHandleOrEmail(searchQuery)
.map {
UserSearchResult(it.map { userEntity -> publicUserMapper.fromDaoModelToPublicUser(userEntity) })
}

override suspend fun searchUserDirectory(
searchQuery: String,
domain: String,
maxResultSize: Int?
): Either<CoreFailure, UserSearchResult> {
return suspending {
wrapApiRequest {
userSearchApi.search(
UserSearchRequest(
searchQuery = searchQuery,
domain = domain,
maxResultSize = maxResultSize
)
)
}.flatMap { contactResultValue ->
wrapApiRequest {
userDetailsApi.getMultipleUsers(ListUserRequest.qualifiedIds(contactResultValue.documents.map { it.qualifiedID }))
}.map { userDetailsResponses ->
UserSearchResult(publicUserMapper.fromUserDetailResponses(userDetailsResponses))
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.wire.kalium.logic.data.user.UserId

data class PublicUser(
override val id: UserId,
val name: String,
val name: String?,
val handle: String?,
val email: String? = null,
val phone: String? = null,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.wire.kalium.logic.data.publicuser.model

data class UserSearchResult(val result : List<PublicUser>)
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ interface UserMapper {
fun fromDtoToSelfUser(userDTO: UserDTO): SelfUser
fun fromApiModelToDaoModel(userDetailsResponse: UserDetailsResponse): UserEntity
fun fromApiModelToDaoModel(userDTO: UserDTO): UserEntity
fun fromDaoModel(userEntity: UserEntity): SelfUser

fun fromDaoModelToSelfUser(userEntity: UserEntity): SelfUser
/**
* Maps the user data to be updated. if the parameters [newName] [newAccent] [newAssetId] are nulls,
* it indicates that not updation should be made.
Expand Down Expand Up @@ -67,7 +66,7 @@ internal class UserMapperImpl(private val idMapper: IdMapper) : UserMapper {
)
}

override fun fromDaoModel(userEntity: UserEntity) = SelfUser(
override fun fromDaoModelToSelfUser(userEntity: UserEntity) = SelfUser(
idMapper.fromDaoModel(userEntity.id),
userEntity.name,
userEntity.handle,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,4 @@ data class SelfUser(
val completePicture: UserAssetId?
) : User()


typealias UserAssetId = String
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import com.wire.kalium.network.api.user.details.qualifiedIds
import com.wire.kalium.network.api.user.self.ChangeHandleRequest
import com.wire.kalium.network.api.user.self.SelfApi
import com.wire.kalium.persistence.dao.MetadataDAO
import com.wire.kalium.persistence.dao.QualifiedIDEntity
import com.wire.kalium.persistence.dao.UserDAO
import com.wire.kalium.persistence.dao.UserEntity
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first
Expand All @@ -25,7 +25,6 @@ import kotlinx.coroutines.flow.map
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import com.wire.kalium.persistence.dao.QualifiedIDEntity

// FIXME: missing unit test
interface UserRepository {
Expand All @@ -34,7 +33,6 @@ interface UserRepository {
suspend fun fetchUsersByIds(ids: Set<UserId>): Either<CoreFailure, Unit>
suspend fun getSelfUser(): Flow<SelfUser>
suspend fun updateSelfUser(newName: String? = null, newAccent: Int? = null, newAssetId: String? = null): Either<CoreFailure, SelfUser>
suspend fun searchKnownUsersByNameOrHandleOrEmail(searchQuery: String): Flow<List<UserEntity>>
suspend fun updateSelfHandle(handle: String): Either<NetworkFailure, Unit>
suspend fun updateLocalSelfUserHandle(handle: String)
}
Expand All @@ -43,7 +41,7 @@ class UserDataSource(
private val userDAO: UserDAO,
private val metadataDAO: MetadataDAO,
private val selfApi: SelfApi,
private val userApi: UserDetailsApi,
private val userDetailsApi: UserDetailsApi,
private val assetRepository: AssetRepository,
private val idMapper: IdMapper = MapperProvider.idMapper(),
private val userMapper: UserMapper = MapperProvider.userMapper()
Expand Down Expand Up @@ -76,7 +74,7 @@ class UserDataSource(
override suspend fun fetchUsersByIds(ids: Set<UserId>): Either<CoreFailure, Unit> {
return suspending {
wrapApiRequest {
userApi.getMultipleUsers(ListUserRequest.qualifiedIds(ids.map(idMapper::toApiModel)))
userDetailsApi.getMultipleUsers(ListUserRequest.qualifiedIds(ids.map(idMapper::toApiModel)))
}.flatMap {
// TODO: handle storage error
userDAO.insertUsers(it.map(userMapper::fromApiModelToDaoModel))
Expand All @@ -91,7 +89,7 @@ class UserDataSource(
val selfUserID: QualifiedIDEntity = Json.decodeFromString(encodedValue)
userDAO.getUserByQualifiedID(selfUserID)
.filterNotNull()
.map(userMapper::fromDaoModel)
.map(userMapper::fromDaoModelToSelfUser)
}
}

Expand All @@ -105,15 +103,11 @@ class UserDataSource(
.flatMap {
// TODO: handle storage error
userDAO.updateUser(it)
Either.Right(userMapper.fromDaoModel(it))
Either.Right(userMapper.fromDaoModelToSelfUser(it))
}
}
}


override suspend fun searchKnownUsersByNameOrHandleOrEmail(searchQuery: String) =
userDAO.getUserByNameOrHandleOrEmail(searchQuery)

override suspend fun updateSelfHandle(handle: String): Either<NetworkFailure, Unit> = suspending {
wrapApiRequest {
selfApi.changeHandle(ChangeHandleRequest(handle))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ import com.wire.kalium.logic.data.message.SendMessageFailureMapperImpl
import com.wire.kalium.logic.data.prekey.PreKeyMapper
import com.wire.kalium.logic.data.prekey.PreKeyMapperImpl
import com.wire.kalium.logic.data.prekey.remote.PreKeyListMapper
import com.wire.kalium.logic.data.publicuser.PublicUserMapper
import com.wire.kalium.logic.data.publicuser.PublicUserMapperImpl
import com.wire.kalium.logic.data.session.SessionMapper
import com.wire.kalium.logic.data.session.SessionMapperImpl
import com.wire.kalium.logic.data.team.TeamMapper
import com.wire.kalium.logic.data.team.TeamMapperImpl
import com.wire.kalium.logic.data.user.UserMapper
import com.wire.kalium.logic.data.user.UserMapperImpl
import com.wire.kalium.logic.data.publicuser.PublicUserMapper
import com.wire.kalium.logic.data.publicuser.PublicUserMapperImpl

internal object MapperProvider {
fun idMapper(): IdMapper = IdMapperImpl()
Expand All @@ -39,7 +39,7 @@ internal object MapperProvider {
fun messageMapper(): MessageMapper = MessageMapperImpl(idMapper())
fun memberMapper(): MemberMapper = MemberMapperImpl(idMapper())
fun conversationMapper(): ConversationMapper = ConversationMapperImpl(idMapper())
fun publicUserMapper(): PublicUserMapper = PublicUserMapperImpl()
fun publicUserMapper(): PublicUserMapper = PublicUserMapperImpl(idMapper())
fun sendMessageFailureMapper(): SendMessageFailureMapper = SendMessageFailureMapperImpl()
fun assetMapper(): AssetMapper = AssetMapperImpl()
fun eventMapper(): EventMapper = EventMapper(idMapper())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,13 @@ import com.wire.kalium.logic.data.prekey.PreKeyDataSource
import com.wire.kalium.logic.data.prekey.PreKeyRepository
import com.wire.kalium.logic.data.prekey.remote.PreKeyRemoteDataSource
import com.wire.kalium.logic.data.prekey.remote.PreKeyRemoteRepository
import com.wire.kalium.logic.data.publicuser.PublicUserRepository
import com.wire.kalium.logic.data.publicuser.PublicUserRepositoryImpl
import com.wire.kalium.logic.data.session.SessionRepository
import com.wire.kalium.logic.data.team.TeamDataSource
import com.wire.kalium.logic.data.team.TeamRepository
import com.wire.kalium.logic.data.user.UserDataSource
import com.wire.kalium.logic.data.user.UserRepository
import com.wire.kalium.logic.feature.auth.AuthSession
import com.wire.kalium.logic.data.publicuser.SearchUserRepository
import com.wire.kalium.logic.data.publicuser.SearchUserRepositoryImpl
import com.wire.kalium.logic.feature.auth.LogoutUseCase
import com.wire.kalium.logic.feature.client.ClientScope
import com.wire.kalium.logic.feature.conversation.ConversationScope
Expand Down Expand Up @@ -69,7 +68,6 @@ abstract class UserSessionScopeCommon(
authenticatedDataSourceSet.authenticatedNetworkContainer.clientApi
)


private val messageRepository: MessageRepository
get() = MessageDataSource(
authenticatedDataSourceSet.authenticatedNetworkContainer.messageApi, database.messageDAO
Expand All @@ -91,9 +89,10 @@ abstract class UserSessionScopeCommon(
authenticatedDataSourceSet.authenticatedNetworkContainer.teamsApi
)

private val publicUserRepository: PublicUserRepository
get() = PublicUserRepositoryImpl(
authenticatedDataSourceSet.authenticatedNetworkContainer.contactSearchApi,
private val publicUserRepository: SearchUserRepository
get() = SearchUserRepositoryImpl(
database.userDAO,
authenticatedDataSourceSet.authenticatedNetworkContainer.userSearchApi,
authenticatedDataSourceSet.authenticatedNetworkContainer.userDetailsApi
)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.wire.kalium.logic.feature.publicuser

import com.wire.kalium.logic.data.publicuser.SearchUserRepository
import com.wire.kalium.logic.data.publicuser.model.UserSearchResult
import kotlinx.coroutines.flow.Flow

interface SearchKnownUsersUseCase {
suspend operator fun invoke(searchQuery: String): Flow<UserSearchResult>
}

internal class SearchKnownUsersUseCaseImpl(
private val searchUserRepository: SearchUserRepository
) : SearchKnownUsersUseCase {

// TODO:this use case is going to be refactor once we return Either from DAO's
override suspend operator fun invoke(searchQuery: String): Flow<UserSearchResult> =
searchUserRepository.searchKnownUsers(searchQuery)

}
Loading

0 comments on commit 8d95b8f

Please sign in to comment.