diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultQuotesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultQuotesRepository.kt index 0f38f7682d..88f9109200 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultQuotesRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultQuotesRepository.kt @@ -36,8 +36,25 @@ internal class DefaultQuotesRepository( private var quotesFetchedForAppCurrency: String? = null private val mutex = Mutex() + override fun getQuotesUpdates(currenciesIds: Set): Flow> { + TODO("Will be implemented in [REDACTED_TASK_KEY]") + } + + override suspend fun fetchQuotes(currenciesIds: Set, refresh: Boolean) { + withContext(dispatchers.io) { + val selectedAppCurrency = requireNotNull( + value = appPreferencesStore.getObjectSyncOrNull( + key = PreferencesKeys.SELECTED_APP_CURRENCY_KEY, + ), + lazyMessage = { "Unable to get selected application currency to update quotes" }, + ) + + fetchExpiredQuotes(currenciesIds, selectedAppCurrency.id, refresh) + } + } + @OptIn(ExperimentalCoroutinesApi::class) - override fun getQuotesUpdates(currenciesIds: Set, refresh: Boolean): Flow> { + override fun getQuotesUpdatesLegacy(currenciesIds: Set, refresh: Boolean): Flow> { return appPreferencesStore.getObject( key = PreferencesKeys.SELECTED_APP_CURRENCY_KEY, ) @@ -51,19 +68,6 @@ internal class DefaultQuotesRepository( .flowOn(dispatchers.io) } - override suspend fun fetchQuotes(currenciesIds: Set) { - withContext(dispatchers.io) { - val selectedAppCurrency = requireNotNull( - value = appPreferencesStore.getObjectSyncOrNull( - key = PreferencesKeys.SELECTED_APP_CURRENCY_KEY, - ), - lazyMessage = { "Unable to get selected application currency to update quotes" }, - ) - - fetchExpiredQuotes(currenciesIds, selectedAppCurrency.id, true) - } - } - override suspend fun getQuotesSync(currenciesIds: Set, refresh: Boolean): Set { return withContext(dispatchers.io) { val selectedAppCurrency = requireNotNull( diff --git a/domain/markets/src/main/java/com/tangem/domain/markets/GetCurrencyQuotesUseCase.kt b/domain/markets/src/main/java/com/tangem/domain/markets/GetCurrencyQuotesUseCase.kt index 91a67b1d12..dcd308db12 100644 --- a/domain/markets/src/main/java/com/tangem/domain/markets/GetCurrencyQuotesUseCase.kt +++ b/domain/markets/src/main/java/com/tangem/domain/markets/GetCurrencyQuotesUseCase.kt @@ -1,10 +1,15 @@ package com.tangem.domain.markets -import arrow.core.* +import arrow.core.None +import arrow.core.Option +import arrow.core.toOption import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Quote import com.tangem.domain.tokens.repository.QuotesRepository -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map @Suppress("UnusedPrivateMember") class GetCurrencyQuotesUseCase( @@ -18,7 +23,7 @@ class GetCurrencyQuotesUseCase( ): Flow> { val rawId = currencyID.rawCurrencyId ?: return flowOf(None) - return quotesRepository.getQuotesUpdates( + return quotesRepository.getQuotesUpdatesLegacy( currenciesIds = setOf(rawId), refresh = refresh, ).map { it.filterIsInstance().firstOrNull().toOption() }.catch { emit(None) } diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/RefreshMultiCurrencyWalletQuotesUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/RefreshMultiCurrencyWalletQuotesUseCase.kt index 70564f24ef..1688660d10 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/RefreshMultiCurrencyWalletQuotesUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/RefreshMultiCurrencyWalletQuotesUseCase.kt @@ -47,7 +47,10 @@ class RefreshMultiCurrencyWalletQuotesUseCase( private suspend fun fetchQuotes(currenciesIds: Set) { catch( block = { - quotesRepository.fetchQuotes(currenciesIds.mapNotNullTo(hashSetOf(), CryptoCurrency.ID::rawCurrencyId)) + quotesRepository.fetchQuotes( + currenciesIds = currenciesIds.mapNotNullTo(hashSetOf(), CryptoCurrency.ID::rawCurrencyId), + refresh = true, + ) }, catch = { /* Ignore error */ }, ) diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesLceOperations.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesLceOperations.kt index 3e20249440..d2e77a480c 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesLceOperations.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesLceOperations.kt @@ -164,7 +164,7 @@ internal class CurrenciesStatusesLceOperations( } private fun getQuotes(tokensIds: NonEmptySet): Flow>> { - return quotesRepository.getQuotesUpdates(tokensIds.mapNotNull { it.rawCurrencyId }.toSet()) + return quotesRepository.getQuotesUpdatesLegacy(tokensIds.mapNotNull { it.rawCurrencyId }.toSet()) .map, Either>> { it.right() } .retryWhen { cause, _ -> emit(TokenListError.DataError(cause).left()) diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt index 98e2f0193c..61e6ac0bf9 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt @@ -9,6 +9,27 @@ import kotlinx.coroutines.flow.Flow * */ interface QuotesRepository { + /** + * Retrieves updates of quotes for a set of specified cryptocurrencies, + * identified by their unique IDs from the local cache. + * + * To fetch and populate the cache with quotes, use [fetchQuotes]. + * + * @param currenciesIds The unique identifiers of the cryptocurrencies for which quotes are to be retrieved. + * @return A [Flow] emitting a set of quotes corresponding to the specified cryptocurrencies. + */ + fun getQuotesUpdates(currenciesIds: Set): Flow> + + /** + * Fetches quotes for a set of specified cryptocurrencies, identified by their unique IDs. + * + * Fetched quotes are stored in the local cache and can be retrieved by calling [getQuotesUpdates]. + * + * @param currenciesIds The unique identifiers of the cryptocurrencies for which quotes are to be retrieved. + * @param refresh A boolean flag indicating whether the data should be refreshed. + * */ + suspend fun fetchQuotes(currenciesIds: Set, refresh: Boolean = false) + /** * Retrieves updates of quotes for a set of specified cryptocurrencies, identified by their unique IDs. * @@ -17,7 +38,7 @@ interface QuotesRepository { * @param currenciesIds The unique identifiers of the cryptocurrencies for which quotes are to be retrieved. * @return A [Flow] emitting a set of quotes corresponding to the specified cryptocurrencies. */ - fun getQuotesUpdates(currenciesIds: Set, refresh: Boolean = false): Flow> + fun getQuotesUpdatesLegacy(currenciesIds: Set, refresh: Boolean = false): Flow> /** * Retrieves quotes for a set of specified cryptocurrencies, identified by their unique IDs. @@ -31,6 +52,4 @@ interface QuotesRepository { suspend fun getQuotesSync(currenciesIds: Set, refresh: Boolean): Set suspend fun getQuoteSync(currencyId: CryptoCurrency.RawID): Quote? - - suspend fun fetchQuotes(currenciesIds: Set) } \ No newline at end of file diff --git a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockQuotesRepository.kt b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockQuotesRepository.kt index 86f2775a96..428adcf511 100644 --- a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockQuotesRepository.kt +++ b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockQuotesRepository.kt @@ -13,18 +13,24 @@ internal class MockQuotesRepository( private val quotes: Flow>>, ) : QuotesRepository { - override fun getQuotesUpdates(currenciesIds: Set, refresh: Boolean): Flow> { + override fun getQuotesUpdates(currenciesIds: Set): Flow> { + return quotes.map { it.getOrElse { e -> throw e } } + } + + override suspend fun fetchQuotes(currenciesIds: Set, refresh: Boolean) { + /* no-op */ + } + + override fun getQuotesUpdatesLegacy(currenciesIds: Set, refresh: Boolean): Flow> { return quotes.map { it.getOrElse { e -> throw e } } } override suspend fun getQuotesSync(currenciesIds: Set, refresh: Boolean): Set { - return getQuotesUpdates(currenciesIds).first() + return getQuotesUpdatesLegacy(currenciesIds).first() } override suspend fun getQuoteSync(currencyId: CryptoCurrency.RawID): Quote { return quotes.map { it.getOrElse { e -> throw e } }.first() .first { it.rawCurrencyId == currencyId } } - - override suspend fun fetchQuotes(currenciesIds: Set) {} } \ No newline at end of file