Updated on 2026-08-14

This commit is contained in:
Tangem 2025-09-08 17:12:51 +04:00
parent a8f084ae88
commit 4d5b9b87e6
12 changed files with 105 additions and 17 deletions

View file

@ -0,0 +1,40 @@
package com.tangem.data.common.cache.etag
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.stringPreferencesKey
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.utils.getSyncOrNull
import com.tangem.datasource.local.preferences.utils.store
import com.tangem.domain.models.wallet.UserWalletId
import timber.log.Timber
/**
* Default implementation of the [ETagsStore] interface for managing ETag values
*
* @property appPreferencesStore the preferences store used for saving and retrieving ETag values
*/
internal class DefaultETagsStore(
private val appPreferencesStore: AppPreferencesStore,
) : ETagsStore {
override suspend fun getSyncOrNull(userWalletId: UserWalletId, key: ETagsStore.Key): String? {
val key = getAccountsETagKey(userWalletId = userWalletId, key = key)
return appPreferencesStore.getSyncOrNull(key = key)
}
override suspend fun store(userWalletId: UserWalletId, key: ETagsStore.Key, value: String) {
if (value.isBlank()) {
Timber.e("ETag value is blank, not storing it. userWalletId: $userWalletId, key: $key")
return
}
val key = getAccountsETagKey(userWalletId = userWalletId, key = key)
appPreferencesStore.store(key = key, value = value)
}
private fun getAccountsETagKey(userWalletId: UserWalletId, key: ETagsStore.Key): Preferences.Key<String> {
return stringPreferencesKey(name = "etag_${key}_${userWalletId.stringValue}")
}
}

View file

@ -0,0 +1,34 @@
package com.tangem.data.common.cache.etag
import com.tangem.domain.models.wallet.UserWalletId
/**
* Interface for working with ETag (Entity Tag), which is used for data caching and validation.
*
[REDACTED_AUTHOR]
*/
interface ETagsStore {
/**
* Retrieves the stored ETag value for the specified wallet and key
*
* @param userWalletId identifier of the user wallet
* @param key the key for which to get the ETag value
*/
suspend fun getSyncOrNull(userWalletId: UserWalletId, key: Key): String?
/**
* Stores the ETag value for the specified wallet and key
*
* @param userWalletId identifier of the user wallet
* @param key the key for which to get the ETag value
*/
suspend fun store(userWalletId: UserWalletId, key: Key, value: String)
/** Enumeration of possible keys for storing ETag values */
enum class Key {
WalletAccounts,
UserTokens,
;
}
}

View file

@ -50,9 +50,9 @@ object UserTokensResponseAccountIdEnricher {
if (enrichedTokens.isEmpty()) return tokens
val enrichedTokenMap = enrichedTokens.associateBy { it }
return tokens.map { token ->
val enrichedToken = enrichedTokens.firstOrNull { it == token }
enrichedToken ?: token
enrichedTokenMap[token] ?: token
}
}

View file

@ -1,10 +1,13 @@
package com.tangem.data.common.di
import com.tangem.blockchainsdk.utils.ExcludedBlockchains
import com.tangem.data.common.cache.etag.DefaultETagsStore
import com.tangem.data.common.cache.etag.ETagsStore
import com.tangem.data.common.currency.*
import com.tangem.data.common.quote.DefaultQuotesFetcher
import com.tangem.data.common.quote.QuotesFetcher
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.token.UserTokensResponseStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
@ -76,4 +79,10 @@ internal object DataCommonModule {
fun provideQuotesFetcher(tangemTechApi: TangemTechApi, dispatchers: CoroutineDispatcherProvider): QuotesFetcher {
return DefaultQuotesFetcher(tangemTechApi = tangemTechApi, dispatchers = dispatchers)
}
@Provides
@Singleton
fun provideETagsStore(appPreferencesStore: AppPreferencesStore): ETagsStore {
return DefaultETagsStore(appPreferencesStore = appPreferencesStore)
}
}