From 195ffd4391aa31532ef26abaa51d6a00b414a6ff Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 19 Dec 2025 20:31:57 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../api/common/response/ApiResponseError.kt | 48 +++++++++++++++++++ .../repository/TangemPayRequestPerformer.kt | 5 +- .../data/pay/util/TangemPayErrorConverter.kt | 1 + .../com/tangem/domain/visa/error/VisaError.kt | 1 + 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ApiResponseError.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ApiResponseError.kt index 8b818cff1b..9d8e0aa9c4 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ApiResponseError.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ApiResponseError.kt @@ -18,6 +18,54 @@ sealed class ApiResponseError : Exception() { val errorBody: String?, ) : ApiResponseError() { + fun isServerError(): Boolean = when (code) { + Code.OK, + Code.CREATED, + Code.ACCEPTED, + Code.NOT_MODIFIED, + Code.BAD_REQUEST, + Code.UNAUTHORIZED, + Code.PAYMENT_REQUIRED, + Code.FORBIDDEN, + Code.NOT_FOUND, + Code.METHOD_NOT_ALLOWED, + Code.NOT_ACCEPTABLE, + Code.PROXY_AUTHENTICATION_REQUIRED, + Code.REQUEST_TIMEOUT, + Code.CONFLICT, + Code.GONE, + Code.LENGTH_REQUIRED, + Code.PRECONDITION_FAILED, + Code.PAYLOAD_TOO_LARGE, + Code.URI_TOO_LONG, + Code.UNSUPPORTED_MEDIA_TYPE, + Code.RANGE_NOT_SATISFIABLE, + Code.EXPECTATION_FAILED, + Code.IM_A_TEAPOT, + Code.UNPROCESSABLE_ENTITY, + Code.LOCKED, + Code.FAILED_DEPENDENCY, + Code.TOO_EARLY, + Code.UPGRADE_REQUIRED, + Code.PRECONDITION_REQUIRED, + Code.TOO_MANY_REQUESTS, + Code.REQUEST_HEADER_FIELDS_TOO_LARGE, + Code.UNAVAILABLE_FOR_LEGAL_REASONS, + -> false + Code.INTERNAL_SERVER_ERROR, + Code.NOT_IMPLEMENTED, + Code.BAD_GATEWAY, + Code.SERVICE_UNAVAILABLE, + Code.GATEWAY_TIMEOUT, + Code.HTTP_VERSION_NOT_SUPPORTED, + Code.VARIANT_ALSO_NEGOTIATES, + Code.INSUFFICIENT_STORAGE, + Code.LOOP_DETECTED, + Code.NOT_EXTENDED, + Code.NETWORK_AUTHENTICATION_REQUIRED, + -> true + } + // TODO: extract Code from HttpException // region Error Codes enum class Code(val numericCode: Int) { diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt index 788aafe9d8..13229e7dc9 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt @@ -159,10 +159,11 @@ internal class TangemPayRequestPerformer @Inject constructor( refreshToken = response.refreshToken, refreshExpiresAt = response.refreshExpiresAt, ) + }.mapLeft { error -> + Timber.tag(TAG).e("Can not refresh auth tokens: $error") + if (error is VisaApiError.ServerUnavailable) error else VisaApiError.RefreshTokenExpired }.onRight { tokens -> tangemPayStorage.storeAuthTokens(customerWalletAddress = customerWalletAddress, tokens = tokens) - }.onLeft { - Timber.tag(TAG).e("Can not refresh auth tokens: $it") } } } \ No newline at end of file diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayErrorConverter.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayErrorConverter.kt index 8080f3b642..58659ca2ca 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayErrorConverter.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayErrorConverter.kt @@ -18,6 +18,7 @@ internal class TangemPayErrorConverter @Inject constructor( override fun convert(value: Throwable): VisaApiError { return if (value is ApiResponseError.HttpException) { + if (value.isServerError()) return VisaApiError.ServerUnavailable if (value.code == ApiResponseError.HttpException.Code.NOT_FOUND) return VisaApiError.NotPaeraCustomer if (value.code == ApiResponseError.HttpException.Code.UNAUTHORIZED) return VisaApiError.RefreshTokenExpired diff --git a/domain/visa/models/src/main/kotlin/com/tangem/domain/visa/error/VisaError.kt b/domain/visa/models/src/main/kotlin/com/tangem/domain/visa/error/VisaError.kt index 4321710d19..412045caff 100644 --- a/domain/visa/models/src/main/kotlin/com/tangem/domain/visa/error/VisaError.kt +++ b/domain/visa/models/src/main/kotlin/com/tangem/domain/visa/error/VisaError.kt @@ -65,6 +65,7 @@ sealed class VisaApiError( data object WithdrawalDataError : VisaApiError(104004003) data object SignWithdrawError : VisaApiError(104004004) data object WithdrawError : VisaApiError(104004005) + data object ServerUnavailable : VisaApiError(104004006) companion object { fun fromBackendError(backendErrorCode: Int): VisaApiError {