Updated on 2026-08-14

This commit is contained in:
Tangem 2026-01-22 21:22:36 +07:00
commit 8126bf44b8
79 changed files with 715 additions and 530 deletions

View file

@ -21,6 +21,7 @@ import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.util.UUID
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
import javax.inject.Singleton
@ -95,7 +96,7 @@ internal class TangemPayRequestPerformer @Inject constructor(
if (accessExpiresAt.isAfter(now)) {
tokens.right()
} else if (accessExpiresAt.isBefore(now) && refreshExpiresAt.isAfter(now)) {
refreshAuthTokens(userWalletId = userWalletId, refreshToken = tokens.refreshToken)
refreshAuthTokens(userWalletId = userWalletId, authTokens = tokens)
} else {
VisaApiError.RefreshTokenExpired.left()
}
@ -104,13 +105,15 @@ internal class TangemPayRequestPerformer @Inject constructor(
private suspend fun refreshAuthTokens(
userWalletId: UserWalletId,
refreshToken: String,
authTokens: TangemPayAuthTokens,
): Either<VisaApiError, TangemPayAuthTokens> {
val customerWalletAddress = getCustomerWalletAddress(userWalletId)
val idempotencyKey = requireNotNull(authTokens.idempotencyKey) { "Idempotency key is null" }
val apiResponse = tangemPayAuthApi.refreshCustomerWalletAccessToken(
idempotencyKey = idempotencyKey,
request = RefreshCustomerWalletAccessTokenRequest(
authType = "customer_wallet",
refreshToken = refreshToken,
refreshToken = authTokens.refreshToken,
),
)
val responseEither = when (apiResponse) {
@ -123,6 +126,7 @@ internal class TangemPayRequestPerformer @Inject constructor(
expiresAt = response.expiresAt,
refreshToken = response.refreshToken,
refreshExpiresAt = response.refreshExpiresAt,
idempotencyKey = UUID.randomUUID().toString(),
)
}.mapLeft { error ->
Timber.tag(TAG).e("Can not refresh auth tokens: $error")

View file

@ -17,6 +17,7 @@ import com.tangem.domain.visa.model.VisaAuthChallenge
import com.tangem.domain.visa.model.VisaAuthSession
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.withContext
import java.util.UUID
import javax.inject.Inject
internal class DefaultTangemPayRemoteDataSource @Inject constructor(
@ -66,6 +67,7 @@ internal class DefaultTangemPayRemoteDataSource @Inject constructor(
expiresAt = response.expiresAt,
refreshToken = response.refreshToken,
refreshExpiresAt = response.refreshExpiresAt,
idempotencyKey = UUID.randomUUID().toString(),
)
}
}