From 700731a40870511a3fed83102c0203aa42e03ab2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 8 Aug 2024 18:28:24 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../datasource/api/common/config/ApiConfig.kt | 50 +++++++++++++++++++ .../api/common/config/ApiEnvironment.kt | 10 ++++ .../datasource/api/common/config/Express.kt | 35 +++++++++++++ .../api/common/config/TangemTech.kt | 34 +++++++++++++ .../config/managers/ApiConfigsManager.kt | 17 +++++++ .../managers/MutableApiConfigsManager.kt | 19 +++++++ .../utils/AppPreferencesStoreExt.kt | 10 +++- .../analytics/DefaultAnalyticsRepository.kt | 6 +-- .../feedback/DefaultFeedbackRepository.kt | 4 +- ...ultPolkadotAccountHealthCheckRepository.kt | 4 +- .../swap/DefaultSwapTransactionRepository.kt | 4 +- 11 files changed, 183 insertions(+), 10 deletions(-) create mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/common/config/ApiConfig.kt create mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/common/config/ApiEnvironment.kt create mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/common/config/Express.kt create mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemTech.kt create mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/common/config/managers/ApiConfigsManager.kt create mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/common/config/managers/MutableApiConfigsManager.kt diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/ApiConfig.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/ApiConfig.kt new file mode 100644 index 0000000000..7c5b88f27a --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/ApiConfig.kt @@ -0,0 +1,50 @@ +package com.tangem.datasource.api.common.config + +/** + * Api config + * + * @property currentEnvironment current api environment + * + * @see API configuration + * +[REDACTED_AUTHOR] + */ +sealed class ApiConfig(open val currentEnvironment: ApiEnvironment) { + + /** Available environments with base url */ + abstract val environments: Map + + /** Unique id */ + val id: ID = initializeId() + + enum class ID { + Express, + TangemTech, + } + + /** Copy method for sealed class [ApiConfig] */ + fun copySealed(currentEnvironment: ApiEnvironment): ApiConfig { + return when (this) { + is Express -> copy(currentEnvironment = currentEnvironment) + is TangemTech -> copy(currentEnvironment = currentEnvironment) + } + } + + private fun initializeId(): ID { + return when (this) { + is Express -> ID.Express + is TangemTech -> ID.TangemTech + } + } + + companion object { + internal const val DEBUG_BUILD_TYPE = "debug" + internal const val INTERNAL_BUILD_TYPE = "internal" + internal const val MOCKED_BUILD_TYPE = "mocked" + internal const val EXTERNAL_BUILD_TYPE = "external" + internal const val RELEASE_BUILD_TYPE = "release" + + /** All api configs */ + fun values() = listOf(Express(), TangemTech()) + } +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/ApiEnvironment.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/ApiEnvironment.kt new file mode 100644 index 0000000000..00945bf772 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/ApiEnvironment.kt @@ -0,0 +1,10 @@ +package com.tangem.datasource.api.common.config + +/** + * Api environment + * +[REDACTED_AUTHOR] + */ +enum class ApiEnvironment { + DEV, STAGE, PROD +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/Express.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/Express.kt new file mode 100644 index 0000000000..5ebf06c017 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/Express.kt @@ -0,0 +1,35 @@ +package com.tangem.datasource.api.common.config + +import com.tangem.datasource.BuildConfig + +/** + * Express [ApiConfig] + * + * @property currentEnvironment current api environment + */ +internal data class Express( + override val currentEnvironment: ApiEnvironment = initializeCurrentEnvironment(), +) : ApiConfig(currentEnvironment) { + + override val environments: Map = mapOf( + ApiEnvironment.DEV to "[REDACTED_ENV_URL]", + ApiEnvironment.STAGE to "[REDACTED_ENV_URL]", + ApiEnvironment.PROD to "https://express.tangem.com/v1/", + ) + + private companion object { + + fun initializeCurrentEnvironment(): ApiEnvironment { + return when (BuildConfig.BUILD_TYPE) { + DEBUG_BUILD_TYPE -> ApiEnvironment.DEV + INTERNAL_BUILD_TYPE, + MOCKED_BUILD_TYPE, + -> ApiEnvironment.STAGE + EXTERNAL_BUILD_TYPE, + RELEASE_BUILD_TYPE, + -> ApiEnvironment.PROD + else -> error("Unknown build type [${BuildConfig.BUILD_TYPE}]") + } + } + } +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemTech.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemTech.kt new file mode 100644 index 0000000000..25d15d3194 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemTech.kt @@ -0,0 +1,34 @@ +package com.tangem.datasource.api.common.config + +import com.tangem.datasource.BuildConfig + +/** + * TangemTech [ApiConfig] + * + * @property currentEnvironment current api environment + */ +internal data class TangemTech( + override val currentEnvironment: ApiEnvironment = initializeCurrentEnvironment(), +) : ApiConfig(currentEnvironment) { + + override val environments: Map = mapOf( + ApiEnvironment.DEV to "https://devapi.tangem-tech.com/v1/", + ApiEnvironment.PROD to "https://api.tangem-tech.com/v1/", + ) + + private companion object { + + fun initializeCurrentEnvironment(): ApiEnvironment { + return when (BuildConfig.BUILD_TYPE) { + DEBUG_BUILD_TYPE, + INTERNAL_BUILD_TYPE, + -> ApiEnvironment.DEV + MOCKED_BUILD_TYPE, + EXTERNAL_BUILD_TYPE, + RELEASE_BUILD_TYPE, + -> ApiEnvironment.PROD + else -> error("Unknown build type [${BuildConfig.BUILD_TYPE}]") + } + } + } +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/managers/ApiConfigsManager.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/managers/ApiConfigsManager.kt new file mode 100644 index 0000000000..6bb9cbb6ca --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/managers/ApiConfigsManager.kt @@ -0,0 +1,17 @@ +package com.tangem.datasource.api.common.config.managers + +import com.tangem.datasource.api.common.config.ApiConfig + +/** + * Api configs manager + * +[REDACTED_AUTHOR] + */ +interface ApiConfigsManager { + + /** Initialize resources */ + suspend fun initialize() {} + + /** Get base url of api by [id] */ + fun getBaseUrl(id: ApiConfig.ID): String +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/managers/MutableApiConfigsManager.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/managers/MutableApiConfigsManager.kt new file mode 100644 index 0000000000..87ec3f21fb --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/managers/MutableApiConfigsManager.kt @@ -0,0 +1,19 @@ +package com.tangem.datasource.api.common.config.managers + +import com.tangem.datasource.api.common.config.ApiConfig +import com.tangem.datasource.api.common.config.ApiEnvironment +import kotlinx.coroutines.flow.Flow + +/** + * Mutable [ApiConfigsManager] for change information about the current api environment + * +[REDACTED_AUTHOR] + */ +interface MutableApiConfigsManager : ApiConfigsManager { + + /** Configs */ + val configs: Flow> + + /** Change api environment [environment] by [id] */ + suspend fun changeEnvironment(id: String, environment: ApiEnvironment) +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt index 26be12c002..a7fd3cafef 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/utils/AppPreferencesStoreExt.kt @@ -125,7 +125,7 @@ suspend inline fun AppPreferencesStore.storeObjectMap( } /** Get map with [String] key and value [V] by string [key], or empty if data is not found */ -suspend inline fun AppPreferencesStore.getObjectMap(key: Preferences.Key): Map { +suspend inline fun AppPreferencesStore.getObjectMapSync(key: Preferences.Key): Map { val type = Types.newParameterizedType(Map::class.java, String::class.java, V::class.java) val adapter = moshi.adapter>(type) @@ -135,6 +135,14 @@ suspend inline fun AppPreferencesStore.getObjectMap(key: Preferences .orEmpty() } +/** Get flow of map with [String] key and value [V] by string [key], or empty if data is not found */ +inline fun AppPreferencesStore.getObjectMap(key: Preferences.Key): Flow> { + val type = Types.newParameterizedType(Map::class.java, String::class.java, V::class.java) + val adapter = moshi.adapter>(type) + + return data.map { it[key]?.let(adapter::fromJson) ?: emptyMap() } +} + /** Get set of data [T] by string [key], or empty if data is not found */ suspend inline fun AppPreferencesStore.getObjectSetSync(key: Preferences.Key): Set { val adapter = moshi.adapter>(Types.newParameterizedType(Set::class.java, T::class.java)) diff --git a/data/analytics/src/main/kotlin/com/tangem/data/analytics/DefaultAnalyticsRepository.kt b/data/analytics/src/main/kotlin/com/tangem/data/analytics/DefaultAnalyticsRepository.kt index 4866aa1c89..b1554751cc 100644 --- a/data/analytics/src/main/kotlin/com/tangem/data/analytics/DefaultAnalyticsRepository.kt +++ b/data/analytics/src/main/kotlin/com/tangem/data/analytics/DefaultAnalyticsRepository.kt @@ -3,7 +3,7 @@ package com.tangem.data.analytics import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getObjectListSync -import com.tangem.datasource.local.preferences.utils.getObjectMap +import com.tangem.datasource.local.preferences.utils.getObjectMapSync import com.tangem.domain.analytics.model.WalletBalanceState import com.tangem.domain.analytics.repository.AnalyticsRepository import com.tangem.domain.wallets.models.UserWalletId @@ -29,7 +29,7 @@ internal class DefaultAnalyticsRepository( } override suspend fun getWalletBalanceState(userWalletId: UserWalletId): WalletBalanceState? { - val walletsBalanceState = appPreferencesStore.getObjectMap( + val walletsBalanceState = appPreferencesStore.getObjectMapSync( key = PreferencesKeys.WALLETS_BALANCES_STATES_KEY, ) @@ -41,7 +41,7 @@ internal class DefaultAnalyticsRepository( val walletsBalanceState = it.getObjectMap( key = PreferencesKeys.WALLETS_BALANCES_STATES_KEY, ) - val updatedWalletsBalanceState = walletsBalanceState.orEmpty() + val updatedWalletsBalanceState = walletsBalanceState .plus(pair = userWalletId.stringValue to balanceState) it.setObjectMap(PreferencesKeys.WALLETS_BALANCES_STATES_KEY, updatedWalletsBalanceState) diff --git a/data/feedback/src/main/java/com/tangem/data/feedback/DefaultFeedbackRepository.kt b/data/feedback/src/main/java/com/tangem/data/feedback/DefaultFeedbackRepository.kt index b5313ac608..26278b5877 100644 --- a/data/feedback/src/main/java/com/tangem/data/feedback/DefaultFeedbackRepository.kt +++ b/data/feedback/src/main/java/com/tangem/data/feedback/DefaultFeedbackRepository.kt @@ -8,7 +8,7 @@ import com.tangem.data.feedback.converters.BlockchainInfoConverter import com.tangem.data.feedback.converters.CardInfoConverter import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys -import com.tangem.datasource.local.preferences.utils.getObjectMap +import com.tangem.datasource.local.preferences.utils.getObjectMapSync import com.tangem.datasource.local.walletmanager.WalletManagersStore import com.tangem.domain.feedback.models.* import com.tangem.domain.feedback.repository.FeedbackRepository @@ -99,7 +99,7 @@ internal class DefaultFeedbackRepository( } override suspend fun getAppLogs(): List { - return appPreferencesStore.getObjectMap(key = PreferencesKeys.APP_LOGS_KEY) + return appPreferencesStore.getObjectMapSync(key = PreferencesKeys.APP_LOGS_KEY) .map { AppLogModel(timestamp = it.key.toLong(), message = it.value) } .sortedBy(AppLogModel::timestamp) } diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultPolkadotAccountHealthCheckRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultPolkadotAccountHealthCheckRepository.kt index 049991280b..82f9f9465a 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultPolkadotAccountHealthCheckRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultPolkadotAccountHealthCheckRepository.kt @@ -9,7 +9,7 @@ import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys.POLKADOT_HEALTH_CHECKED_IMMUTABLE_ACCOUNTS_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.POLKADOT_HEALTH_CHECKED_RESET_ACCOUNTS_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.POLKADOT_HEALTH_CHECK_LAST_INDEXED_TX_KEY -import com.tangem.datasource.local.preferences.utils.getObjectMap +import com.tangem.datasource.local.preferences.utils.getObjectMapSync import com.tangem.datasource.local.preferences.utils.getObjectSetSync import com.tangem.domain.tokens.model.Network import com.tangem.domain.tokens.repository.PolkadotAccountHealthCheckRepository @@ -97,7 +97,7 @@ internal class DefaultPolkadotAccountHealthCheckRepository( runCatching { do { // Getting batch of extrinsics to check - val lastChecked = appPreferencesStore.getObjectMap(POLKADOT_HEALTH_CHECK_LAST_INDEXED_TX_KEY) + val lastChecked = appPreferencesStore.getObjectMapSync(POLKADOT_HEALTH_CHECK_LAST_INDEXED_TX_KEY) val lastExtrinsic = lastChecked[address] val extrinsicListResult = accountCheckerProvider.getExtrinsicList(afterExtrinsicId = lastExtrinsic) extrinsicListResult.extrinsic diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapTransactionRepository.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapTransactionRepository.kt index 7cca09753d..9b44aacbef 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapTransactionRepository.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapTransactionRepository.kt @@ -4,7 +4,7 @@ import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getObjectList import com.tangem.datasource.local.preferences.utils.getObjectListSync -import com.tangem.datasource.local.preferences.utils.getObjectMap +import com.tangem.datasource.local.preferences.utils.getObjectMapSync import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.wallets.models.UserWalletId @@ -75,7 +75,7 @@ class DefaultSwapTransactionRepository( scanResponse: ScanResponse, ): Flow?> { return withContext(dispatchers.io) { - val txStatuses = appPreferencesStore.getObjectMap( + val txStatuses = appPreferencesStore.getObjectMapSync( key = PreferencesKeys.SWAP_TRANSACTIONS_STATUSES_KEY, ) appPreferencesStore.getObjectList(