Updated on 2026-08-14

This commit is contained in:
Tangem 2024-08-14 15:47:19 +03:00
parent ad3e6eb322
commit cba839d8f2
8 changed files with 69 additions and 22 deletions

View file

@ -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
}
}

View file

@ -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<ApiEnvironmentConfig> = 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" },
),
)
}
}

View file

@ -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)

View file

@ -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<RequestHeader> = 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/"

View file

@ -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)
}
}

View file

@ -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<String, Provider<String>>) {
"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" },
)
}

View file

@ -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/",
)
}
}
}

View file

@ -63,9 +63,11 @@ internal class EnvironmentsTogglesViewModel @Inject constructor(
}
private fun Map<ApiConfig, ApiEnvironment>.toUiModel(): ImmutableSet<EnvironmentTogglesScreenUM.ApiInfoUM> {
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,