From f4755463b0c06a96af40e4d33f70a5e1fa7ca1d6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 8 Oct 2024 17:40:19 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../auth/DefaultExpressAuthProvider.kt | 19 +++++++++++++++++++ .../tangem/tap/network/auth/di/AuthModule.kt | 11 +++++++++-- .../common/SwitchEnvironmentInterceptor.kt | 4 +++- .../datasource/api/common/config/Express.kt | 1 + .../api/express/TangemExpressApi.kt | 6 ++++-- .../managers/ProdApiConfigsManagerTest.kt | 3 +++ .../feature/swap/DefaultSwapRepository.kt | 13 +------------ .../tangem/feature/swap/di/SwapDataModule.kt | 2 -- .../tangem/lib/auth/ExpressAuthProvider.kt | 2 ++ 9 files changed, 42 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/network/auth/DefaultExpressAuthProvider.kt b/app/src/main/java/com/tangem/tap/network/auth/DefaultExpressAuthProvider.kt index 99ddfe6b5b..7331b9f95c 100644 --- a/app/src/main/java/com/tangem/tap/network/auth/DefaultExpressAuthProvider.kt +++ b/app/src/main/java/com/tangem/tap/network/auth/DefaultExpressAuthProvider.kt @@ -1,12 +1,17 @@ package com.tangem.tap.network.auth +import com.tangem.datasource.local.preferences.AppPreferencesStore +import com.tangem.datasource.local.preferences.PreferencesKeys +import com.tangem.datasource.local.preferences.utils.getSyncOrDefault import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.lib.auth.ExpressAuthProvider +import kotlinx.coroutines.runBlocking import java.util.UUID import java.util.concurrent.atomic.AtomicReference internal class DefaultExpressAuthProvider( private val userWalletsStore: UserWalletsStore, + private val appPreferencesStore: AppPreferencesStore, ) : ExpressAuthProvider { private var uuid = AtomicReference(UUID.randomUUID()) @@ -18,4 +23,18 @@ internal class DefaultExpressAuthProvider( override fun getSessionId(): String { return uuid.get().toString() } + + override fun getRefCode(): String { + val addedWalletsWithRings = runBlocking { + appPreferencesStore.getSyncOrDefault( + key = PreferencesKeys.ADDED_WALLETS_WITH_RING_KEY, + default = emptySet(), + ) + } + + val userWalletId = userWalletsStore.selectedUserWalletOrNull?.walletId?.stringValue + ?: error("No user id provided") + + return if (addedWalletsWithRings.contains(userWalletId)) "ring" else "" + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/network/auth/di/AuthModule.kt b/app/src/main/java/com/tangem/tap/network/auth/di/AuthModule.kt index 41aa591911..614f6725ac 100644 --- a/app/src/main/java/com/tangem/tap/network/auth/di/AuthModule.kt +++ b/app/src/main/java/com/tangem/tap/network/auth/di/AuthModule.kt @@ -2,6 +2,7 @@ package com.tangem.tap.network.auth.di import com.tangem.datasource.api.common.AuthProvider import com.tangem.datasource.config.ConfigManager +import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.lib.auth.ExpressAuthProvider import com.tangem.lib.auth.StakeKitAuthProvider @@ -29,8 +30,14 @@ class AuthModule { @Provides @Singleton - fun provideExpressAuthProvider(userWalletsStore: UserWalletsStore): ExpressAuthProvider { - return DefaultExpressAuthProvider(userWalletsStore = userWalletsStore) + fun provideExpressAuthProvider( + userWalletsStore: UserWalletsStore, + appPreferencesStore: AppPreferencesStore, + ): ExpressAuthProvider { + return DefaultExpressAuthProvider( + userWalletsStore = userWalletsStore, + appPreferencesStore = appPreferencesStore, + ) } @Provides diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/SwitchEnvironmentInterceptor.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/SwitchEnvironmentInterceptor.kt index dbfbc5e54f..e47f1f8494 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/SwitchEnvironmentInterceptor.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/SwitchEnvironmentInterceptor.kt @@ -46,7 +46,9 @@ internal class SwitchEnvironmentInterceptor( private fun Request.Builder.addHeaders(headers: Map>): Request.Builder { headers.forEach { (name, valueProvider) -> - addHeader(name = name, value = valueProvider()) + val value = valueProvider() + + if (value.isNotBlank()) addHeader(name = name, value = value) } return this 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 index 134d24a3ac..9835b3388c 100644 --- 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 @@ -51,6 +51,7 @@ internal class Express( put(key = "user-id", value = Provider(expressAuthProvider::getUserId)) put(key = "session-id", value = Provider(expressAuthProvider::getSessionId)) putAll(from = RequestHeader.AppVersionPlatformHeaders(appVersionProvider).values) + put(key = "refcode", value = Provider(expressAuthProvider::getRefCode)) } private fun getApiKey(isProd: Boolean): String { diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/express/TangemExpressApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/express/TangemExpressApi.kt index dc1c0b6418..54a7935d66 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/express/TangemExpressApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/express/TangemExpressApi.kt @@ -5,7 +5,10 @@ import com.tangem.datasource.api.express.models.request.AssetsRequestBody import com.tangem.datasource.api.express.models.request.ExchangeSentRequestBody import com.tangem.datasource.api.express.models.request.PairsRequestBody import com.tangem.datasource.api.express.models.response.* -import retrofit2.http.* +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query /** * Interface of Tangem Express API (new swap mechanism) @@ -33,7 +36,6 @@ interface TangemExpressApi { @Query("toDecimals") toDecimals: Int, @Query("providerId") providerId: String, @Query("rateType") rateType: String, - @Header("refcode") refCode: String? = null, ): ApiResponse @GET("exchange-data") 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 d818bd6c9f..c7e95f9f49 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 @@ -44,6 +44,7 @@ internal class ProdApiConfigsManagerTest(private val model: Model) { every { appVersionProvider.versionName } returns VERSION_NAME every { expressAuthProvider.getUserId() } returns EXPRESS_USER_ID every { expressAuthProvider.getSessionId() } returns EXPRESS_SESSION_ID + every { expressAuthProvider.getRefCode() } returns EXPRESS_REF_CODE every { stakeKitAuthProvider.getApiKey() } returns STAKE_KIT_API_KEY } @@ -65,6 +66,7 @@ internal class ProdApiConfigsManagerTest(private val model: Model) { const val VERSION_NAME = "debug" const val EXPRESS_USER_ID = "express_user_id" const val EXPRESS_SESSION_ID = "express_session_id" + const val EXPRESS_REF_CODE = "express_ref_code" const val EXPRESS_API_KEY = "express_api_key" const val EXPRESS_DEV_API_KEY = "express_dev_api_key" const val STAKE_KIT_API_KEY = "stake_kit_api_key" @@ -111,6 +113,7 @@ internal class ProdApiConfigsManagerTest(private val model: Model) { }, "user-id" to Provider { EXPRESS_USER_ID }, "session-id" to Provider { EXPRESS_SESSION_ID }, + "refcode" to Provider { EXPRESS_REF_CODE }, "version" to Provider { VERSION_NAME }, "platform" to Provider { "android" }, ), diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt index e7f6c1fa97..92424fa514 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/DefaultSwapRepository.kt @@ -20,9 +20,6 @@ import com.tangem.datasource.api.express.models.response.SwapPair import com.tangem.datasource.api.express.models.response.SwapPairsWithProviders import com.tangem.datasource.api.express.models.response.TxDetails import com.tangem.datasource.crypto.DataSignatureVerifier -import com.tangem.datasource.local.preferences.AppPreferencesStore -import com.tangem.datasource.local.preferences.PreferencesKeys -import com.tangem.datasource.local.preferences.utils.getSyncOrDefault import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.walletmanager.WalletManagersFacade @@ -41,18 +38,16 @@ import timber.log.Timber import java.io.IOException import java.math.BigDecimal import java.util.UUID -import javax.inject.Inject import com.tangem.datasource.api.express.models.request.LeastTokenInfo as NetworkLeastTokenInfo @Suppress("LongParameterList", "LargeClass") -internal class DefaultSwapRepository @Inject constructor( +internal class DefaultSwapRepository( private val tangemExpressApi: TangemExpressApi, private val coroutineDispatcher: CoroutineDispatcherProvider, private val walletManagersFacade: WalletManagersFacade, private val userWalletsListManager: UserWalletsListManager, private val errorsDataConverter: ErrorsDataConverter, private val dataSignatureVerifier: DataSignatureVerifier, - private val appPreferencesStore: AppPreferencesStore, moshi: Moshi, ) : SwapRepository { @@ -204,11 +199,6 @@ internal class DefaultSwapRepository @Inject constructor( ): Either { return withContext(coroutineDispatcher.io) { try { - val addedWalletsWithRings = appPreferencesStore.getSyncOrDefault( - key = PreferencesKeys.ADDED_WALLETS_WITH_RING_KEY, - default = emptySet(), - ) - val response = tangemExpressApi.getExchangeQuote( fromContractAddress = fromContractAddress, fromNetwork = fromNetwork, @@ -219,7 +209,6 @@ internal class DefaultSwapRepository @Inject constructor( toDecimals = toDecimals, providerId = providerId, rateType = rateType.name.lowercase(), - refCode = if (addedWalletsWithRings.contains(userWalletId.stringValue)) "ring" else null, ).getOrThrow() QuoteModel( toTokenAmount = createFromAmountWithOffset(response.toAmount, response.toDecimals), diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt index 4a3706c560..fde540c8ab 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt @@ -33,7 +33,6 @@ internal class SwapDataModule { walletManagerFacade: WalletManagersFacade, userWalletsListManager: UserWalletsListManager, errorsDataConverter: ErrorsDataConverter, - appPreferencesStore: AppPreferencesStore, @NetworkMoshi moshi: Moshi, ): SwapRepository { return DefaultSwapRepository( @@ -43,7 +42,6 @@ internal class SwapDataModule { userWalletsListManager = userWalletsListManager, errorsDataConverter = errorsDataConverter, dataSignatureVerifier = dataSignature, - appPreferencesStore = appPreferencesStore, moshi = moshi, ) } diff --git a/libs/auth/src/main/java/com/tangem/lib/auth/ExpressAuthProvider.kt b/libs/auth/src/main/java/com/tangem/lib/auth/ExpressAuthProvider.kt index 8582fd21ed..ebca655e53 100644 --- a/libs/auth/src/main/java/com/tangem/lib/auth/ExpressAuthProvider.kt +++ b/libs/auth/src/main/java/com/tangem/lib/auth/ExpressAuthProvider.kt @@ -5,4 +5,6 @@ interface ExpressAuthProvider { fun getUserId(): String fun getSessionId(): String + + fun getRefCode(): String } \ No newline at end of file