From a079caac11eb1421845d5aff57c06761812e84fe Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 30 May 2025 14:11:16 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../datasource/api/visa/TangemVisaApi.kt | 4 ++++ .../request/ExchangeAccessTokenRequest.kt | 10 ++++++++++ .../data/visa/DefaultVisaAuthRepository.kt | 19 +++++++++++++++++++ .../visa/repository/VisaAuthRepository.kt | 2 ++ .../model/OnboardingVisaInProgressModel.kt | 2 +- 5 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ExchangeAccessTokenRequest.kt diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/visa/TangemVisaApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/TangemVisaApi.kt index 74f2e49b69..5b2755a78a 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/visa/TangemVisaApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/TangemVisaApi.kt @@ -4,6 +4,7 @@ import com.tangem.datasource.api.common.response.ApiResponse import com.tangem.datasource.api.visa.models.request.ActivationByCardWalletRequest import com.tangem.datasource.api.visa.models.request.ActivationByCustomerWalletRequest import com.tangem.datasource.api.visa.models.request.ActivationStatusRequest +import com.tangem.datasource.api.visa.models.request.ExchangeAccessTokenRequest import com.tangem.datasource.api.visa.models.request.GenerateNoneByCardIdRequest import com.tangem.datasource.api.visa.models.request.GenerateNoneByCardWalletRequest import com.tangem.datasource.api.visa.models.request.GetAccessTokenByCardIdRequest @@ -44,6 +45,9 @@ interface TangemVisaApi { @POST("v1/auth/token/refresh") suspend fun refreshCardWalletAccessToken(@Body request: RefreshTokenByCardWalletRequest): ApiResponse + @POST("v1/auth/token/exchange") + suspend fun exchangeAccessToken(@Body request: ExchangeAccessTokenRequest): ApiResponse + // endregion // region: activation diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ExchangeAccessTokenRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ExchangeAccessTokenRequest.kt new file mode 100644 index 0000000000..63b9fe43d8 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ExchangeAccessTokenRequest.kt @@ -0,0 +1,10 @@ +package com.tangem.datasource.api.visa.models.request + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class ExchangeAccessTokenRequest( + @Json(name = "access_token") val accessToken: String, + @Json(name = "refresh_token") val refreshToken: String, +) \ No newline at end of file diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaAuthRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaAuthRepository.kt index 91f736357e..a0b6429f32 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaAuthRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaAuthRepository.kt @@ -122,6 +122,25 @@ internal class DefaultVisaAuthRepository @Inject constructor( } } + override suspend fun exchangeAccessToken(tokens: VisaAuthTokens): Either { + return request { + visaAuthApi.exchangeAccessToken( + ExchangeAccessTokenRequest( + accessToken = tokens.accessToken, + refreshToken = tokens.refreshToken.value, + ), + ).getOrThrow() + }.map { response -> + VisaAuthTokens( + accessToken = response.result.accessToken, + refreshToken = VisaAuthTokens.RefreshToken( + value = response.result.refreshToken, + authType = VisaAuthTokens.RefreshToken.Type.CardWallet, + ), + ) + } + } + private suspend fun request(requestBlock: suspend () -> T): Either { return runCatching { Either.Right(requestBlock()) diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/visa/repository/VisaAuthRepository.kt b/domain/visa/src/main/kotlin/com/tangem/domain/visa/repository/VisaAuthRepository.kt index 09c6138066..256587dce1 100644 --- a/domain/visa/src/main/kotlin/com/tangem/domain/visa/repository/VisaAuthRepository.kt +++ b/domain/visa/src/main/kotlin/com/tangem/domain/visa/repository/VisaAuthRepository.kt @@ -18,4 +18,6 @@ interface VisaAuthRepository { suspend fun getAccessTokens(signedChallenge: VisaAuthSignedChallenge): Either suspend fun refreshAccessTokens(refreshToken: VisaAuthTokens.RefreshToken): Either + + suspend fun exchangeAccessToken(tokens: VisaAuthTokens): Either } \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/inprogress/model/OnboardingVisaInProgressModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/inprogress/model/OnboardingVisaInProgressModel.kt index 343731c83b..ed9706f20a 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/inprogress/model/OnboardingVisaInProgressModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/inprogress/model/OnboardingVisaInProgressModel.kt @@ -166,7 +166,7 @@ internal class OnboardingVisaInProgressModel @Inject constructor( val authTokens = visaAuthTokenStorage.get(params.scanResponse.card.cardId) ?: error("Auth tokens are not found. This should not happen.") - val newTokens = visaAuthRepository.refreshAccessTokens(authTokens.refreshToken) + val newTokens = visaAuthRepository.exchangeAccessToken(authTokens) .getOrElse { uiMessageSender.showErrorDialog(it) return