diff --git a/app/src/main/assets/tangem-app-config b/app/src/main/assets/tangem-app-config index 2b49c08b92..ade38b689e 160000 --- a/app/src/main/assets/tangem-app-config +++ b/app/src/main/assets/tangem-app-config @@ -1 +1 @@ -Subproject commit 2b49c08b924c03322f35542a7482e4e9fb1928d3 +Subproject commit ade38b689e5e390cf4105f9dfa641b4f6912dcd0 diff --git a/app/src/main/java/com/tangem/tap/network/auth/AuthProviderImpl.kt b/app/src/main/java/com/tangem/tap/network/auth/DefaultAuthProvider.kt similarity index 81% rename from app/src/main/java/com/tangem/tap/network/auth/AuthProviderImpl.kt rename to app/src/main/java/com/tangem/tap/network/auth/DefaultAuthProvider.kt index d4bbdd61bd..27ac9a4336 100644 --- a/app/src/main/java/com/tangem/tap/network/auth/AuthProviderImpl.kt +++ b/app/src/main/java/com/tangem/tap/network/auth/DefaultAuthProvider.kt @@ -4,7 +4,7 @@ import com.tangem.common.extensions.toHexString import com.tangem.lib.auth.AuthProvider import com.tangem.tap.proxy.AppStateHolder -class AuthProviderImpl(private val appStateHolder: AppStateHolder) : AuthProvider { +internal class DefaultAuthProvider(private val appStateHolder: AppStateHolder) : AuthProvider { override fun getCardPublicKey(): String { return appStateHolder.scanResponse?.card?.cardPublicKey?.toHexString() ?: "" 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 new file mode 100644 index 0000000000..70d580f3c7 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/network/auth/DefaultExpressAuthProvider.kt @@ -0,0 +1,32 @@ +package com.tangem.tap.network.auth + +import com.tangem.datasource.config.ConfigManager +import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.lib.auth.ExpressAuthProvider +import com.tangem.lib.auth.sessionId.ExpressSessionIdGenerator +import java.util.UUID +import java.util.concurrent.atomic.AtomicReference + +internal class DefaultExpressAuthProvider( + private val userWalletsStore: UserWalletsStore, + private val configManager: ConfigManager, +) : ExpressAuthProvider, ExpressSessionIdGenerator { + + private var uuid = AtomicReference(UUID.randomUUID()) + + override fun getApiKey(): String { + return configManager.config.tangemExpressApiKey + } + + override fun getUserId(): String { + return userWalletsStore.selectedUserWalletOrNull?.walletId?.stringValue ?: "" + } + + override fun getSessionId(): String { + return uuid.get().toString() + } + + override fun generateNewSessionId() { + uuid = AtomicReference(UUID.randomUUID()) + } +} \ 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 6e9eabd1f1..fa9aa920a1 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 @@ -1,7 +1,11 @@ package com.tangem.tap.network.auth.di +import com.tangem.datasource.config.ConfigManager +import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.lib.auth.AuthProvider -import com.tangem.tap.network.auth.AuthProviderImpl +import com.tangem.lib.auth.ExpressAuthProvider +import com.tangem.tap.network.auth.DefaultAuthProvider +import com.tangem.tap.network.auth.DefaultExpressAuthProvider import com.tangem.tap.proxy.AppStateHolder import dagger.Module import dagger.Provides @@ -16,6 +20,18 @@ class AuthModule { @Provides @Singleton fun provideAuthProvider(appStateHolder: AppStateHolder): AuthProvider { - return AuthProviderImpl(appStateHolder) + return DefaultAuthProvider(appStateHolder) + } + + @Provides + @Singleton + fun provideExpressAuthProvider( + userWalletsStore: UserWalletsStore, + configManager: ConfigManager, + ): ExpressAuthProvider { + return DefaultExpressAuthProvider( + userWalletsStore = userWalletsStore, + configManager = configManager, + ) } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/express/ExpressApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/express/ExpressApi.kt index 8574c38d72..0ed82c76d9 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/express/ExpressApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/express/ExpressApi.kt @@ -6,7 +6,6 @@ import com.tangem.datasource.api.express.models.request.PairsRequestBody import com.tangem.datasource.api.express.models.response.* import retrofit2.http.Body import retrofit2.http.GET -import retrofit2.http.Header import retrofit2.http.POST import retrofit2.http.Query import java.math.BigDecimal @@ -17,14 +16,8 @@ import java.math.BigDecimal @Suppress("LongParameterList") interface ExpressApi { - // TODO move first three params to retrofit interceptor @POST("assets") - suspend fun getAssets( - @Header("api-key") apiKey: String, - @Header("user-id") userId: String, - @Header("session-id") sessionId: String, - @Body body: AssetsRequestBody, - ): ApiResponse> + suspend fun getAssets(@Body body: AssetsRequestBody): ApiResponse> @POST("pairs") suspend fun getPairs(@Body body: PairsRequestBody): ApiResponse> @@ -55,6 +48,6 @@ interface ExpressApi { @Query("toAddress") toAddress: String, ): ApiResponse - @GET("exchange-results") + @GET("exchange-result") suspend fun getExchangeResults(@Query("txId") txId: String): ApiResponse } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt b/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt index 6bf2505649..bded21d266 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/ConfigManagerImpl.kt @@ -106,6 +106,7 @@ internal class ConfigManagerImpl @Inject constructor() : ConfigManager { swapReferrerAccount = configValues.swapReferrerAccount, walletConnectProjectId = configValues.walletConnectProjectId, tangemComAuthorization = configValues.tangemComAuthorization, + tangemExpressApiKey = configValues.tangemExpressApiKey, ) } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/models/Config.kt b/core/datasource/src/main/java/com/tangem/datasource/config/models/Config.kt index 2980e22216..d1f3e0848f 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/models/Config.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/models/Config.kt @@ -19,4 +19,5 @@ data class Config( val swapReferrerAccount: SwapReferrerAccount? = null, val walletConnectProjectId: String = "", val tangemComAuthorization: String? = null, + val tangemExpressApiKey: String = "", ) \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt b/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt index 77d2c0808f..47210def4b 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/config/models/JsonModels.kt @@ -40,6 +40,7 @@ class ConfigValueModel( val tangemComAuthorization: String?, val chiaFireAcademyApiKey: String?, val chiaTangemApiKey: String?, + val tangemExpressApiKey: String, ) data class AppsFlyer( 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 f3e245e0d6..d8b4a287eb 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 @@ -3,12 +3,14 @@ package com.tangem.datasource.di import android.content.Context import com.squareup.moshi.Moshi import com.tangem.datasource.api.common.response.ApiResponseCallAdapterFactory +import com.tangem.datasource.api.express.ExpressApi import com.tangem.datasource.api.promotion.PromotionApi import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.utils.RequestHeader.* import com.tangem.datasource.utils.addHeaders import com.tangem.datasource.utils.addLoggers import com.tangem.lib.auth.AuthProvider +import com.tangem.lib.auth.ExpressAuthProvider import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -24,6 +26,27 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) class NetworkModule { + @Provides + @Singleton + fun provideExpressApi( + @NetworkMoshi moshi: Moshi, + @ApplicationContext context: Context, + expressAuthProvider: ExpressAuthProvider, + ): ExpressApi { + return Retrofit.Builder() + .addConverterFactory(MoshiConverterFactory.create(moshi)) + .addCallAdapterFactory(ApiResponseCallAdapterFactory.create()) + .baseUrl(DEV_EXPRESS_BASE_URL) + .client( + OkHttpClient.Builder() + .addHeaders(Express(expressAuthProvider)) + .addLoggers(context) + .build(), + ) + .build() + .create(ExpressApi::class.java) + } + @Provides @Singleton fun provideTangemTechApi(@NetworkMoshi moshi: Moshi, @ApplicationContext context: Context): TangemTechApi { @@ -74,6 +97,9 @@ class NetworkModule { } private companion object { + const val PROD_EXPRESS_BASE_URL = "https://express.tangem.com/v1/" + const val DEV_EXPRESS_BASE_URL = "[REDACTED_ENV_URL]" + const val PROD_TANGEM_TECH_BASE_URL = "https://api.tangem-tech.com/v1/" const val DEV_TANGEM_TECH_BASE_URL = "https://devapi.tangem-tech.com/v1/" 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 5e5067746f..6a5fde6a53 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,6 +1,7 @@ package com.tangem.datasource.utils import com.tangem.lib.auth.AuthProvider +import com.tangem.lib.auth.ExpressAuthProvider /** * Presentation of request header @@ -18,4 +19,10 @@ sealed class RequestHeader(vararg pairs: Pair String>) { "card_id" to { authProvider.getCardId() }, "card_public_key" to { authProvider.getCardPublicKey() }, ) + + class Express(expressAuthProvider: ExpressAuthProvider) : RequestHeader( + "api-key" to { expressAuthProvider.getApiKey() }, + "user-id" to { expressAuthProvider.getUserId() }, + "session-id" to { expressAuthProvider.getSessionId() }, + ) } \ No newline at end of file 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 new file mode 100644 index 0000000000..4388254787 --- /dev/null +++ b/libs/auth/src/main/java/com/tangem/lib/auth/ExpressAuthProvider.kt @@ -0,0 +1,10 @@ +package com.tangem.lib.auth + +interface ExpressAuthProvider { + + fun getApiKey(): String + + fun getUserId(): String + + fun getSessionId(): String +} \ No newline at end of file diff --git a/libs/auth/src/main/java/com/tangem/lib/auth/sessionId/ExpressSessionIdGenerator.kt b/libs/auth/src/main/java/com/tangem/lib/auth/sessionId/ExpressSessionIdGenerator.kt new file mode 100644 index 0000000000..be7270b4c7 --- /dev/null +++ b/libs/auth/src/main/java/com/tangem/lib/auth/sessionId/ExpressSessionIdGenerator.kt @@ -0,0 +1,6 @@ +package com.tangem.lib.auth.sessionId + +interface ExpressSessionIdGenerator { + + fun generateNewSessionId() +} \ No newline at end of file