Updated on 2026-08-14

This commit is contained in:
Tangem 2024-11-26 10:37:53 +05:00
parent 94af682f08
commit a284c8d311
13 changed files with 236 additions and 29 deletions

View file

@ -5,6 +5,7 @@ import com.tangem.data.onramp.converters.CountryConverter
import com.tangem.data.onramp.converters.CurrencyConverter
import com.tangem.data.onramp.converters.PaymentMethodConverter
import com.tangem.data.onramp.converters.StatusConverter
import com.tangem.data.onramp.converters.error.OnrampQuoteErrorInput
import com.tangem.data.onramp.converters.error.OnrampQuotesErrorConverter
import com.tangem.datasource.api.common.response.ApiResponseError
import com.tangem.datasource.api.common.response.getOrThrow
@ -192,18 +193,26 @@ internal class DefaultOnrampRepository(
toDecimals = cryptoCurrency.decimals,
providerId = provider.id,
).bind()
OnrampQuote.Content(
OnrampQuote.Data(
fromAmount = convertToBigDecimal(response.fromAmount),
toAmount = convertToBigDecimal(response.toAmount),
minFromAmount = convertToBigDecimal(response.minFromAmount),
maxFromAmount = convertToBigDecimal(response.maxFromAmount),
paymentMethodId = response.paymentMethod,
providerId = response.providerId,
paymentMethod = paymentMethod,
provider = provider,
)
null
},
onError = { error ->
if (error is ApiResponseError.HttpException) {
quotesErrorConverter.convert(error.errorBody.orEmpty() to amount)
quotesErrorConverter.convert(
OnrampQuoteErrorInput(
errorBody = error.errorBody.orEmpty(),
amount = amount,
paymentMethod = paymentMethod,
provider = provider,
),
)
} else {
Timber.w(error, "Unable to fetch onramp quotes for ${provider.id}. $error")
null

View file

@ -0,0 +1,12 @@
package com.tangem.data.onramp.converters.error
import com.tangem.domain.onramp.model.OnrampPaymentMethod
import com.tangem.domain.onramp.model.OnrampProvider
import com.tangem.domain.tokens.model.Amount
data class OnrampQuoteErrorInput(
val errorBody: String,
val amount: Amount,
val paymentMethod: OnrampPaymentMethod,
val provider: OnrampProvider,
)

View file

@ -10,16 +10,15 @@ import com.tangem.utils.converter.Converter
internal class OnrampQuotesErrorConverter(
private val jsonAdapter: JsonAdapter<ExpressErrorResponse>,
) : Converter<Pair<String, Amount>, OnrampQuote.Error?> {
) : Converter<OnrampQuoteErrorInput, OnrampQuote.Error?> {
@Suppress("MagicNumber")
override fun convert(value: Pair<String, Amount>): OnrampQuote.Error? {
val (errorResponse, amount) = value
override fun convert(value: OnrampQuoteErrorInput): OnrampQuote.Error? {
try {
val error = jsonAdapter.fromJson(errorResponse)?.error ?: return null
val error = jsonAdapter.fromJson(value.errorBody)?.error ?: return null
return when (error.code) {
2250 -> tryParseExchangeTooSmallAmountError(error = error, amount = amount)
2251 -> tryParseExchangeTooBigAmountError(error = error, amount = amount)
2250 -> tryParseExchangeTooSmallAmountError(error = error, input = value)
2251 -> tryParseExchangeTooBigAmountError(error = error, input = value)
else -> null
}
} catch (e: Exception) {
@ -29,34 +28,38 @@ internal class OnrampQuotesErrorConverter(
private fun tryParseExchangeTooSmallAmountError(
error: ExpressError,
amount: Amount,
input: OnrampQuoteErrorInput,
): OnrampQuote.Error.AmountTooSmallError? {
val minAmount = error.value?.minAmount ?: return null
val decimals = error.value?.decimals ?: return null
return OnrampQuote.Error.AmountTooSmallError(
paymentMethod = input.paymentMethod,
provider = input.provider,
amount = createFromAmountWithOffset(
amountWithOffset = minAmount,
decimals = decimals,
symbol = amount.currencySymbol,
type = amount.type,
symbol = input.amount.currencySymbol,
type = input.amount.type,
),
)
}
private fun tryParseExchangeTooBigAmountError(
error: ExpressError,
amount: Amount,
input: OnrampQuoteErrorInput,
): OnrampQuote.Error.AmountTooBigError? {
val maxAmount = error.value?.maxAmount ?: return null
val decimals = error.value?.decimals ?: return null
return OnrampQuote.Error.AmountTooBigError(
paymentMethod = input.paymentMethod,
provider = input.provider,
amount = createFromAmountWithOffset(
amountWithOffset = maxAmount,
decimals = decimals,
symbol = amount.currencySymbol,
type = amount.type,
symbol = input.amount.currencySymbol,
type = input.amount.type,
),
)
}