Updated on 2026-08-14

This commit is contained in:
Tangem 2025-11-03 14:59:47 +03:00
parent c9fca04205
commit 80ca0095f1
11 changed files with 83 additions and 46 deletions

View file

@ -1,5 +1,9 @@
package com.tangem.datasource.api.common
import com.tangem.datasource.api.common.config.ApiEnvironment
import com.tangem.utils.Provider
import com.tangem.utils.ProviderSuspend
/**
* Provides auth for tangemTech API
*/
@ -12,6 +16,8 @@ interface AuthProvider {
suspend fun getCardId(): String
fun getApiKey(apiEnvironment: Provider<ApiEnvironment>): ProviderSuspend<String>
/**
* Returns map where keys(cardId) associated with cardPublicKey
*/

View file

@ -2,15 +2,13 @@ package com.tangem.datasource.api.common.config
import com.tangem.datasource.BuildConfig
import com.tangem.datasource.api.common.AuthProvider
import com.tangem.datasource.local.config.environment.EnvironmentConfigStorage
import com.tangem.datasource.utils.RequestHeader
import com.tangem.utils.ProviderSuspend
import com.tangem.utils.Provider
import com.tangem.utils.info.AppInfoProvider
import com.tangem.utils.version.AppVersionProvider
/** TangemTech [ApiConfig] */
internal class TangemTech(
private val environmentConfigStorage: EnvironmentConfigStorage,
private val appVersionProvider: AppVersionProvider,
private val authProvider: AuthProvider,
private val appInfoProvider: AppInfoProvider,
@ -63,20 +61,8 @@ internal class TangemTech(
)
private fun createHeaders(apiEnvironment: ApiEnvironment) = buildMap {
put(key = "api-key", value = ProviderSuspend { getApiKey(apiEnvironment) })
putAll(from = RequestHeader.TangemApiKeyHeader(authProvider, Provider { apiEnvironment }).values)
putAll(from = RequestHeader.AppVersionPlatformHeaders(appVersionProvider, appInfoProvider).values)
putAll(from = RequestHeader.AuthenticationHeader(authProvider).values)
}
private fun getApiKey(apiEnvironment: ApiEnvironment): String {
return when (apiEnvironment) {
ApiEnvironment.MOCK,
ApiEnvironment.DEV,
ApiEnvironment.DEV_2,
ApiEnvironment.DEV_3,
-> environmentConfigStorage.getConfigSync().tangemApiKeyDev
ApiEnvironment.STAGE -> environmentConfigStorage.getConfigSync().tangemApiKeyStage
ApiEnvironment.PROD -> environmentConfigStorage.getConfigSync().tangemApiKey
} ?: error("No tangem tech api config provided")
}
}

View file

@ -42,12 +42,10 @@ internal object ApiConfigsModule {
@Provides
@IntoSet
fun provideTangemTechConfig(
environmentConfigStorage: EnvironmentConfigStorage,
appVersionProvider: AppVersionProvider,
authProvider: AuthProvider,
appInfoProvider: AppInfoProvider,
): ApiConfig = TangemTech(
environmentConfigStorage = environmentConfigStorage,
appVersionProvider = appVersionProvider,
authProvider = authProvider,
appInfoProvider = appInfoProvider,

View file

@ -1,5 +1,6 @@
package com.tangem.datasource.utils
import com.tangem.utils.ProviderSuspend
import kotlinx.coroutines.runBlocking
import okhttp3.Interceptor
import okhttp3.Response
@ -12,21 +13,17 @@ import okhttp3.Response
[REDACTED_AUTHOR]
*/
class AddHeadersInterceptor(
private val requestHeaders: Set<RequestHeader>,
private val requestHeaders: Map<String, ProviderSuspend<String>>,
) : Interceptor {
constructor(requestHeader: RequestHeader) : this(requestHeaders = setOf(requestHeader))
override fun intercept(chain: Interceptor.Chain): Response {
val requestBuilder = chain.request().newBuilder()
requestHeaders
.flatMap { it.values.toList() }
.forEach { (name, valueProvider) ->
val value = runBlocking { valueProvider() }
requestHeaders.forEach { (name, valueProvider) ->
val value = runBlocking { valueProvider() }
requestBuilder.addHeader(name = name, value = value)
}
requestBuilder.addHeader(name = name, value = value)
}
val request = requestBuilder.build()

View file

@ -5,13 +5,6 @@ import kotlinx.coroutines.runBlocking
import okhttp3.Interceptor
import okhttp3.OkHttpClient
/** Extension for adding headers [requestHeaders] to every [OkHttpClient] request */
internal fun OkHttpClient.Builder.addHeaders(vararg requestHeaders: RequestHeader): OkHttpClient.Builder {
return addInterceptor(
interceptor = AddHeadersInterceptor(requestHeaders = requestHeaders.toSet()),
)
}
/** Extension for adding headers [requestHeaders] to every [OkHttpClient] request */
internal fun OkHttpClient.Builder.addHeaders(
requestHeaders: Map<String, ProviderSuspend<String>>,

View file

@ -2,7 +2,9 @@ package com.tangem.datasource.utils
import android.os.Build
import com.tangem.datasource.api.common.AuthProvider
import com.tangem.datasource.api.common.config.ApiEnvironment
import com.tangem.datasource.utils.RequestHeader.CacheControlHeader.checkHeaderValueOrEmpty
import com.tangem.utils.Provider
import com.tangem.utils.ProviderSuspend
import com.tangem.utils.info.AppInfoProvider
import com.tangem.utils.version.AppVersionProvider
@ -40,6 +42,13 @@ sealed class RequestHeader(vararg pairs: Pair<String, ProviderSuspend<String>>)
"device" to ProviderSuspend { "${Build.MANUFACTURER} ${Build.MODEL}".checkHeaderValueOrEmpty() },
)
/**
* Use ONLY for tangemApi (not express or yields)
*/
class TangemApiKeyHeader(authProvider: AuthProvider, apiEnvironment: Provider<ApiEnvironment>) : RequestHeader(
"api-key" to authProvider.getApiKey(apiEnvironment),
)
/**
* Use it to avoid crash in okhttp headers
*/