From 652009a7bfb61d01aa6cc8e65ef9eeea3438a880 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 3 Feb 2026 17:41:42 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/di/domain/AccountDomainModule.kt | 3 + .../DefaultUserWalletsListRepository.kt | 32 +++++--- .../AccountConverterFactoryContainer.kt | 12 +-- .../data/account/di/AccountDataModule.kt | 3 - .../fetcher/DefaultMultiAccountListFetcher.kt | 10 ++- .../AccountListCryptoCurrenciesProducer.kt | 8 +- .../DefaultMultiAccountListProducer.kt | 9 ++- ...aultMultiWalletCryptoCurrenciesProducer.kt | 9 ++- .../producer/WalletAccountListFlowFactory.kt | 7 +- .../DefaultAccountsCRUDRepository.kt | 11 --- .../DefaultWalletAccountsResponseFactory.kt | 8 +- .../DefaultMultiAccountListFetcherTest.kt | 19 +++-- .../DefaultMultiAccountListProducerTest.kt | 42 +++++------ ...MultiWalletCryptoCurrenciesProducerTest.kt | 34 ++++----- .../WalletAccountListFlowFactoryTest.kt | 14 ++-- .../DefaultAccountsCRUDRepositoryTest.kt | 3 - ...efaultWalletAccountsResponseFactoryTest.kt | 20 ++--- domain/account/build.gradle.kts | 1 + .../repository/AccountsCRUDRepository.kt | 15 ---- .../usecase/IsAccountsModeEnabledUseCase.kt | 11 ++- .../IsAccountsModeEnabledUseCaseTest.kt | 64 +++++++++------- .../status/di/AccountStatusUseCaseModule.kt | 9 ++- .../DefaultMultiAccountStatusListProducer.kt | 9 ++- .../DefaultSingleAccountStatusListProducer.kt | 18 +++-- .../GetAccountCurrencyByAddressUseCase.kt | 8 +- .../GetCryptoCurrencyActionsUseCaseV2.kt | 8 +- ...faultMultiAccountStatusListProducerTest.kt | 55 +++++++------- .../GetAccountCurrencyByAddressUseCaseTest.kt | 75 +++++++++---------- .../wallets/UserWalletsListRepository.kt | 10 +++ 29 files changed, 271 insertions(+), 256 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/di/domain/AccountDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/AccountDomainModule.kt index 80d510d122..569c69c6b8 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/AccountDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/AccountDomainModule.kt @@ -9,6 +9,7 @@ import com.tangem.domain.account.status.usecase.RecoverCryptoPortfolioUseCase import com.tangem.domain.account.status.utils.CryptoCurrencyBalanceFetcher import com.tangem.domain.account.tokens.MainAccountTokensMigration import com.tangem.domain.account.usecase.* +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.feature.referral.data.ExternalReferralRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module @@ -94,10 +95,12 @@ internal object AccountDomainModule { @Provides @Singleton fun provideIsAccountsModeEnabledUseCase( + userWalletsListRepository: UserWalletsListRepository, accountsCRUDRepository: AccountsCRUDRepository, accountsFeatureToggles: AccountsFeatureToggles, ): IsAccountsModeEnabledUseCase { return IsAccountsModeEnabledUseCase( + userWalletsListRepository = userWalletsListRepository, crudRepository = accountsCRUDRepository, accountsFeatureToggles = accountsFeatureToggles, ) diff --git a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt index f307b8653d..9aee042a1c 100644 --- a/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/userWalletList/repository/DefaultUserWalletsListRepository.kt @@ -30,19 +30,16 @@ import com.tangem.hot.sdk.TangemHotSdk import com.tangem.hot.sdk.model.HotWalletId import com.tangem.sdk.api.TangemSdkManager import com.tangem.tap.domain.userWalletList.model.UserWalletEncryptionKey -import com.tangem.tap.domain.userWalletList.utils.encryptionKey -import com.tangem.tap.domain.userWalletList.utils.lock -import com.tangem.tap.domain.userWalletList.utils.publicInformation -import com.tangem.tap.domain.userWalletList.utils.sensitiveInformation -import com.tangem.tap.domain.userWalletList.utils.toUserWallets -import com.tangem.tap.domain.userWalletList.utils.updateWith +import com.tangem.tap.domain.userWalletList.utils.* import com.tangem.utils.Provider import com.tangem.utils.ProviderSuspend import com.tangem.utils.coroutines.runSuspendCatching import com.tangem.utils.extensions.addOrReplace import com.tangem.utils.extensions.indexOfFirstOrNull import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.update import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock @@ -67,8 +64,17 @@ internal class DefaultUserWalletsListRepository( override val userWallets = MutableStateFlow?>(null) override val selectedUserWallet = MutableStateFlow(null) + private val mutex = Mutex() + override fun getSyncOrNull(id: UserWalletId): UserWallet? { + return userWallets.value?.find { it.walletId == id } + } + + override fun getSyncStrict(id: UserWalletId): UserWallet { + return requireNotNull(getSyncOrNull(id)) { "Unable to find user wallet with provided ID: $id" } + } + override suspend fun load() { mutex.withLock { if (userWallets.value != null) return @@ -103,6 +109,13 @@ internal class DefaultUserWalletsListRepository( } } + override fun loadAndGet(): Flow> = flow { + load() + userWallets.collect { + emit(requireNotNull(it)) + } + } + override suspend fun userWalletsSync(): List { load() return requireNotNull(userWallets.value) { @@ -289,8 +302,7 @@ internal class DefaultUserWalletsListRepository( } val scanResponse = unlockMethod.scanResponse ?: run { - val res = tangemSdkManagerProvider().scanProduct() - when (res) { + when (val res = tangemSdkManagerProvider().scanProduct()) { is CompletionResult.Failure -> raise(UnlockWalletError.UserCancelled) is CompletionResult.Success -> res.data } @@ -467,9 +479,7 @@ internal class DefaultUserWalletsListRepository( authMode = true, // In auth mode user wallet can be deleted after 30 failed attempts hasBiometry = hasBiometry(), ) - val result = passwordRequester.requestPassword(attemptRequest) - - return when (result) { + return when (val result = passwordRequester.requestPassword(attemptRequest)) { HotWalletPasswordRequester.Result.Dismiss -> { passwordRequester.dismiss() UnlockWalletError.UserCancelled.left() diff --git a/data/account/src/main/kotlin/com/tangem/data/account/converter/AccountConverterFactoryContainer.kt b/data/account/src/main/kotlin/com/tangem/data/account/converter/AccountConverterFactoryContainer.kt index 8a7f2de408..95de2c8111 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/converter/AccountConverterFactoryContainer.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/converter/AccountConverterFactoryContainer.kt @@ -1,6 +1,6 @@ package com.tangem.data.account.converter -import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.wallet.UserWalletId import javax.inject.Inject @@ -10,7 +10,7 @@ import javax.inject.Inject * @property getWalletAccountsResponseCF factory for creating a wallet accounts response converter * @property accountsListCF factory for creating an account list converter * @property cryptoPortfolioCF factory for creating a crypto portfolio converter - * @property userWalletsStore store for accessing user wallet data + * @property userWalletsListRepository repository for getting user wallets * * @constructor Creates an instance of the container with injected factories. * @@ -20,23 +20,23 @@ internal class AccountConverterFactoryContainer @Inject constructor( private val getWalletAccountsResponseCF: GetWalletAccountsResponseConverter.Factory, private val accountsListCF: AccountListConverter.Factory, private val cryptoPortfolioCF: CryptoPortfolioConverter.Factory, - private val userWalletsStore: UserWalletsStore, + private val userWalletsListRepository: UserWalletsListRepository, ) { fun createWalletAccountsResponseConverter(userWalletId: UserWalletId): GetWalletAccountsResponseConverter { - val userWallet = userWalletsStore.getSyncStrict(key = userWalletId) + val userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId) return getWalletAccountsResponseCF.create(userWallet) } fun createAccountListConverter(userWalletId: UserWalletId): AccountListConverter { - val userWallet = userWalletsStore.getSyncStrict(key = userWalletId) + val userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId) return accountsListCF.create(userWallet) } fun createCryptoPortfolioConverter(userWalletId: UserWalletId): CryptoPortfolioConverter { - val userWallet = userWalletsStore.getSyncStrict(key = userWalletId) + val userWallet = userWalletsListRepository.getSyncStrict(id = userWalletId) return cryptoPortfolioCF.create(userWallet) } diff --git a/data/account/src/main/kotlin/com/tangem/data/account/di/AccountDataModule.kt b/data/account/src/main/kotlin/com/tangem/data/account/di/AccountDataModule.kt index 559ba4c6ce..fc62ab079a 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/di/AccountDataModule.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/di/AccountDataModule.kt @@ -22,7 +22,6 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.di.NetworkMoshi import com.tangem.datasource.local.accounts.AccountTokenMigrationStore import com.tangem.datasource.local.datastore.RuntimeStateStore -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.datasource.utils.MoshiDataStoreSerializer import com.tangem.datasource.utils.mapWithStringKeyTypes import com.tangem.datasource.utils.setTypes @@ -56,7 +55,6 @@ internal object AccountDataModule { tangemTechApi: TangemTechApi, walletAccountsSaver: WalletAccountsSaver, accountsResponseStoreFactory: AccountsResponseStoreFactory, - userWalletsStore: UserWalletsStore, userTokensSaver: UserTokensSaver, accountConverterFactoryContainer: AccountConverterFactoryContainer, @ApplicationContext context: Context, @@ -67,7 +65,6 @@ internal object AccountDataModule { walletAccountsSaver = walletAccountsSaver, accountsResponseStoreFactory = accountsResponseStoreFactory, archivedAccountsStoreFactory = ArchivedAccountsStoreFactory, - userWalletsStore = userWalletsStore, userTokensSaver = userTokensSaver, archivedAccountsETagStore = RuntimeStateStore(emptyMap()), convertersContainer = accountConverterFactoryContainer, diff --git a/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcher.kt b/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcher.kt index 2be1ac75dc..b655bbbdcc 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcher.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcher.kt @@ -2,9 +2,9 @@ package com.tangem.data.account.fetcher import arrow.core.Either import arrow.core.raise.either -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.account.fetcher.MultiAccountListFetcher import com.tangem.domain.account.fetcher.SingleAccountListFetcher +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import kotlinx.coroutines.coroutineScope @@ -17,13 +17,13 @@ import javax.inject.Inject * Implementation of [MultiAccountListFetcher] * * @property singleAccountListFetcher instance of [SingleAccountListFetcher] to fetch accounts for a single wallet - * @property userWalletsStore instance of [UserWalletsStore] to get all user wallets + * @property userWalletsListRepository repository for getting user wallets * [REDACTED_AUTHOR] */ internal class DefaultMultiAccountListFetcher @Inject constructor( private val singleAccountListFetcher: SingleAccountListFetcher, - private val userWalletsStore: UserWalletsStore, + private val userWalletsListRepository: UserWalletsListRepository, ) : MultiAccountListFetcher { override suspend fun invoke(params: MultiAccountListFetcher.Params): Either = either { @@ -58,7 +58,9 @@ internal class DefaultMultiAccountListFetcher @Inject constructor( } } MultiAccountListFetcher.Params.All -> { - val userWalletsIds = userWalletsStore.userWalletsSync.map(UserWallet::walletId).toSet() + val userWalletsIds = userWalletsListRepository.userWallets.value.orEmpty() + .map(UserWallet::walletId) + .toSet() invoke(params = MultiAccountListFetcher.Params.Set(ids = userWalletsIds)).bind() } diff --git a/data/account/src/main/kotlin/com/tangem/data/account/producer/AccountListCryptoCurrenciesProducer.kt b/data/account/src/main/kotlin/com/tangem/data/account/producer/AccountListCryptoCurrenciesProducer.kt index 12ad2e3ef9..305d08e560 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/producer/AccountListCryptoCurrenciesProducer.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/producer/AccountListCryptoCurrenciesProducer.kt @@ -4,7 +4,7 @@ import arrow.core.Option import arrow.core.some import com.tangem.data.account.store.AccountsResponseStoreFactory import com.tangem.data.common.currency.ResponseCryptoCurrenciesFactory -import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.core.flow.FlowProducerTools import com.tangem.domain.models.account.DerivationIndex import com.tangem.domain.models.currency.CryptoCurrency @@ -20,7 +20,7 @@ import kotlinx.coroutines.flow.* * Implementation of [MultiWalletCryptoCurrenciesProducer] that produces crypto currencies of all accounts * * @property params params - * @property userWalletsStore UserWallet's store + * @property userWalletsListRepository repository for getting user wallets * @property accountsResponseStoreFactory factory to create store with accounts response * @property responseCryptoCurrenciesFactory factory for creating [CryptoCurrency] from `UserTokensResponse` * @property dispatchers dispatchers @@ -29,7 +29,7 @@ import kotlinx.coroutines.flow.* */ internal class AccountListCryptoCurrenciesProducer @AssistedInject constructor( @Assisted val params: MultiWalletCryptoCurrenciesProducer.Params, - private val userWalletsStore: UserWalletsStore, + private val userWalletsListRepository: UserWalletsListRepository, private val accountsResponseStoreFactory: AccountsResponseStoreFactory, private val responseCryptoCurrenciesFactory: ResponseCryptoCurrenciesFactory, override val flowProducerTools: FlowProducerTools, @@ -40,7 +40,7 @@ internal class AccountListCryptoCurrenciesProducer @AssistedInject constructor( @Suppress("NullableToStringCall") override fun produce(): Flow> { - val userWallet = userWalletsStore.getSyncStrict(key = params.userWalletId) + val userWallet = userWalletsListRepository.getSyncStrict(id = params.userWalletId) if (!userWallet.isMultiCurrency) { error("${this::class.simpleName ?: this::class.toString()} supports only multi-currency wallet") diff --git a/data/account/src/main/kotlin/com/tangem/data/account/producer/DefaultMultiAccountListProducer.kt b/data/account/src/main/kotlin/com/tangem/data/account/producer/DefaultMultiAccountListProducer.kt index 2bab825935..39dc1c5d19 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/producer/DefaultMultiAccountListProducer.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/producer/DefaultMultiAccountListProducer.kt @@ -2,9 +2,9 @@ package com.tangem.data.account.producer import arrow.core.Option import arrow.core.some -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.account.models.AccountList import com.tangem.domain.account.producer.MultiAccountListProducer +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.core.flow.FlowProducerTools import com.tangem.domain.models.wallet.UserWallet import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -19,7 +19,8 @@ import kotlinx.coroutines.flow.* * Produces a list of [AccountList]s for all user wallets. * * @property params params - * @property userWalletsStore store that provides user wallets + * @property flowProducerTools tools for producing flows + * @property userWalletsListRepository repository for getting user wallets * @property walletAccountListFlowFactory builder to create flows of [AccountList] for each wallet * @property dispatchers coroutine dispatchers provider * @@ -28,7 +29,7 @@ import kotlinx.coroutines.flow.* internal class DefaultMultiAccountListProducer @AssistedInject constructor( @Assisted val params: Unit, override val flowProducerTools: FlowProducerTools, - private val userWalletsStore: UserWalletsStore, + private val userWalletsListRepository: UserWalletsListRepository, private val walletAccountListFlowFactory: WalletAccountListFlowFactory, private val dispatchers: CoroutineDispatcherProvider, ) : MultiAccountListProducer { @@ -37,7 +38,7 @@ internal class DefaultMultiAccountListProducer @AssistedInject constructor( @OptIn(ExperimentalCoroutinesApi::class) override fun produce(): Flow> { - return userWalletsStore.userWallets + return userWalletsListRepository.loadAndGet() .map { it.map(UserWallet::walletId) } .distinctUntilChanged() .flatMapLatest { ids -> diff --git a/data/account/src/main/kotlin/com/tangem/data/account/producer/DefaultMultiWalletCryptoCurrenciesProducer.kt b/data/account/src/main/kotlin/com/tangem/data/account/producer/DefaultMultiWalletCryptoCurrenciesProducer.kt index 8b82206cdb..6476babc80 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/producer/DefaultMultiWalletCryptoCurrenciesProducer.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/producer/DefaultMultiWalletCryptoCurrenciesProducer.kt @@ -4,7 +4,7 @@ import arrow.core.Option import arrow.core.some import com.tangem.data.common.currency.ResponseCryptoCurrenciesFactory import com.tangem.datasource.local.token.UserTokensResponseStore -import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.core.flow.FlowProducerTools import com.tangem.domain.models.account.DerivationIndex import com.tangem.domain.models.currency.CryptoCurrency @@ -20,7 +20,8 @@ import kotlinx.coroutines.flow.* * Default implementation of [MultiWalletCryptoCurrenciesProducer] * * @property params params - * @property userWalletsStore UserWallet's store + * @property flowProducerTools tools for producing flows + * @property userWalletsListRepository repository for getting user wallets * @property userTokensResponseStore store of `UserTokensResponse` * @property responseCryptoCurrenciesFactory factory for creating [CryptoCurrency] from `UserTokensResponse` * @property dispatchers dispatchers @@ -30,7 +31,7 @@ import kotlinx.coroutines.flow.* internal class DefaultMultiWalletCryptoCurrenciesProducer @AssistedInject constructor( @Assisted val params: MultiWalletCryptoCurrenciesProducer.Params, override val flowProducerTools: FlowProducerTools, - private val userWalletsStore: UserWalletsStore, + private val userWalletsListRepository: UserWalletsListRepository, private val userTokensResponseStore: UserTokensResponseStore, private val responseCryptoCurrenciesFactory: ResponseCryptoCurrenciesFactory, private val dispatchers: CoroutineDispatcherProvider, @@ -39,7 +40,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducer @AssistedInject constr override val fallback: Option> = emptySet().some() override fun produce(): Flow> { - val userWallet = userWalletsStore.getSyncStrict(key = params.userWalletId) + val userWallet = userWalletsListRepository.getSyncStrict(id = params.userWalletId) if (!userWallet.isMultiCurrency) { error("${this::class.simpleName ?: this::class.toString()} supports only multi-currency wallet") diff --git a/data/account/src/main/kotlin/com/tangem/data/account/producer/WalletAccountListFlowFactory.kt b/data/account/src/main/kotlin/com/tangem/data/account/producer/WalletAccountListFlowFactory.kt index 44aa8713fc..624eeb6679 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/producer/WalletAccountListFlowFactory.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/producer/WalletAccountListFlowFactory.kt @@ -4,9 +4,9 @@ import com.tangem.data.account.converter.AccountListConverter import com.tangem.data.account.store.AccountsResponseStore import com.tangem.data.account.store.AccountsResponseStoreFactory import com.tangem.data.common.currency.CardCryptoCurrencyFactory -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.account.models.AccountList import com.tangem.domain.card.common.util.cardTypesResolver +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.isMultiCurrency @@ -17,6 +17,7 @@ import javax.inject.Inject /** * Factory that creates a flow of [AccountList] for a specific [UserWallet] * + * @property userWalletsListRepository repository to get user wallets * @property accountsResponseStoreFactory factory to create [AccountsResponseStore] * @property accountListConverterFactory factory to create [AccountListConverter] * @property cardCryptoCurrencyFactory factory to create supported crypto currencies for a card @@ -24,14 +25,14 @@ import javax.inject.Inject [REDACTED_AUTHOR] */ internal class WalletAccountListFlowFactory @Inject constructor( - private val userWalletsStore: UserWalletsStore, + private val userWalletsListRepository: UserWalletsListRepository, private val accountsResponseStoreFactory: AccountsResponseStoreFactory, private val accountListConverterFactory: AccountListConverter.Factory, private val cardCryptoCurrencyFactory: CardCryptoCurrencyFactory, ) { fun create(userWalletId: UserWalletId): Flow { - val userWallet = userWalletsStore.getSyncStrict(userWalletId) + val userWallet = userWalletsListRepository.getSyncStrict(userWalletId) return if (userWallet.isMultiCurrency) { createForMultiWallet(userWallet) diff --git a/data/account/src/main/kotlin/com/tangem/data/account/repository/DefaultAccountsCRUDRepository.kt b/data/account/src/main/kotlin/com/tangem/data/account/repository/DefaultAccountsCRUDRepository.kt index 2bb36f1808..ef589cc97d 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/repository/DefaultAccountsCRUDRepository.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/repository/DefaultAccountsCRUDRepository.kt @@ -22,7 +22,6 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse import com.tangem.datasource.local.datastore.RuntimeStateStore -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.datasource.utils.getSyncOrNull import com.tangem.domain.account.models.AccountList import com.tangem.domain.account.models.ArchivedAccount @@ -30,7 +29,6 @@ import com.tangem.domain.account.repository.AccountsCRUDRepository import com.tangem.domain.models.account.Account import com.tangem.domain.models.account.AccountId import com.tangem.domain.models.account.AccountName -import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.extensions.replaceBy @@ -48,7 +46,6 @@ internal class DefaultAccountsCRUDRepository( private val walletAccountsSaver: WalletAccountsSaver, private val accountsResponseStoreFactory: AccountsResponseStoreFactory, private val archivedAccountsStoreFactory: ArchivedAccountsStoreFactory, - private val userWalletsStore: UserWalletsStore, private val userTokensSaver: UserTokensSaver, private val archivedAccountsETagStore: RuntimeStateStore>, private val convertersContainer: AccountConverterFactoryContainer, @@ -205,14 +202,6 @@ internal class DefaultAccountsCRUDRepository( .map { it?.accounts?.size.toOption() } } - override fun getUserWallet(userWalletId: UserWalletId): UserWallet { - return userWalletsStore.getSyncStrict(userWalletId) - } - - override fun getUserWallets(): Flow> = userWalletsStore.userWallets - - override fun getUserWalletsSync(): List = userWalletsStore.userWalletsSync - override fun checkDefaultAccountName(accountList: AccountList, accountName: AccountName) { val hasDefaultName = accountList.accounts.any { it.accountName is AccountName.DefaultMain } diff --git a/data/account/src/main/kotlin/com/tangem/data/account/utils/DefaultWalletAccountsResponseFactory.kt b/data/account/src/main/kotlin/com/tangem/data/account/utils/DefaultWalletAccountsResponseFactory.kt index 023e9161ec..e49529c64f 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/utils/DefaultWalletAccountsResponseFactory.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/utils/DefaultWalletAccountsResponseFactory.kt @@ -6,8 +6,8 @@ import com.tangem.data.common.network.NetworkFactory import com.tangem.datasource.api.tangemTech.models.UserTokensResponse import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.account.models.AccountList +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.account.Account import com.tangem.domain.models.account.AccountId import com.tangem.domain.models.account.DerivationIndex @@ -18,7 +18,7 @@ import javax.inject.Inject /** * Factory to create default [GetWalletAccountsResponse]. * - * @property userWalletsStore store to get user wallet information + * @property userWalletsListRepository repository to get user wallets * @property cryptoPortfolioCF converter factory to convert crypto portfolio accounts * @property userTokensResponseFactory factory to create [UserTokensResponse] * @property networkFactory factory to create network derivation path @@ -26,14 +26,14 @@ import javax.inject.Inject [REDACTED_AUTHOR] */ internal class DefaultWalletAccountsResponseFactory @Inject constructor( - private val userWalletsStore: UserWalletsStore, + private val userWalletsListRepository: UserWalletsListRepository, private val cryptoPortfolioCF: CryptoPortfolioConverter.Factory, private val userTokensResponseFactory: UserTokensResponseFactory, private val networkFactory: NetworkFactory, ) { fun create(userWalletId: UserWalletId, userTokensResponse: UserTokensResponse?): GetWalletAccountsResponse { - val userWallet = userWalletsStore.getSyncOrNull(userWalletId) + val userWallet = userWalletsListRepository.getSyncOrNull(userWalletId) val accountDTOs = userWallet?.let(::createDefaultAccountDTOs).orEmpty() val response = userTokensResponse.orDefault(userWallet = userWallet) diff --git a/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcherTest.kt b/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcherTest.kt index a2971c7891..8606110353 100644 --- a/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcherTest.kt +++ b/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultMultiAccountListFetcherTest.kt @@ -2,9 +2,9 @@ package com.tangem.data.account.fetcher import arrow.core.left import arrow.core.right -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.account.fetcher.MultiAccountListFetcher import com.tangem.domain.account.fetcher.SingleAccountListFetcher +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.test.core.assertEitherLeft @@ -19,9 +19,12 @@ import org.junit.jupiter.api.TestInstance class DefaultMultiAccountListFetcherTest { private val singleAccountListFetcher: SingleAccountListFetcher = mockk() - private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true) + private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true) - private val fetcher = DefaultMultiAccountListFetcher(singleAccountListFetcher, userWalletsStore) + private val fetcher = DefaultMultiAccountListFetcher( + singleAccountListFetcher = singleAccountListFetcher, + userWalletsListRepository = userWalletsListRepository, + ) private val userWalletId1 = UserWalletId("011") private val userWalletId2 = UserWalletId("012") @@ -35,7 +38,7 @@ class DefaultMultiAccountListFetcherTest { @AfterEach fun tearDown() { - clearMocks(singleAccountListFetcher, userWalletsStore) + clearMocks(singleAccountListFetcher, userWalletsListRepository) } @Test @@ -98,7 +101,7 @@ class DefaultMultiAccountListFetcherTest { // Arrange val params = MultiAccountListFetcher.Params.All - every { userWalletsStore.userWalletsSync } returns listOf(userWallets.first()) + every { userWalletsListRepository.userWallets.value } returns listOf(userWallets.first()) coEvery { singleAccountListFetcher(params = SingleAccountListFetcher.Params(userWalletId1)) @@ -111,7 +114,7 @@ class DefaultMultiAccountListFetcherTest { assertEitherRight(actual) coVerify(ordering = Ordering.SEQUENCE) { - userWalletsStore.userWalletsSync + userWalletsListRepository.userWallets.value singleAccountListFetcher(params = SingleAccountListFetcher.Params(userWalletId1)) } } @@ -121,7 +124,7 @@ class DefaultMultiAccountListFetcherTest { // Arrange val params = MultiAccountListFetcher.Params.All - every { userWalletsStore.userWalletsSync } returns userWallets + every { userWalletsListRepository.userWallets.value } returns userWallets val exception = Exception("Fetch failed") coEvery { @@ -145,7 +148,7 @@ class DefaultMultiAccountListFetcherTest { assertEitherLeft(actual, expected) coVerify(ordering = Ordering.SEQUENCE) { - userWalletsStore.userWalletsSync + userWalletsListRepository.userWallets.value singleAccountListFetcher(params = SingleAccountListFetcher.Params(userWalletId1)) singleAccountListFetcher(params = SingleAccountListFetcher.Params(userWalletId2)) } diff --git a/data/account/src/test/java/com/tangem/data/account/producer/DefaultMultiAccountListProducerTest.kt b/data/account/src/test/java/com/tangem/data/account/producer/DefaultMultiAccountListProducerTest.kt index 8f3c2695b2..d080bf325f 100644 --- a/data/account/src/test/java/com/tangem/data/account/producer/DefaultMultiAccountListProducerTest.kt +++ b/data/account/src/test/java/com/tangem/data/account/producer/DefaultMultiAccountListProducerTest.kt @@ -1,8 +1,8 @@ package com.tangem.data.account.producer import com.google.common.truth.Truth -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.account.models.AccountList +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.core.flow.FlowProducerTools import com.tangem.domain.models.TokensSortType import com.tangem.domain.models.wallet.UserWallet @@ -27,15 +27,15 @@ import org.junit.jupiter.api.TestInstance @TestInstance(TestInstance.Lifecycle.PER_CLASS) class DefaultMultiAccountListProducerTest { - private val userWalletsStore: UserWalletsStore = mockk() + private val userWalletsListRepository: UserWalletsListRepository = mockk() private val walletAccountListFlowFactory: WalletAccountListFlowFactory = mockk() private val flowProducerTools: FlowProducerTools = mockk() private val producer = DefaultMultiAccountListProducer( params = Unit, - userWalletsStore = userWalletsStore, - walletAccountListFlowFactory = walletAccountListFlowFactory, flowProducerTools = flowProducerTools, + userWalletsListRepository = userWalletsListRepository, + walletAccountListFlowFactory = walletAccountListFlowFactory, dispatchers = TestingCoroutineDispatcherProvider(), ) @@ -46,14 +46,14 @@ class DefaultMultiAccountListProducerTest { @AfterEach fun tearDownEach() { - clearMocks(userWalletsStore, walletAccountListFlowFactory) + clearMocks(userWalletsListRepository, walletAccountListFlowFactory) } @Test fun produce() = runTest { // Arrange val userWalletsFlow = MutableStateFlow(value = listOf(userWallet)) - every { userWalletsStore.userWallets } returns userWalletsFlow + every { userWalletsListRepository.loadAndGet() } returns userWalletsFlow val accountList = AccountList.empty(userWalletId) every { walletAccountListFlowFactory.create(userWalletId) } returns flowOf(accountList) @@ -66,7 +66,7 @@ class DefaultMultiAccountListProducerTest { Truth.assertThat(actual).containsExactly(expected) coVerify(ordering = Ordering.SEQUENCE) { - userWalletsStore.userWallets + userWalletsListRepository.loadAndGet() walletAccountListFlowFactory.create(userWalletId) } } @@ -75,7 +75,7 @@ class DefaultMultiAccountListProducerTest { fun `flow will updated if factoryFlow is updated`() = runTest { // Arrange val userWalletsFlow = MutableStateFlow(value = listOf(userWallet)) - every { userWalletsStore.userWallets } returns userWalletsFlow + every { userWalletsListRepository.loadAndGet() } returns userWalletsFlow val accountList = AccountList.empty(userWalletId) val updatedAccountList = AccountList.empty(userWalletId = userWalletId, sortType = TokensSortType.NONE) @@ -98,9 +98,9 @@ class DefaultMultiAccountListProducerTest { Truth.assertThat(secondEmission).containsExactly(listOf(updatedAccountList)) coVerify(ordering = Ordering.SEQUENCE) { - userWalletsStore.userWallets + userWalletsListRepository.loadAndGet() walletAccountListFlowFactory.create(userWalletId) - userWalletsStore.userWallets + userWalletsListRepository.loadAndGet() walletAccountListFlowFactory.create(userWalletId) } } @@ -109,7 +109,7 @@ class DefaultMultiAccountListProducerTest { fun `flow is filtered the same response`() = runTest { // Arrange val userWalletsFlow = MutableStateFlow(value = listOf(userWallet)) - every { userWalletsStore.userWallets } returns userWalletsFlow + every { userWalletsListRepository.loadAndGet() } returns userWalletsFlow val accountList = AccountList.empty(userWalletId) val factoryFlow = MutableStateFlow(null) @@ -131,9 +131,9 @@ class DefaultMultiAccountListProducerTest { Truth.assertThat(secondEmission).containsExactly(listOf(accountList)) coVerify(ordering = Ordering.SEQUENCE) { - userWalletsStore.userWallets + userWalletsListRepository.loadAndGet() walletAccountListFlowFactory.create(userWalletId) - userWalletsStore.userWallets + userWalletsListRepository.loadAndGet() walletAccountListFlowFactory.create(userWalletId) } } @@ -143,7 +143,7 @@ class DefaultMultiAccountListProducerTest { fun `flow returns empty list if factory throws exception`() = runTest { // Arrange val userWalletsFlow = MutableStateFlow(value = listOf(userWallet)) - every { userWalletsStore.userWallets } returns userWalletsFlow + every { userWalletsListRepository.loadAndGet() } returns userWalletsFlow val exception = RuntimeException("Converter error") every { walletAccountListFlowFactory.create(userWalletId) } throws exception @@ -156,7 +156,7 @@ class DefaultMultiAccountListProducerTest { Truth.assertThat(actual).containsExactly(expected) coVerify(ordering = Ordering.SEQUENCE) { - userWalletsStore.userWallets + userWalletsListRepository.loadAndGet() walletAccountListFlowFactory.create(userWalletId) } } @@ -165,7 +165,7 @@ class DefaultMultiAccountListProducerTest { fun `flow is empty if userWalletsFlow returns empty flow`() = runTest { // Arrange val userWalletsFlow = emptyFlow>() - every { userWalletsStore.userWallets } returns userWalletsFlow + every { userWalletsListRepository.loadAndGet() } returns userWalletsFlow // Act val actual = producer.produce().let(::getEmittedValues) @@ -173,7 +173,7 @@ class DefaultMultiAccountListProducerTest { // Assert Truth.assertThat(actual).isEmpty() // no emissions - coVerify(exactly = 1) { userWalletsStore.userWallets } + coVerify(exactly = 1) { userWalletsListRepository.loadAndGet() } coVerify(inverse = true) { walletAccountListFlowFactory.create(any()) } } @@ -181,7 +181,7 @@ class DefaultMultiAccountListProducerTest { fun `flow is empty if factory returns empty flow`() = runTest { // Arrange val userWalletsFlow = MutableStateFlow(value = listOf(userWallet)) - every { userWalletsStore.userWallets } returns userWalletsFlow + every { userWalletsListRepository.loadAndGet() } returns userWalletsFlow every { walletAccountListFlowFactory.create(userWalletId) } returns emptyFlow() @@ -192,7 +192,7 @@ class DefaultMultiAccountListProducerTest { Truth.assertThat(actual).isEmpty() // no emissions coVerify(ordering = Ordering.SEQUENCE) { - userWalletsStore.userWallets + userWalletsListRepository.loadAndGet() walletAccountListFlowFactory.create(userWalletId) } } @@ -206,7 +206,7 @@ class DefaultMultiAccountListProducerTest { } val userWalletsFlow = MutableStateFlow(listOf(userWallet, userWallet2)) - every { userWalletsStore.userWallets } returns userWalletsFlow + every { userWalletsListRepository.loadAndGet() } returns userWalletsFlow val accountList = AccountList.empty(userWalletId) every { walletAccountListFlowFactory.create(userWalletId) } returns flowOf(accountList) @@ -219,7 +219,7 @@ class DefaultMultiAccountListProducerTest { Truth.assertThat(actual).isEmpty() // no emissions coVerify(ordering = Ordering.SEQUENCE) { - userWalletsStore.userWallets + userWalletsListRepository.loadAndGet() walletAccountListFlowFactory.create(userWalletId) walletAccountListFlowFactory.create(userWalletId2) } diff --git a/data/account/src/test/java/com/tangem/data/account/producer/DefaultMultiWalletCryptoCurrenciesProducerTest.kt b/data/account/src/test/java/com/tangem/data/account/producer/DefaultMultiWalletCryptoCurrenciesProducerTest.kt index daf026b88f..a923d82c5c 100644 --- a/data/account/src/test/java/com/tangem/data/account/producer/DefaultMultiWalletCryptoCurrenciesProducerTest.kt +++ b/data/account/src/test/java/com/tangem/data/account/producer/DefaultMultiWalletCryptoCurrenciesProducerTest.kt @@ -8,8 +8,8 @@ import com.tangem.common.test.domain.wallet.MockUserWalletFactory import com.tangem.data.common.currency.ResponseCryptoCurrenciesFactory import com.tangem.datasource.api.tangemTech.models.UserTokensResponse import com.tangem.datasource.local.token.UserTokensResponseStore -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.card.configs.GenericCardConfig +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.core.flow.FlowProducerTools import com.tangem.domain.models.account.DerivationIndex import com.tangem.domain.models.currency.CryptoCurrency @@ -35,23 +35,23 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { private val cryptoCurrencyFactory = MockCryptoCurrencyFactory() private val params = MultiWalletCryptoCurrenciesProducer.Params(userWalletId = userWallet.walletId) - private val userWalletsStore: UserWalletsStore = mockk(relaxUnitFun = true) + private val userWalletsListRepository: UserWalletsListRepository = mockk(relaxUnitFun = true) private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxUnitFun = true) private val responseCryptoCurrenciesFactory: ResponseCryptoCurrenciesFactory = mockk() private val flowProducerTools: FlowProducerTools = mockk() private val producer = DefaultMultiWalletCryptoCurrenciesProducer( params = params, - userWalletsStore = userWalletsStore, + flowProducerTools = flowProducerTools, + userWalletsListRepository = userWalletsListRepository, userTokensResponseStore = userTokensResponseStore, responseCryptoCurrenciesFactory = responseCryptoCurrenciesFactory, - flowProducerTools = flowProducerTools, dispatchers = TestingCoroutineDispatcherProvider(), ) @BeforeEach fun resetMocks() { - clearMocks(userWalletsStore, userTokensResponseStore, responseCryptoCurrenciesFactory) + clearMocks(userWalletsListRepository, userTokensResponseStore, responseCryptoCurrenciesFactory) } @Test @@ -59,7 +59,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { // Arrange val userTokensResponseFlow = flowOf(null) - every { userWalletsStore.getSyncStrict(params.userWalletId) } returns userWallet + every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns userWallet every { userTokensResponseStore.get(params.userWalletId) } returns userTokensResponseFlow // Act @@ -72,7 +72,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { Truth.assertThat(actual.first()).isEqualTo(expected) verifyOrder { - userWalletsStore.getSyncStrict(params.userWalletId) + userWalletsListRepository.getSyncStrict(params.userWalletId) userTokensResponseStore.get(params.userWalletId) } @@ -113,7 +113,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { cryptoCurrencyFactory.createCoin(Blockchain.Bitcoin), ) - every { userWalletsStore.getSyncStrict(params.userWalletId) } returns userWallet + every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns userWallet every { userTokensResponseStore.get(params.userWalletId) } returns userTokensResponseFlow every { @@ -146,7 +146,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { Truth.assertThat(actual1.first()).isEqualTo(expected1) verifyOrder { - userWalletsStore.getSyncStrict(params.userWalletId) + userWalletsListRepository.getSyncStrict(params.userWalletId) userTokensResponseStore.get(params.userWalletId) responseCryptoCurrenciesFactory.createCurrencies( response = userTokensResponse, @@ -188,7 +188,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { val cryptoCurrencies = emptySet() - every { userWalletsStore.getSyncStrict(params.userWalletId) } returns userWallet + every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns userWallet every { userTokensResponseStore.get(params.userWalletId) } returns userTokensResponseFlow every { @@ -213,7 +213,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { Truth.assertThat(actual1.first()).isEqualTo(expected1) verifyOrder { - userWalletsStore.getSyncStrict(params.userWalletId) + userWalletsListRepository.getSyncStrict(params.userWalletId) userTokensResponseStore.get(params.userWalletId) responseCryptoCurrenciesFactory.createCurrencies( response = userTokensResponse, @@ -257,7 +257,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { } .buffer(capacity = 5) - every { userWalletsStore.getSyncStrict(params.userWalletId) } returns userWallet + every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns userWallet every { userTokensResponseStore.get(params.userWalletId) } returns userTokensResponseFlow every { @@ -279,7 +279,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { Truth.assertThat(actual1.first()).isEqualTo(expected1) verifyOrder { - userWalletsStore.getSyncStrict(params.userWalletId) + userWalletsListRepository.getSyncStrict(params.userWalletId) userTokensResponseStore.get(params.userWalletId) } @@ -304,7 +304,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { @Test fun `flow is empty if store returns empty flow`() = runTest { // Arrange - every { userWalletsStore.getSyncStrict(params.userWalletId) } returns userWallet + every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns userWallet every { userTokensResponseStore.get(params.userWalletId) } returns emptyFlow() // Act @@ -316,7 +316,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { Truth.assertThat(actual.first()).isEqualTo(expected) verifyOrder { - userWalletsStore.getSyncStrict(params.userWalletId) + userWalletsListRepository.getSyncStrict(params.userWalletId) userTokensResponseStore.get(params.userWalletId) } @@ -332,7 +332,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { every { isMultiCurrency } returns false } - every { userWalletsStore.getSyncStrict(params.userWalletId) } returns mockUserWallet + every { userWalletsListRepository.getSyncStrict(params.userWalletId) } returns mockUserWallet // Act val actual = runCatching { producer.produce() }.exceptionOrNull() @@ -345,7 +345,7 @@ internal class DefaultMultiWalletCryptoCurrenciesProducerTest { Truth.assertThat(actual).isInstanceOf(expected::class.java) Truth.assertThat(actual).hasMessageThat().isEqualTo(expected.message) - verifyOrder { userWalletsStore.getSyncStrict(params.userWalletId) } + verifyOrder { userWalletsListRepository.getSyncStrict(params.userWalletId) } verify(inverse = true) { userTokensResponseStore.get(any()) diff --git a/data/account/src/test/java/com/tangem/data/account/producer/WalletAccountListFlowFactoryTest.kt b/data/account/src/test/java/com/tangem/data/account/producer/WalletAccountListFlowFactoryTest.kt index 47b5fb3992..61d285462f 100644 --- a/data/account/src/test/java/com/tangem/data/account/producer/WalletAccountListFlowFactoryTest.kt +++ b/data/account/src/test/java/com/tangem/data/account/producer/WalletAccountListFlowFactoryTest.kt @@ -9,8 +9,8 @@ import com.tangem.data.account.store.AccountsResponseStore import com.tangem.data.account.store.AccountsResponseStoreFactory import com.tangem.data.common.currency.CardCryptoCurrencyFactory import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.account.models.AccountList +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.isMultiCurrency @@ -29,7 +29,7 @@ import org.junit.jupiter.api.TestInstance @TestInstance(TestInstance.Lifecycle.PER_CLASS) class WalletAccountListFlowFactoryTest { - private val userWalletsStore: UserWalletsStore = mockk() + private val userWalletsListRepository: UserWalletsListRepository = mockk() private val accountsResponseStoreFactory: AccountsResponseStoreFactory = mockk() private val accountsResponseStore: AccountsResponseStore = mockk() private val accountsResponseStoreFlow = MutableStateFlow(value = null) @@ -40,7 +40,7 @@ class WalletAccountListFlowFactoryTest { private val cardCryptoCurrencyFactory: CardCryptoCurrencyFactory = mockk() private val factory = WalletAccountListFlowFactory( - userWalletsStore = userWalletsStore, + userWalletsListRepository = userWalletsListRepository, accountsResponseStoreFactory = accountsResponseStoreFactory, accountListConverterFactory = accountListConverterFactory, cardCryptoCurrencyFactory = cardCryptoCurrencyFactory, @@ -52,7 +52,7 @@ class WalletAccountListFlowFactoryTest { @AfterEach fun tearDownEach() { clearMocks( - userWalletsStore, + userWalletsListRepository, accountsResponseStoreFactory, accountsResponseStore, accountListConverterFactory, @@ -70,7 +70,7 @@ class WalletAccountListFlowFactoryTest { every { this@mockk.isMultiCurrency } returns true } - every { userWalletsStore.getSyncStrict(userWalletId) } returns userWallet + every { userWalletsListRepository.getSyncStrict(userWalletId) } returns userWallet val accountsResponse = createGetWalletAccountsResponse(userWalletId) every { accountsResponseStoreFactory.create(userWalletId) } returns accountsResponseStore @@ -105,7 +105,7 @@ class WalletAccountListFlowFactoryTest { fun `create for single wallet`() = runTest { val userWallet = MockUserWalletFactory.create().copy(isMultiCurrency = false) - every { userWalletsStore.getSyncStrict(userWallet.walletId) } returns userWallet + every { userWalletsListRepository.getSyncStrict(userWallet.walletId) } returns userWallet val currency = cryptoCurrencyFactory.ethereum every { cardCryptoCurrencyFactory.createPrimaryCurrencyForSingleCurrencyCard(userWallet) } returns currency @@ -134,7 +134,7 @@ class WalletAccountListFlowFactoryTest { fun `flow is created for single wallet with token`() = runTest { val nodl = MockUserWalletFactory.createSingleWalletWithToken() - every { userWalletsStore.getSyncStrict(nodl.walletId) } returns nodl + every { userWalletsListRepository.getSyncStrict(nodl.walletId) } returns nodl val currencies = cryptoCurrencyFactory.ethereumAndStellar.toSet() every { diff --git a/data/account/src/test/java/com/tangem/data/account/repository/DefaultAccountsCRUDRepositoryTest.kt b/data/account/src/test/java/com/tangem/data/account/repository/DefaultAccountsCRUDRepositoryTest.kt index 68741d16a3..0adcc20b4a 100644 --- a/data/account/src/test/java/com/tangem/data/account/repository/DefaultAccountsCRUDRepositoryTest.kt +++ b/data/account/src/test/java/com/tangem/data/account/repository/DefaultAccountsCRUDRepositoryTest.kt @@ -17,7 +17,6 @@ import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResp import com.tangem.datasource.api.tangemTech.models.account.GetWalletArchivedAccountsResponse import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO import com.tangem.datasource.local.datastore.RuntimeStateStore -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.account.models.AccountList import com.tangem.domain.account.models.ArchivedAccount import com.tangem.domain.models.account.Account.CryptoPortfolio @@ -52,7 +51,6 @@ class DefaultAccountsCRUDRepositoryTest { private val archivedAccountsInnerStore = RuntimeStateStore?>(defaultValue = null) private val archivedAccountsStore = ArchivedAccountsStore(runtimeStore = archivedAccountsInnerStore) - private val userWalletsStore: UserWalletsStore = mockk() private val userTokensSaver: UserTokensSaver = mockk() private val archivedAccountsETagStore: RuntimeStateStore> = mockk(relaxUnitFun = true) @@ -67,7 +65,6 @@ class DefaultAccountsCRUDRepositoryTest { walletAccountsSaver = walletAccountsSaver, accountsResponseStoreFactory = accountsResponseStoreFactory, archivedAccountsStoreFactory = archivedAccountsStoreFactory, - userWalletsStore = userWalletsStore, userTokensSaver = userTokensSaver, archivedAccountsETagStore = archivedAccountsETagStore, convertersContainer = convertersContainer, diff --git a/data/account/src/test/java/com/tangem/data/account/utils/DefaultWalletAccountsResponseFactoryTest.kt b/data/account/src/test/java/com/tangem/data/account/utils/DefaultWalletAccountsResponseFactoryTest.kt index 86949ca186..6ed7920120 100644 --- a/data/account/src/test/java/com/tangem/data/account/utils/DefaultWalletAccountsResponseFactoryTest.kt +++ b/data/account/src/test/java/com/tangem/data/account/utils/DefaultWalletAccountsResponseFactoryTest.kt @@ -8,8 +8,8 @@ import com.tangem.data.common.currency.UserTokensResponseFactory import com.tangem.data.common.network.NetworkFactory import com.tangem.datasource.api.tangemTech.models.UserTokensResponse import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse -import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.account.models.AccountList +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.account.Account import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId @@ -23,14 +23,14 @@ import org.junit.jupiter.api.TestInstance @TestInstance(TestInstance.Lifecycle.PER_CLASS) class DefaultWalletAccountsResponseFactoryTest { - private val userWalletsStore = mockk() + private val userWalletsListRepository = mockk() private val cryptoPortfolioCF = mockk() private val cryptoPortfolioConverter = mockk() private val userTokensResponseFactory = mockk() private val networkFactory = mockk() private val factory = DefaultWalletAccountsResponseFactory( - userWalletsStore = userWalletsStore, + userWalletsListRepository = userWalletsListRepository, cryptoPortfolioCF = cryptoPortfolioCF, userTokensResponseFactory = userTokensResponseFactory, networkFactory = networkFactory, @@ -46,7 +46,7 @@ class DefaultWalletAccountsResponseFactoryTest { @AfterEach fun tearDownEach() { clearMocks( - userWalletsStore, + userWalletsListRepository, cryptoPortfolioCF, cryptoPortfolioConverter, userTokensResponseFactory, @@ -63,7 +63,7 @@ class DefaultWalletAccountsResponseFactoryTest { tokens = emptyList(), ) - coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns null + coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns null every { userTokensResponseFactory.createDefaultResponse( userWallet = null, @@ -89,7 +89,7 @@ class DefaultWalletAccountsResponseFactoryTest { Truth.assertThat(actual).isEqualTo(expected) coVerifyOrder { - userWalletsStore.getSyncOrNull(userWalletId) + userWalletsListRepository.getSyncOrNull(userWalletId) userTokensResponseFactory.createDefaultResponse( userWallet = null, networkFactory = networkFactory, @@ -105,7 +105,7 @@ class DefaultWalletAccountsResponseFactoryTest { every { walletId } returns userWalletId } - coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet + coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet val accounts = AccountList.empty(userWallet.walletId).accounts .filterIsInstance() @@ -145,7 +145,7 @@ class DefaultWalletAccountsResponseFactoryTest { Truth.assertThat(actual).isEqualTo(expected) coVerifyOrder { - userWalletsStore.getSyncOrNull(userWalletId) + userWalletsListRepository.getSyncOrNull(userWalletId) cryptoPortfolioConverter.convertListBack(accounts) userTokensResponseFactory.createDefaultResponse( userWallet = userWallet, @@ -165,7 +165,7 @@ class DefaultWalletAccountsResponseFactoryTest { val accounts = AccountList.empty(userWallet.walletId).accounts .filterIsInstance() - coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet + coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet val defaultResponse = UserTokensResponse( group = UserTokensResponse.GroupType.NETWORK, @@ -206,7 +206,7 @@ class DefaultWalletAccountsResponseFactoryTest { val userWallet = mockk(relaxed = true) { every { walletId } returns userWalletId } - coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet + coEvery { userWalletsListRepository.getSyncOrNull(userWalletId) } returns userWallet val userTokensResponse = UserTokensResponse( group = UserTokensResponse.GroupType.NETWORK, diff --git a/domain/account/build.gradle.kts b/domain/account/build.gradle.kts index 0d035a8fe5..c3434b09e3 100644 --- a/domain/account/build.gradle.kts +++ b/domain/account/build.gradle.kts @@ -10,6 +10,7 @@ tasks.withType().configureEach { dependencies { + api(projects.domain.common) api(projects.domain.core) api(projects.domain.models) api(projects.domain.wallets.models) diff --git a/domain/account/src/main/java/com/tangem/domain/account/repository/AccountsCRUDRepository.kt b/domain/account/src/main/java/com/tangem/domain/account/repository/AccountsCRUDRepository.kt index 8967491701..59048e8fab 100644 --- a/domain/account/src/main/java/com/tangem/domain/account/repository/AccountsCRUDRepository.kt +++ b/domain/account/src/main/java/com/tangem/domain/account/repository/AccountsCRUDRepository.kt @@ -6,7 +6,6 @@ import com.tangem.domain.account.models.ArchivedAccount import com.tangem.domain.models.account.Account import com.tangem.domain.models.account.AccountId import com.tangem.domain.models.account.AccountName -import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import kotlinx.coroutines.flow.Flow @@ -108,20 +107,6 @@ interface AccountsCRUDRepository { */ fun getTotalActiveAccountsCount(userWalletId: UserWalletId): Flow> - /** - * Retrieves a user wallet by its unique identifier - * - * @param userWalletId the unique identifier of the user wallet - * @return the [UserWallet] associated with the given identifier - */ - fun getUserWallet(userWalletId: UserWalletId): UserWallet - - /** Provides a flow of all user wallets */ - fun getUserWallets(): Flow> - - /** Synchronously retrieves all user wallets */ - fun getUserWalletsSync(): List - /** Checks if the provided account name is the default name within the given account list * * @param accountList the list of accounts to check against diff --git a/domain/account/src/main/java/com/tangem/domain/account/usecase/IsAccountsModeEnabledUseCase.kt b/domain/account/src/main/java/com/tangem/domain/account/usecase/IsAccountsModeEnabledUseCase.kt index 86aa4adc9c..f374e1867d 100644 --- a/domain/account/src/main/java/com/tangem/domain/account/usecase/IsAccountsModeEnabledUseCase.kt +++ b/domain/account/src/main/java/com/tangem/domain/account/usecase/IsAccountsModeEnabledUseCase.kt @@ -4,6 +4,7 @@ import arrow.core.Option import arrow.core.getOrElse import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles import com.tangem.domain.account.repository.AccountsCRUDRepository +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.isMultiCurrency import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -14,12 +15,15 @@ import kotlinx.coroutines.flow.* * Accounts mode is considered enabled if there are at least two accounts in any of the user wallets that support * multiple currencies. * - * @property crudRepository repository to interact with user wallets and their accounts + * @property crudRepository repository to perform CRUD operations on accounts. + * @property userWalletsListRepository repository to get the list of user wallets. + * @property accountsFeatureToggles feature toggles for accounts. * [REDACTED_AUTHOR] */ class IsAccountsModeEnabledUseCase( private val crudRepository: AccountsCRUDRepository, + private val userWalletsListRepository: UserWalletsListRepository, private val accountsFeatureToggles: AccountsFeatureToggles, ) { @@ -27,7 +31,7 @@ class IsAccountsModeEnabledUseCase( operator fun invoke(): Flow { if (!accountsFeatureToggles.isFeatureEnabled) return flowOf(value = false) - return crudRepository.getUserWallets() + return userWalletsListRepository.loadAndGet() .flatMapLatest { userWallets -> val totalAccountsCountList = getTotalAccountsCountList(userWallets) @@ -40,7 +44,7 @@ class IsAccountsModeEnabledUseCase( suspend fun invokeSync(): Boolean { if (!accountsFeatureToggles.isFeatureEnabled) return false - return crudRepository.getUserWalletsSync() + return userWalletsListRepository.userWallets.value.orEmpty() .map { userWallet -> // If the wallet does not support multiple currencies, we consider its account count as 0 if (!userWallet.isMultiCurrency) return@map 0 @@ -50,7 +54,6 @@ class IsAccountsModeEnabledUseCase( .isModeEnabled() } - @Suppress("UnusedFlow") private fun getTotalAccountsCountList(userWallets: List): List> { return userWallets .map { userWallet -> diff --git a/domain/account/src/test/kotlin/com/tangem/domain/account/usecase/IsAccountsModeEnabledUseCaseTest.kt b/domain/account/src/test/kotlin/com/tangem/domain/account/usecase/IsAccountsModeEnabledUseCaseTest.kt index e5d8cfedc1..9b9f38a4c6 100644 --- a/domain/account/src/test/kotlin/com/tangem/domain/account/usecase/IsAccountsModeEnabledUseCaseTest.kt +++ b/domain/account/src/test/kotlin/com/tangem/domain/account/usecase/IsAccountsModeEnabledUseCaseTest.kt @@ -5,6 +5,7 @@ import arrow.core.some import com.google.common.truth.Truth import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles import com.tangem.domain.account.repository.AccountsCRUDRepository +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.isMultiCurrency @@ -24,13 +25,18 @@ import org.junit.jupiter.api.TestInstance class IsAccountsModeEnabledUseCaseTest { private val accountsCRUDRepository: AccountsCRUDRepository = mockk() + private val userWalletsListRepository: UserWalletsListRepository = mockk() private val featureToggles: AccountsFeatureToggles = mockk() - private val useCase = IsAccountsModeEnabledUseCase(accountsCRUDRepository, featureToggles) + private val useCase = IsAccountsModeEnabledUseCase( + crudRepository = accountsCRUDRepository, + userWalletsListRepository = userWalletsListRepository, + accountsFeatureToggles = featureToggles, + ) @AfterEach fun tearDown() { - clearMocks(accountsCRUDRepository, featureToggles) + clearMocks(userWalletsListRepository, accountsCRUDRepository, featureToggles) } @Nested @@ -49,14 +55,14 @@ class IsAccountsModeEnabledUseCaseTest { Truth.assertThat(actual).isFalse() verify(exactly = 1) { featureToggles.isFeatureEnabled } - verify(inverse = true) { accountsCRUDRepository.getUserWallets() } + verify(inverse = true) { userWalletsListRepository.loadAndGet() } } @Test - fun `returns false when getUserWallets emits empty flow`() = runTest { + fun `returns false when loadAndGet emits empty flow`() = runTest { // Arrange every { featureToggles.isFeatureEnabled } returns true - every { accountsCRUDRepository.getUserWallets() } returns emptyFlow() + every { userWalletsListRepository.loadAndGet() } returns emptyFlow() // Act val actual = useCase.invoke().firstOrNull() @@ -66,19 +72,19 @@ class IsAccountsModeEnabledUseCaseTest { verifyOrder { featureToggles.isFeatureEnabled - accountsCRUDRepository.getUserWallets() + userWalletsListRepository.loadAndGet() } verify(inverse = true) { accountsCRUDRepository.getTotalActiveAccountsCount(any()) } } @Test - fun `returns false when getUserWallets emits one wallet with isMultiCurrency false`() = runTest { + fun `returns false when loadAndGet emits one wallet with isMultiCurrency false`() = runTest { // Arrange val wallet = createUserWallet(isMultiCurrency = false) every { featureToggles.isFeatureEnabled } returns true - every { accountsCRUDRepository.getUserWallets() } returns flowOf(listOf(wallet)) + every { userWalletsListRepository.loadAndGet() } returns flowOf(listOf(wallet)) // Act val actual = useCase.invoke().first() @@ -88,19 +94,19 @@ class IsAccountsModeEnabledUseCaseTest { verifyOrder { featureToggles.isFeatureEnabled - accountsCRUDRepository.getUserWallets() + userWalletsListRepository.loadAndGet() } verify(inverse = true) { accountsCRUDRepository.getTotalActiveAccountsCount(any()) } } @Test - fun `returns true when getUserWallets emits one wallet with isMultiCurrency true`() = runTest { + fun `returns true when loadAndGet emits one wallet with isMultiCurrency true`() = runTest { // Arrange val wallet = createUserWallet(isMultiCurrency = true) every { featureToggles.isFeatureEnabled } returns true - every { accountsCRUDRepository.getUserWallets() } returns flowOf(listOf(wallet)) + every { userWalletsListRepository.loadAndGet() } returns flowOf(listOf(wallet)) every { accountsCRUDRepository.getTotalActiveAccountsCount(wallet.walletId) } returns flowOf(2.some()) // Act @@ -111,18 +117,18 @@ class IsAccountsModeEnabledUseCaseTest { verifyOrder { featureToggles.isFeatureEnabled - accountsCRUDRepository.getUserWallets() + userWalletsListRepository.loadAndGet() accountsCRUDRepository.getTotalActiveAccountsCount(wallet.walletId) } } @Test - fun `returns false when getUserWallets emits one wallet with isMultiCurrency true and None counts`() = runTest { + fun `returns false when loadAndGet emits one wallet with isMultiCurrency true and None counts`() = runTest { // Arrange val wallet = createUserWallet(isMultiCurrency = true) every { featureToggles.isFeatureEnabled } returns true - every { accountsCRUDRepository.getUserWallets() } returns flowOf(listOf(wallet)) + every { userWalletsListRepository.loadAndGet() } returns flowOf(listOf(wallet)) every { accountsCRUDRepository.getTotalActiveAccountsCount(wallet.walletId) } returns flowOf(none()) // Act @@ -133,19 +139,19 @@ class IsAccountsModeEnabledUseCaseTest { verifyOrder { featureToggles.isFeatureEnabled - accountsCRUDRepository.getUserWallets() + userWalletsListRepository.loadAndGet() accountsCRUDRepository.getTotalActiveAccountsCount(wallet.walletId) } } @Test - fun `returns true when getUserWallets emits two wallets, one isMultiCurrency false, one true`() = runTest { + fun `returns true when loadAndGet emits two wallets, one isMultiCurrency false, one true`() = runTest { // Arrange val wallet1 = createUserWallet(isMultiCurrency = false) val wallet2 = createUserWallet(isMultiCurrency = true) every { featureToggles.isFeatureEnabled } returns true - every { accountsCRUDRepository.getUserWallets() } returns flowOf(listOf(wallet1, wallet2)) + every { userWalletsListRepository.loadAndGet() } returns flowOf(listOf(wallet1, wallet2)) every { accountsCRUDRepository.getTotalActiveAccountsCount(wallet2.walletId) } returns flowOf(2.some()) // Act @@ -156,7 +162,7 @@ class IsAccountsModeEnabledUseCaseTest { verifyOrder { featureToggles.isFeatureEnabled - accountsCRUDRepository.getUserWallets() + userWalletsListRepository.loadAndGet() accountsCRUDRepository.getTotalActiveAccountsCount(wallet2.walletId) } @@ -180,14 +186,14 @@ class IsAccountsModeEnabledUseCaseTest { Truth.assertThat(actual).isFalse() verify(exactly = 1) { featureToggles.isFeatureEnabled } - verify(inverse = true) { accountsCRUDRepository.getUserWalletsSync() } + verify(inverse = true) { userWalletsListRepository.userWallets.value } } @Test fun `returns false when getUserWalletsSync returns empty list`() = runTest { // Arrange every { featureToggles.isFeatureEnabled } returns true - every { accountsCRUDRepository.getUserWalletsSync() } returns emptyList() + every { userWalletsListRepository.userWallets.value } returns emptyList() // Act val actual = useCase.invokeSync() @@ -197,7 +203,7 @@ class IsAccountsModeEnabledUseCaseTest { verifyOrder { featureToggles.isFeatureEnabled - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value } coVerify(inverse = true) { accountsCRUDRepository.getTotalActiveAccountsCountSync(any()) } @@ -209,7 +215,7 @@ class IsAccountsModeEnabledUseCaseTest { val wallet = createUserWallet(isMultiCurrency = false) every { featureToggles.isFeatureEnabled } returns true - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(wallet) + every { userWalletsListRepository.userWallets.value } returns listOf(wallet) // Act val actual = useCase.invokeSync() @@ -219,7 +225,7 @@ class IsAccountsModeEnabledUseCaseTest { verifyOrder { featureToggles.isFeatureEnabled - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value } coVerify(inverse = true) { accountsCRUDRepository.getTotalActiveAccountsCountSync(any()) } @@ -231,7 +237,7 @@ class IsAccountsModeEnabledUseCaseTest { val wallet = createUserWallet(isMultiCurrency = true) every { featureToggles.isFeatureEnabled } returns true - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(wallet) + every { userWalletsListRepository.userWallets.value } returns listOf(wallet) coEvery { accountsCRUDRepository.getTotalActiveAccountsCountSync(wallet.walletId) } returns 2.some() // Act @@ -242,7 +248,7 @@ class IsAccountsModeEnabledUseCaseTest { coVerifyOrder { featureToggles.isFeatureEnabled - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value accountsCRUDRepository.getTotalActiveAccountsCountSync(wallet.walletId) } } @@ -253,7 +259,7 @@ class IsAccountsModeEnabledUseCaseTest { val wallet = createUserWallet(isMultiCurrency = true) every { featureToggles.isFeatureEnabled } returns true - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(wallet) + every { userWalletsListRepository.userWallets.value } returns listOf(wallet) coEvery { accountsCRUDRepository.getTotalActiveAccountsCountSync(wallet.walletId) } returns none() // Act @@ -264,7 +270,7 @@ class IsAccountsModeEnabledUseCaseTest { coVerifyOrder { featureToggles.isFeatureEnabled - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value accountsCRUDRepository.getTotalActiveAccountsCountSync(wallet.walletId) } } @@ -276,7 +282,7 @@ class IsAccountsModeEnabledUseCaseTest { val wallet2 = createUserWallet(isMultiCurrency = true) every { featureToggles.isFeatureEnabled } returns true - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(wallet1, wallet2) + every { userWalletsListRepository.userWallets.value } returns listOf(wallet1, wallet2) coEvery { accountsCRUDRepository.getTotalActiveAccountsCountSync(wallet2.walletId) } returns 2.some() // Act @@ -287,7 +293,7 @@ class IsAccountsModeEnabledUseCaseTest { coVerifyOrder { featureToggles.isFeatureEnabled - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value accountsCRUDRepository.getTotalActiveAccountsCountSync(wallet2.walletId) } diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusUseCaseModule.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusUseCaseModule.kt index fced65957e..a228aceb2e 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusUseCaseModule.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/di/AccountStatusUseCaseModule.kt @@ -7,6 +7,7 @@ import com.tangem.domain.account.status.usecase.* import com.tangem.domain.account.status.utils.CryptoCurrencyBalanceFetcher import com.tangem.domain.account.status.utils.CryptoCurrencyMetadataCleaner import com.tangem.domain.account.supplier.SingleAccountListSupplier +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.express.ExpressServiceFetcher import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier @@ -36,12 +37,12 @@ internal object AccountStatusUseCaseModule { @Provides @Singleton fun provideGetAccountCurrencyByAddressUseCase( - accountsCRUDRepository: AccountsCRUDRepository, + userWalletsListRepository: UserWalletsListRepository, multiNetworkStatusSupplier: MultiNetworkStatusSupplier, singleAccountListSupplier: SingleAccountListSupplier, ): GetAccountCurrencyByAddressUseCase { return GetAccountCurrencyByAddressUseCase( - accountsCRUDRepository = accountsCRUDRepository, + userWalletsListRepository = userWalletsListRepository, multiNetworkStatusSupplier = multiNetworkStatusSupplier, singleAccountListSupplier = singleAccountListSupplier, ) @@ -50,12 +51,12 @@ internal object AccountStatusUseCaseModule { @Provides @Singleton fun provideGetCryptoCurrencyActionsUseCaseV2( - accountsCRUDRepository: AccountsCRUDRepository, + userWalletsListRepository: UserWalletsListRepository, singleAccountStatusListSupplier: SingleAccountStatusListSupplier, getCryptoCurrencyActionsUseCase: GetCryptoCurrencyActionsUseCase, ): GetCryptoCurrencyActionsUseCaseV2 { return GetCryptoCurrencyActionsUseCaseV2( - accountsCRUDRepository = accountsCRUDRepository, + userWalletsListRepository = userWalletsListRepository, singleAccountStatusListSupplier = singleAccountStatusListSupplier, getCryptoCurrencyActionsUseCase = getCryptoCurrencyActionsUseCase, ) diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducer.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducer.kt index 13910406f9..e5c1ecf871 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducer.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducer.kt @@ -3,8 +3,8 @@ package com.tangem.domain.account.status.producer import arrow.core.Option import arrow.core.some import com.tangem.domain.account.models.AccountStatusList -import com.tangem.domain.account.repository.AccountsCRUDRepository import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.core.flow.FlowProducerTools import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.assisted.Assisted @@ -20,7 +20,8 @@ import kotlinx.coroutines.flow.flowOn * Produces a flow of [AccountStatusList] for multiple user wallets. * * @property params Parameters for the producer (currently unused). - * @property accountsCRUDRepository Repository to get the list of user wallets. + * @property flowProducerTools Tools for managing the flow producer. + * @property userWalletsListRepository Repository to get the list of user wallets. * @property singleAccountStatusListSupplier Supplier to get the account status list for a single user wallet. * @property dispatchers Coroutine dispatcher provider for managing threading. * @@ -29,7 +30,7 @@ import kotlinx.coroutines.flow.flowOn internal class DefaultMultiAccountStatusListProducer @AssistedInject constructor( @Assisted val params: Unit, override val flowProducerTools: FlowProducerTools, - private val accountsCRUDRepository: AccountsCRUDRepository, + private val userWalletsListRepository: UserWalletsListRepository, private val singleAccountStatusListSupplier: SingleAccountStatusListSupplier, private val dispatchers: CoroutineDispatcherProvider, ) : MultiAccountStatusListProducer { @@ -38,7 +39,7 @@ internal class DefaultMultiAccountStatusListProducer @AssistedInject constructor @OptIn(ExperimentalCoroutinesApi::class) override fun produce(): Flow> { - return accountsCRUDRepository.getUserWallets() + return userWalletsListRepository.loadAndGet() .flatMapLatest { userWallets -> val flows = userWallets.map { singleAccountStatusListSupplier( diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusListProducer.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusListProducer.kt index 5b5381ffa6..956cc9e4ce 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusListProducer.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/producer/DefaultSingleAccountStatusListProducer.kt @@ -7,8 +7,8 @@ import com.tangem.core.analytics.api.AnalyticsExceptionHandler import com.tangem.domain.account.models.AccountCurrencyId import com.tangem.domain.account.models.AccountList import com.tangem.domain.account.models.AccountStatusList -import com.tangem.domain.account.repository.AccountsCRUDRepository import com.tangem.domain.account.supplier.SingleAccountListSupplier +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.core.flow.FlowProducerTools import com.tangem.domain.core.utils.lceContent import com.tangem.domain.core.utils.lceLoading @@ -55,10 +55,16 @@ import java.math.BigDecimal * Produces a flow of [AccountStatusList] for a single user wallet. * * @property params Parameters containing the user wallet ID. - * @property accountsCRUDRepository Repository for accessing account data. + * @property flowProducerTools Tools for managing the flow producer. + * @property userWalletsListRepository Repository for getting user wallet by id. * @property singleAccountListSupplier Supplier to get the list of accounts for the user wallet. - * @property cryptoCurrencyStatusesFlowFactory Factory to create flows of cryptocurrency statuses. + * @property networksRepository Repository for checking network statuses in a cache. * @property dispatchers Coroutine dispatcher provider for managing threading. + * @property networkStatusSupplier Supplier for getting network statuses. + * @property quoteStatusSupplier Supplier for getting quote statuses. + * @property stakingBalanceSupplier Supplier for getting staking balances. + * @property stakingIdFactory Factory for creating staking IDs. + * @property analyticsExceptionHandler Handler for analytics exceptions. * [REDACTED_AUTHOR] */ @@ -66,11 +72,11 @@ import java.math.BigDecimal @OptIn(ExperimentalCoroutinesApi::class) internal class DefaultSingleAccountStatusListProducer @AssistedInject constructor( @Assisted private val params: SingleAccountStatusListProducer.Params, - private val accountsCRUDRepository: AccountsCRUDRepository, + override val flowProducerTools: FlowProducerTools, + private val userWalletsListRepository: UserWalletsListRepository, private val singleAccountListSupplier: SingleAccountListSupplier, private val networksRepository: NetworksRepository, private val dispatchers: CoroutineDispatcherProvider, - override val flowProducerTools: FlowProducerTools, private val networkStatusSupplier: MultiNetworkStatusSupplier, private val quoteStatusSupplier: MultiQuoteStatusSupplier, private val stakingBalanceSupplier: MultiStakingBalanceSupplier, @@ -88,7 +94,7 @@ internal class DefaultSingleAccountStatusListProducer @AssistedInject constructo @Suppress("LongMethod") private fun flattenFlow(): Flow = channelFlow { val walletId = params.userWalletId - val userWallet = accountsCRUDRepository.getUserWallet(userWalletId = params.userWalletId) + val userWallet = userWalletsListRepository.getSyncStrict(id = params.userWalletId) val flattenCurrency: MutableSharedFlow> = MutableSharedFlow( replay = 1, diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCase.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCase.kt index 31de28f37e..71bf409b07 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCase.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCase.kt @@ -9,9 +9,9 @@ import arrow.core.raise.option import arrow.core.toNonEmptyListOrNull import com.tangem.domain.account.models.AccountList import com.tangem.domain.account.producer.SingleAccountListProducer -import com.tangem.domain.account.repository.AccountsCRUDRepository import com.tangem.domain.account.status.model.AccountCryptoCurrency import com.tangem.domain.account.supplier.SingleAccountListSupplier +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.account.Account import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.getAddress @@ -29,14 +29,14 @@ private typealias WalletIdWithNetworkId = Pair /** * Use case to retrieve an [AccountCryptoCurrency] based on a provided address. * - * @property accountsCRUDRepository Repository to access user wallets. + * @property userWalletsListRepository Repository to access user wallets. * @property multiNetworkStatusSupplier Supplier to get network status for multiple networks. * @property singleAccountListSupplier Supplier to get account lists for a single wallet. * [REDACTED_AUTHOR] */ class GetAccountCurrencyByAddressUseCase( - private val accountsCRUDRepository: AccountsCRUDRepository, + private val userWalletsListRepository: UserWalletsListRepository, private val multiNetworkStatusSupplier: MultiNetworkStatusSupplier, private val singleAccountListSupplier: SingleAccountListSupplier, ) { @@ -65,7 +65,7 @@ class GetAccountCurrencyByAddressUseCase( } private fun OptionRaise.getUserWalletIds(): NonEmptyList { - val userWalletIds = accountsCRUDRepository.getUserWalletsSync() + val userWalletIds = userWalletsListRepository.userWallets.value.orEmpty() .filter(UserWallet::isMultiCurrency) .map(UserWallet::walletId) .toNonEmptyListOrNull() diff --git a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetCryptoCurrencyActionsUseCaseV2.kt b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetCryptoCurrencyActionsUseCaseV2.kt index d9185beaf3..9ec1d14e63 100644 --- a/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetCryptoCurrencyActionsUseCaseV2.kt +++ b/domain/account/status/src/main/java/com/tangem/domain/account/status/usecase/GetCryptoCurrencyActionsUseCaseV2.kt @@ -1,9 +1,9 @@ package com.tangem.domain.account.status.usecase -import com.tangem.domain.account.repository.AccountsCRUDRepository import com.tangem.domain.account.status.producer.SingleAccountStatusListProducer import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier import com.tangem.domain.account.status.utils.AccountCryptoCurrencyStatusFinder +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.account.AccountId import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.tokens.GetCryptoCurrencyActionsUseCase @@ -17,14 +17,14 @@ import kotlinx.coroutines.flow.transformLatest /** * Use case to retrieve the available actions for a specific cryptocurrency associated with an account. * - * @property accountsCRUDRepository repository for account CRUD operations. + * @property userWalletsListRepository repository to get the user wallets list. * @property singleAccountStatusListSupplier supplier to get the list of account statuses. * @property getCryptoCurrencyActionsUseCase use case to get the actions for a specific cryptocurrency status. * [REDACTED_AUTHOR] */ class GetCryptoCurrencyActionsUseCaseV2( - private val accountsCRUDRepository: AccountsCRUDRepository, + private val userWalletsListRepository: UserWalletsListRepository, private val singleAccountStatusListSupplier: SingleAccountStatusListSupplier, private val getCryptoCurrencyActionsUseCase: GetCryptoCurrencyActionsUseCase, ) { @@ -45,7 +45,7 @@ class GetCryptoCurrencyActionsUseCaseV2( ) if (accountCurrencyStatus != null) { - val userWallet = accountsCRUDRepository.getUserWallet(userWalletId = accountId.userWalletId) + val userWallet = userWalletsListRepository.getSyncStrict(id = accountId.userWalletId) val actionsFlow = getCryptoCurrencyActionsUseCase( userWallet = userWallet, cryptoCurrencyStatus = accountCurrencyStatus.status, diff --git a/domain/account/status/src/test/kotlin/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducerTest.kt b/domain/account/status/src/test/kotlin/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducerTest.kt index 2b32c8397b..48ecd270a8 100644 --- a/domain/account/status/src/test/kotlin/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducerTest.kt +++ b/domain/account/status/src/test/kotlin/com/tangem/domain/account/status/producer/DefaultMultiAccountStatusListProducerTest.kt @@ -2,8 +2,8 @@ package com.tangem.domain.account.status.producer import com.google.common.truth.Truth import com.tangem.domain.account.models.AccountStatusList -import com.tangem.domain.account.repository.AccountsCRUDRepository import com.tangem.domain.account.status.supplier.SingleAccountStatusListSupplier +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.core.flow.FlowProducerTools import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId @@ -21,7 +21,7 @@ import org.junit.jupiter.api.TestInstance @TestInstance(TestInstance.Lifecycle.PER_CLASS) class DefaultMultiAccountStatusListProducerTest { - private val accountsCRUDRepository: AccountsCRUDRepository = mockk() + private val userWalletsListRepository: UserWalletsListRepository = mockk() private val singleAccountStatusListSupplier: SingleAccountStatusListSupplier = mockk() private val dispatchers = TestingCoroutineDispatcherProvider() private val flowProducerTools: FlowProducerTools = mockk() @@ -38,7 +38,7 @@ class DefaultMultiAccountStatusListProducerTest { private val producer = DefaultMultiAccountStatusListProducer( params = Unit, - accountsCRUDRepository = accountsCRUDRepository, + userWalletsListRepository = userWalletsListRepository, singleAccountStatusListSupplier = singleAccountStatusListSupplier, dispatchers = dispatchers, flowProducerTools = flowProducerTools, @@ -46,7 +46,7 @@ class DefaultMultiAccountStatusListProducerTest { @AfterEach fun tearDown() { - clearMocks(accountsCRUDRepository, singleAccountStatusListSupplier) + clearMocks(userWalletsListRepository, singleAccountStatusListSupplier) } @Test @@ -55,7 +55,7 @@ class DefaultMultiAccountStatusListProducerTest { val wallets = listOf(userWallet1, userWallet2) val walletsFlow = MutableStateFlow(wallets) - every { accountsCRUDRepository.getUserWallets() } returns walletsFlow + every { userWalletsListRepository.loadAndGet() } returns walletsFlow val accountStatusList1 = mockk() val accountStatusList2 = mockk() @@ -79,7 +79,7 @@ class DefaultMultiAccountStatusListProducerTest { Truth.assertThat(actual).containsExactly(expected) coVerify(ordering = Ordering.SEQUENCE) { - accountsCRUDRepository.getUserWallets() + userWalletsListRepository.loadAndGet() singleAccountStatusListSupplier( params = SingleAccountStatusListProducer.Params(userWalletId1), ) @@ -93,7 +93,7 @@ class DefaultMultiAccountStatusListProducerTest { fun `produce returns empty flow if userWallets is empty list`() = runTest { // Arrange val walletsFlow = MutableStateFlow>(emptyList()) - every { accountsCRUDRepository.getUserWallets() } returns walletsFlow + every { userWalletsListRepository.loadAndGet() } returns walletsFlow // Act val actual = producer.produce().let(::getEmittedValues) @@ -102,27 +102,26 @@ class DefaultMultiAccountStatusListProducerTest { Truth.assertThat(actual).isEmpty() coVerify(ordering = Ordering.SEQUENCE) { - accountsCRUDRepository.getUserWallets() + userWalletsListRepository.loadAndGet() } } - // TODO: uncomment after migration on UserWalletsListRepository - // @Test - // fun `produce returns empty flow if userWallets is null`() = runTest { - // // Arrange - // val walletsFlow = MutableStateFlow?>(null) - // every { accountsCRUDRepository.getUserWallets() } returns walletsFlow - // - // // Act - // val actual = producer.produce().let(::getEmittedValues) - // - // // Assert - // Truth.assertThat(actual).isEmpty() - // - // coVerify(ordering = Ordering.SEQUENCE) { - // accountsCRUDRepository.getUserWallets() - // } - // } + @Test + fun `produce returns empty flow if userWallets is null`() = runTest { + // Arrange + val walletsFlow = flowOf>(emptyList()) + every { userWalletsListRepository.loadAndGet() } returns walletsFlow + + // Act + val actual = producer.produce().let(::getEmittedValues) + + // Assert + Truth.assertThat(actual).isEmpty() + + coVerify(ordering = Ordering.SEQUENCE) { + userWalletsListRepository.loadAndGet() + } + } @Test fun `flow will updated if userWallets are updated`() = runTest { @@ -131,7 +130,7 @@ class DefaultMultiAccountStatusListProducerTest { val userWallet3 = mockk { every { walletId } returns userWalletId3 } val walletsFlow = MutableStateFlow(listOf(userWallet1, userWallet2)) - every { accountsCRUDRepository.getUserWallets() } returns walletsFlow + every { userWalletsListRepository.loadAndGet() } returns walletsFlow val accountStatusList1 = mockk() val accountStatusList2 = mockk() @@ -171,7 +170,7 @@ class DefaultMultiAccountStatusListProducerTest { Truth.assertThat(actual2).containsExactly(expected2) coVerify(ordering = Ordering.SEQUENCE) { - accountsCRUDRepository.getUserWallets() + userWalletsListRepository.loadAndGet() singleAccountStatusListSupplier( params = SingleAccountStatusListProducer.Params(userWalletId1), ) @@ -187,7 +186,7 @@ class DefaultMultiAccountStatusListProducerTest { singleAccountStatusListSupplier( params = SingleAccountStatusListProducer.Params(userWalletId3), ) - accountsCRUDRepository.getUserWallets() + userWalletsListRepository.loadAndGet() singleAccountStatusListSupplier( params = SingleAccountStatusListProducer.Params(userWalletId1), ) diff --git a/domain/account/status/src/test/kotlin/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCaseTest.kt b/domain/account/status/src/test/kotlin/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCaseTest.kt index ba62fe222b..596ebd9242 100644 --- a/domain/account/status/src/test/kotlin/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCaseTest.kt +++ b/domain/account/status/src/test/kotlin/com/tangem/domain/account/status/usecase/GetAccountCurrencyByAddressUseCaseTest.kt @@ -3,9 +3,9 @@ package com.tangem.domain.account.status.usecase import com.tangem.common.test.domain.token.MockCryptoCurrencyFactory import com.tangem.domain.account.models.AccountList import com.tangem.domain.account.producer.SingleAccountListProducer -import com.tangem.domain.account.repository.AccountsCRUDRepository import com.tangem.domain.account.status.model.AccountCryptoCurrency import com.tangem.domain.account.supplier.SingleAccountListSupplier +import com.tangem.domain.common.wallets.UserWalletsListRepository import com.tangem.domain.models.network.Network import com.tangem.domain.models.network.NetworkAddress import com.tangem.domain.models.network.NetworkStatus @@ -28,19 +28,19 @@ import org.junit.jupiter.api.TestInstance @TestInstance(TestInstance.Lifecycle.PER_CLASS) class GetAccountCurrencyByAddressUseCaseTest { - private val accountsCRUDRepository: AccountsCRUDRepository = mockk() + private val userWalletsListRepository: UserWalletsListRepository = mockk() private val multiNetworkStatusSupplier: MultiNetworkStatusSupplier = mockk() private val singleAccountListSupplier: SingleAccountListSupplier = mockk() private val useCase = GetAccountCurrencyByAddressUseCase( - accountsCRUDRepository = accountsCRUDRepository, + userWalletsListRepository = userWalletsListRepository, multiNetworkStatusSupplier = multiNetworkStatusSupplier, singleAccountListSupplier = singleAccountListSupplier, ) @AfterEach fun tearDown() { - clearMocks(accountsCRUDRepository, multiNetworkStatusSupplier, singleAccountListSupplier) + clearMocks(userWalletsListRepository, multiNetworkStatusSupplier, singleAccountListSupplier) } @Test @@ -55,27 +55,10 @@ class GetAccountCurrencyByAddressUseCaseTest { assertNone(actual) } - // TODO: uncomment after migration on UserWalletsListRepository - // @Test - // fun `returns None if userWalletIds is null`() = runTest { - // // Arrange - // every { accountsCRUDRepository.getUserWalletsSync() } returns MutableStateFlow(null) - // - // // Act - // val actual = useCase(validAddress) - // - // // Assert - // assertNone(actual) - // - // coVerifySequence { - // accountsCRUDRepository.getUserWalletsSync() - // } - // } - @Test - fun `returns None if userWalletIds is empty list`() = runTest { + fun `returns None if userWalletIds is null`() = runTest { // Arrange - every { accountsCRUDRepository.getUserWalletsSync() } returns emptyList() + every { userWalletsListRepository.userWallets.value } returns null // Act val actual = useCase(validAddress) @@ -84,7 +67,23 @@ class GetAccountCurrencyByAddressUseCaseTest { assertNone(actual) coVerifySequence { - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value + } + } + + @Test + fun `returns None if userWalletIds is empty list`() = runTest { + // Arrange + every { userWalletsListRepository.userWallets.value } returns emptyList() + + // Act + val actual = useCase(validAddress) + + // Assert + assertNone(actual) + + coVerifySequence { + userWalletsListRepository.userWallets.value } } @@ -95,7 +94,7 @@ class GetAccountCurrencyByAddressUseCaseTest { every { isMultiCurrency } returns false } - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(singleWallet) + every { userWalletsListRepository.userWallets.value } returns listOf(singleWallet) // Act val actual = useCase(validAddress) @@ -104,14 +103,14 @@ class GetAccountCurrencyByAddressUseCaseTest { assertNone(actual) coVerifySequence { - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value } } @Test fun `returns None if multiNetworkStatusSupplier returns null`() = runTest { // Arrange - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(multiUserWallet) + every { userWalletsListRepository.userWallets.value } returns listOf(multiUserWallet) coEvery { multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) } returns null @@ -123,7 +122,7 @@ class GetAccountCurrencyByAddressUseCaseTest { assertNone(actual) coVerifySequence { - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) } } @@ -131,7 +130,7 @@ class GetAccountCurrencyByAddressUseCaseTest { @Test fun `returns None if multiNetworkStatusSupplier returns empty list`() = runTest { // Arrange - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(multiUserWallet) + every { userWalletsListRepository.userWallets.value } returns listOf(multiUserWallet) coEvery { multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) } returns emptySet() @@ -143,7 +142,7 @@ class GetAccountCurrencyByAddressUseCaseTest { assertNone(actual) coVerifySequence { - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) } } @@ -156,7 +155,7 @@ class GetAccountCurrencyByAddressUseCaseTest { value = NetworkStatus.Unreachable(address = null), ) - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(multiUserWallet) + every { userWalletsListRepository.userWallets.value } returns listOf(multiUserWallet) coEvery { multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) } returns setOf(networkStatus) @@ -168,7 +167,7 @@ class GetAccountCurrencyByAddressUseCaseTest { assertNone(actual) coVerifySequence { - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) } } @@ -183,7 +182,7 @@ class GetAccountCurrencyByAddressUseCaseTest { value = NetworkStatus.Unreachable(address = validNetworkAddress), ) - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(multiUserWallet) + every { userWalletsListRepository.userWallets.value } returns listOf(multiUserWallet) coEvery { multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) } returns setOf(networkStatus) @@ -200,7 +199,7 @@ class GetAccountCurrencyByAddressUseCaseTest { assertNone(actual) coVerifySequence { - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) singleAccountListSupplier.getSyncOrNull( params = SingleAccountListProducer.Params(userWalletId = userWalletId), @@ -220,7 +219,7 @@ class GetAccountCurrencyByAddressUseCaseTest { ) val accountList = AccountList.empty(userWalletId) - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(multiUserWallet) + every { userWalletsListRepository.userWallets.value } returns listOf(multiUserWallet) coEvery { multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) } returns setOf(networkStatus) @@ -237,7 +236,7 @@ class GetAccountCurrencyByAddressUseCaseTest { assertNone(actual) coVerifySequence { - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) singleAccountListSupplier.getSyncOrNull( params = SingleAccountListProducer.Params(userWalletId = userWalletId), @@ -255,7 +254,7 @@ class GetAccountCurrencyByAddressUseCaseTest { ) val accountList = AccountList.empty(userWalletId = userWalletId, cryptoCurrencies = setOf(currency)) - every { accountsCRUDRepository.getUserWalletsSync() } returns listOf(multiUserWallet) + every { userWalletsListRepository.userWallets.value } returns listOf(multiUserWallet) coEvery { multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) } returns setOf(networkStatus) @@ -273,7 +272,7 @@ class GetAccountCurrencyByAddressUseCaseTest { assertSome(actual, expected) coVerifySequence { - accountsCRUDRepository.getUserWalletsSync() + userWalletsListRepository.userWallets.value multiNetworkStatusSupplier.getSyncOrNull(params = MultiNetworkStatusProducer.Params(userWalletId), 1000) singleAccountListSupplier.getSyncOrNull( params = SingleAccountListProducer.Params(userWalletId = userWalletId), diff --git a/domain/common/src/main/java/com/tangem/domain/common/wallets/UserWalletsListRepository.kt b/domain/common/src/main/java/com/tangem/domain/common/wallets/UserWalletsListRepository.kt index c9f9aecb00..fa1a12c054 100644 --- a/domain/common/src/main/java/com/tangem/domain/common/wallets/UserWalletsListRepository.kt +++ b/domain/common/src/main/java/com/tangem/domain/common/wallets/UserWalletsListRepository.kt @@ -5,6 +5,7 @@ import com.tangem.domain.common.wallets.error.* import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow /** @@ -30,12 +31,21 @@ interface UserWalletsListRepository { */ val selectedUserWallet: StateFlow + /** Get user wallet by [id] */ + fun getSyncOrNull(id: UserWalletId): UserWallet? + + /** Get user wallet by [id] */ + fun getSyncStrict(id: UserWalletId): UserWallet + /** * Loads user wallets list and selected wallet. * If the list is already loaded, it does nothing. */ suspend fun load() + /** Loads user wallets list and selected wallet and returns a flow of the list */ + fun loadAndGet(): Flow> + /** * Gets and if necessary loads user wallets list and selected wallet. */