Updated on 2026-08-14

This commit is contained in:
Tangem 2025-08-13 19:05:20 +04:00
parent bea775e94b
commit cf6b5dbabb
2 changed files with 27 additions and 5 deletions

View file

@ -15,12 +15,14 @@ import okio.IOException
* Switch api environment [Interceptor]
*
* @property id api config id [ApiConfig.ID]
* @property baseUrls base urls for all api config environments
* @property apiConfigsManager api configs manager
*
[REDACTED_AUTHOR]
*/
internal class SwitchEnvironmentInterceptor(
private val id: ApiConfig.ID,
private val baseUrls: Set<String>,
private val apiConfigsManager: ApiConfigsManager,
) : Interceptor {
@ -39,10 +41,13 @@ internal class SwitchEnvironmentInterceptor(
return chain.proceed(request)
}
private fun HttpUrl.adjustBaseUrl(url: String): HttpUrl {
return this.newBuilder()
.host(host = url.toHttpUrl().host)
.build()
private fun HttpUrl.adjustBaseUrl(newBaseUrl: String): HttpUrl {
val currentUrl = this.toString()
val currentBaseUrl = baseUrls.first { currentUrl.contains(it) }
return currentUrl
.replace(oldValue = currentBaseUrl, newValue = newBaseUrl)
.toHttpUrl()
}
private fun Request.Builder.addHeaders(headers: Map<String, ProviderSuspend<String>>): Request.Builder {

View file

@ -8,6 +8,7 @@ import com.tangem.datasource.BuildConfig
import com.tangem.datasource.api.common.SwitchEnvironmentInterceptor
import com.tangem.datasource.api.common.config.ApiConfig
import com.tangem.datasource.api.common.config.ApiConfig.Companion.MOCKED_BUILD_TYPE
import com.tangem.datasource.api.common.config.ApiConfigs
import com.tangem.datasource.api.common.config.ApiEnvironmentConfig
import com.tangem.datasource.api.common.config.managers.ApiConfigsManager
import com.tangem.datasource.api.common.createNetworkLoggingInterceptor
@ -42,6 +43,7 @@ import javax.inject.Singleton
*/
@Singleton
internal class RetrofitApiBuilder @Inject constructor(
private val apiConfigs: ApiConfigs,
private val apiConfigsManager: ApiConfigsManager,
@NetworkMoshi private val moshi: Moshi,
private val analyticsErrorHandler: AnalyticsErrorHandler,
@ -49,6 +51,8 @@ internal class RetrofitApiBuilder @Inject constructor(
private val appLogsStore: AppLogsStore,
) {
private val configsBaseUrls: Map<ApiConfig.ID, Set<String>> = getConfigsBaseUrls()
/**
* Builds a Retrofit API instance for the specified API configuration ID
*
@ -95,13 +99,26 @@ internal class RetrofitApiBuilder @Inject constructor(
val writeTimeoutSeconds: Long? = null,
)
private fun getConfigsBaseUrls(): Map<ApiConfig.ID, Set<String>> {
return apiConfigs.associate { config ->
val allBaseUrls = config.environmentConfigs.mapTo(hashSetOf(), ApiEnvironmentConfig::baseUrl)
config.id to allBaseUrls
}
}
private fun OkHttpClient.Builder.applyApiConfig(
apiConfigId: ApiConfig.ID,
environmentConfig: ApiEnvironmentConfig,
): OkHttpClient.Builder {
return if (BuildConfig.TESTER_MENU_ENABLED || BuildConfig.BUILD_TYPE == MOCKED_BUILD_TYPE) {
addInterceptor(
interceptor = SwitchEnvironmentInterceptor(id = apiConfigId, apiConfigsManager = apiConfigsManager),
interceptor = SwitchEnvironmentInterceptor(
id = apiConfigId,
baseUrls = configsBaseUrls[apiConfigId]
?: error("Base URLs for ApiConfig with id [$apiConfigId] not found"),
apiConfigsManager = apiConfigsManager,
),
)
} else {
val headers = environmentConfig.headers