Updated on 2026-08-14

This commit is contained in:
Tangem 2025-05-30 14:11:16 +03:00
parent 82dcb31881
commit a079caac11
5 changed files with 36 additions and 1 deletions

View file

@ -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<JWTResponse>
@POST("v1/auth/token/exchange")
suspend fun exchangeAccessToken(@Body request: ExchangeAccessTokenRequest): ApiResponse<JWTResponse>
// endregion
// region: activation

View file

@ -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,
)

View file

@ -122,6 +122,25 @@ internal class DefaultVisaAuthRepository @Inject constructor(
}
}
override suspend fun exchangeAccessToken(tokens: VisaAuthTokens): Either<VisaApiError, VisaAuthTokens> {
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 <T : Any> request(requestBlock: suspend () -> T): Either<VisaApiError, T> {
return runCatching {
Either.Right(requestBlock())

View file

@ -18,4 +18,6 @@ interface VisaAuthRepository {
suspend fun getAccessTokens(signedChallenge: VisaAuthSignedChallenge): Either<VisaApiError, VisaAuthTokens>
suspend fun refreshAccessTokens(refreshToken: VisaAuthTokens.RefreshToken): Either<VisaApiError, VisaAuthTokens>
suspend fun exchangeAccessToken(tokens: VisaAuthTokens): Either<VisaApiError, VisaAuthTokens>
}

View file

@ -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