From cba839d8f24f1a6df6ad4d88700eb865e3c8c256 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 14 Aug 2024 15:47:19 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../datasource/api/common/config/ApiConfig.kt | 2 ++ .../datasource/api/common/config/StakeKit.kt | 33 +++++++++++++++++++ .../tangem/datasource/di/ApiConfigsModule.kt | 8 +++++ .../com/tangem/datasource/di/NetworkModule.kt | 20 +++++------ .../tangem/datasource/utils/HttpClientExt.kt | 8 +++-- .../tangem/datasource/utils/RequestHeader.kt | 6 ---- .../managers/ProdApiConfigsManagerTest.kt | 10 ++++++ .../EnvironmentsTogglesViewModel.kt | 4 ++- 8 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/common/config/StakeKit.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 index caa3117899..65bc7a1e66 100644 --- 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 @@ -23,12 +23,14 @@ sealed class ApiConfig { enum class ID { Express, TangemTech, + StakeKit, } private fun initializeId(): ID { return when (this) { is Express -> ID.Express is TangemTech -> ID.TangemTech + is StakeKit -> ID.StakeKit } } diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/StakeKit.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/StakeKit.kt new file mode 100644 index 0000000000..4370c06c92 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/StakeKit.kt @@ -0,0 +1,33 @@ +package com.tangem.datasource.api.common.config + +import com.tangem.lib.auth.StakeKitAuthProvider +import com.tangem.utils.Provider + +/** + * StakeKit [ApiConfig] + * + * @property stakeKitAuthProvider StakeKit auth provider + * +[REDACTED_AUTHOR] + */ +internal class StakeKit( + private val stakeKitAuthProvider: StakeKitAuthProvider, +) : ApiConfig() { + + override val defaultEnvironment: ApiEnvironment = ApiEnvironment.PROD + + override val environmentConfigs: List = listOf( + createProdEnvironment(), + ) + + private fun createProdEnvironment(): ApiEnvironmentConfig { + return ApiEnvironmentConfig( + environment = ApiEnvironment.PROD, + baseUrl = "https://api.stakek.it/v1/", + headers = mapOf( + "X-API-KEY" to Provider(stakeKitAuthProvider::getApiKey), + "accept" to Provider { "application/json" }, + ), + ) + } +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/ApiConfigsModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/ApiConfigsModule.kt index f144cc7450..1dd7fb700c 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/ApiConfigsModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/ApiConfigsModule.kt @@ -2,9 +2,11 @@ package com.tangem.datasource.di import com.tangem.datasource.api.common.config.ApiConfig import com.tangem.datasource.api.common.config.Express +import com.tangem.datasource.api.common.config.StakeKit import com.tangem.datasource.api.common.config.TangemTech import com.tangem.datasource.config.ConfigManager import com.tangem.lib.auth.ExpressAuthProvider +import com.tangem.lib.auth.StakeKitAuthProvider import com.tangem.utils.version.AppVersionProvider import dagger.Module import dagger.Provides @@ -26,6 +28,12 @@ internal object ApiConfigsModule { return Express(configManager, expressAuthProvider, appVersionProvider) } + @Provides + @IntoSet + fun provideStakeKitConfig(stakeKitAuthProvider: StakeKitAuthProvider): ApiConfig { + return StakeKit(stakeKitAuthProvider) + } + @Provides @IntoSet fun provideTangemTechConfig(appVersionProvider: AppVersionProvider): ApiConfig = TangemTech(appVersionProvider) diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt index f57577e4a5..a393f14ee7 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt @@ -17,8 +17,6 @@ import com.tangem.datasource.api.tangemTech.TangemTechApiV2 import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.utils.* import com.tangem.datasource.utils.RequestHeader.AppVersionPlatformHeaders -import com.tangem.datasource.utils.RequestHeader.StakeKit -import com.tangem.lib.auth.StakeKitAuthProvider import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.version.AppVersionProvider import dagger.Module @@ -65,8 +63,7 @@ class NetworkModule { .baseUrl(environmentConfig.baseUrl) .client( OkHttpClient.Builder() - .addEnvironmentSwitcher(ApiConfig.ID.Express, apiConfigsManager) - .addHeaders(environmentConfig.headers) + .applyApiConfig(ApiConfig.ID.Express, apiConfigsManager) .addLoggers(context) .build(), ) @@ -79,15 +76,17 @@ class NetworkModule { fun provideStakeKitApi( @NetworkMoshi moshi: Moshi, @ApplicationContext context: Context, - stakeKitAuthProvider: StakeKitAuthProvider, + apiConfigsManager: ApiConfigsManager, ): StakeKitApi { + val environmentConfig = apiConfigsManager.getEnvironmentConfig(id = ApiConfig.ID.StakeKit) + return Retrofit.Builder() .addConverterFactory(MoshiConverterFactory.create(moshi)) .addCallAdapterFactory(ApiResponseCallAdapterFactory.create()) - .baseUrl(STAKEKIT_BASE_URL) + .baseUrl(environmentConfig.baseUrl) .client( OkHttpClient.Builder() - .addHeaders(StakeKit(stakeKitAuthProvider)) + .applyApiConfig(id = ApiConfig.ID.StakeKit, apiConfigsManager = apiConfigsManager) .addLoggers(context) .build(), ) @@ -110,8 +109,7 @@ class NetworkModule { .baseUrl(environmentConfig.baseUrl) .client( OkHttpClient.Builder() - .addEnvironmentSwitcher(id = ApiConfig.ID.TangemTech, apiConfigsManager = apiConfigsManager) - .addHeaders(environmentConfig.headers) + .applyApiConfig(id = ApiConfig.ID.TangemTech, apiConfigsManager = apiConfigsManager) .applyTimeoutAnnotations() .addLoggers(context) .build(), @@ -189,7 +187,7 @@ class NetworkModule { requestHeaders: List = listOf(AppVersionPlatformHeaders(appVersionProvider)), ): T { val client = OkHttpClient.Builder() - .addEnvironmentSwitcher(id = ApiConfig.ID.TangemTech, apiConfigsManager = apiConfigsManager) + .applyApiConfig(id = ApiConfig.ID.TangemTech, apiConfigsManager = apiConfigsManager) .applyTimeoutAnnotations() .let { builder -> var b = builder @@ -232,8 +230,6 @@ class NetworkModule { ) private companion object { - const val STAKEKIT_BASE_URL = "https://api.stakek.it/v1/" - const val DEV_V1_TANGEM_TECH_BASE_URL = "https://devapi.tangem-tech.com/v1/" const val PROD_V2_TANGEM_TECH_BASE_URL = "https://api.tangem-tech.com/v2/" diff --git a/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt b/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt index f0812aa21c..bd6e251c2b 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt @@ -88,12 +88,12 @@ internal fun OkHttpClient.Builder.addLoggers(context: Context? = null): OkHttpCl } /** - * Add environment switcher + * Apply api config * * @param id class of [ApiConfig] * @param apiConfigsManager api configs manager */ -internal fun OkHttpClient.Builder.addEnvironmentSwitcher( +internal fun OkHttpClient.Builder.applyApiConfig( id: ApiConfig.ID, apiConfigsManager: ApiConfigsManager, ): OkHttpClient.Builder { @@ -105,6 +105,8 @@ internal fun OkHttpClient.Builder.addEnvironmentSwitcher( ), ) } else { - this + val headers = apiConfigsManager.getEnvironmentConfig(id).headers + + this.addHeaders(headers) } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt b/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt index b69481c34c..b6ed8b7645 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt @@ -1,7 +1,6 @@ package com.tangem.datasource.utils import com.tangem.datasource.api.common.AuthProvider -import com.tangem.lib.auth.StakeKitAuthProvider import com.tangem.utils.Provider import com.tangem.utils.version.AppVersionProvider @@ -26,9 +25,4 @@ sealed class RequestHeader(vararg pairs: Pair>) { "version" to Provider(appVersionProvider::versionName), "platform" to Provider { "android" }, ) - - class StakeKit(stakeKitAuthProvider: StakeKitAuthProvider) : RequestHeader( - "X-API-KEY" to Provider(stakeKitAuthProvider::getApiKey), - "accept" to Provider { "application/json" }, - ) } \ No newline at end of file diff --git a/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt b/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt index 8023906e1c..f5b88829a3 100644 --- a/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt +++ b/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt @@ -9,6 +9,7 @@ import com.tangem.datasource.api.common.config.ApiConfig.Companion.INTERNAL_BUIL import com.tangem.datasource.api.common.config.ApiConfig.Companion.MOCKED_BUILD_TYPE import com.tangem.datasource.api.common.config.ApiConfig.Companion.RELEASE_BUILD_TYPE import com.tangem.datasource.api.common.config.Express +import com.tangem.datasource.api.common.config.StakeKit import com.tangem.datasource.api.common.config.TangemTech import io.mockk.mockk import org.junit.Test @@ -37,6 +38,7 @@ internal class ProdApiConfigsManagerTest(private val model: Model) { val API_CONFIGS = setOf( Express(mockk(), mockk(), mockk()), TangemTech(mockk()), + StakeKit(mockk()), // Don't forget to add new config ) @@ -47,6 +49,7 @@ internal class ProdApiConfigsManagerTest(private val model: Model) { when (it) { is Express -> createExpressModel() is TangemTech -> createTangemTechModel() + is StakeKit -> createStakeKitModel() } } @@ -72,5 +75,12 @@ internal class ProdApiConfigsManagerTest(private val model: Model) { expected = "https://api.tangem-tech.com/v1/", ) } + + private fun createStakeKitModel(): Model { + return Model( + id = ApiConfig.ID.StakeKit, + expected = "https://api.stakek.it/v1/", + ) + } } } \ No newline at end of file diff --git a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/environments/viewmodels/EnvironmentsTogglesViewModel.kt b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/environments/viewmodels/EnvironmentsTogglesViewModel.kt index c8bf8c8b56..e2d3b7e6a3 100644 --- a/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/environments/viewmodels/EnvironmentsTogglesViewModel.kt +++ b/features/tester/impl/src/main/java/com/tangem/feature/tester/presentation/environments/viewmodels/EnvironmentsTogglesViewModel.kt @@ -63,9 +63,11 @@ internal class EnvironmentsTogglesViewModel @Inject constructor( } private fun Map.toUiModel(): ImmutableSet { - return map { + return mapNotNull { val (config, currentEnvironment) = it + if (config.environmentConfigs.size <= 1) return@mapNotNull null + EnvironmentTogglesScreenUM.ApiInfoUM( name = config.id.name, select = currentEnvironment.name,