From 78497e41a8edab1e567325b8f4c1a4ad383462c2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 28 Nov 2023 23:00:19 +0200 Subject: [PATCH 1/3] Updated on 2026-08-14 --- .../api/common/response/ApiResponseError.kt | 6 ++- .../api/common/response/ResponseExt.kt | 2 +- .../models/response/ExpressErrorResponse.kt | 38 ++++++++++++++ .../tangem/feature/swap/SwapRepositoryImpl.kt | 17 +++++-- .../swap/converters/ErrorsDataConverter.kt | 50 +++++++++++++++++++ .../tangem/feature/swap/di/SwapDataModule.kt | 20 +++++++- .../feature/swap/domain/models/DataError.kt | 38 +++++++++++--- .../models/data/AggregatedSwapDataModel.kt | 2 +- .../tangem/feature/swap/ui/StateBuilder.kt | 2 +- 9 files changed, 159 insertions(+), 16 deletions(-) create mode 100644 core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/ExpressErrorResponse.kt create mode 100644 features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt 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 5e88155058..e54744c876 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 @@ -12,7 +12,11 @@ sealed class ApiResponseError : Exception() { * @property code The HTTP status code. * @property message A human-readable message describing the error. */ - data class HttpException(val code: Code, override val message: String?) : ApiResponseError() { + data class HttpException( + val code: Code, + override val message: String?, + val errorBody: String? + ) : ApiResponseError() { // region Error Codes enum class Code(val code: Int) { diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ResponseExt.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ResponseExt.kt index 0ddb0ffa36..718392b0d9 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ResponseExt.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/response/ResponseExt.kt @@ -16,7 +16,7 @@ internal fun Response.toSafeApiResponse(): ApiResponse { val e = if (code == null) { ApiResponseError.UnknownException(IllegalArgumentException("Unknown error status code: ${code()}")) } else { - ApiResponseError.HttpException(code, message()) + ApiResponseError.HttpException(code, message(), errorBody()?.string()) } apiError(e) diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/ExpressErrorResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/ExpressErrorResponse.kt new file mode 100644 index 0000000000..e6adcd593b --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/ExpressErrorResponse.kt @@ -0,0 +1,38 @@ +package com.tangem.datasource.api.express.models.response + +import com.squareup.moshi.Json +import java.math.BigDecimal +import java.math.BigInteger + +data class ExpressErrorResponse( + @Json(name = "error") + val error: ExpressError, +) + +data class ExpressError( + @Json(name = "code") + val code: Int, + + @Json(name = "description") + val description: String?, + + @Json(name = "value") + val value: ExpressErrorValue?, +) + +data class ExpressErrorValue( + @Json(name = "minAmount") + val minAmount: BigDecimal?, + + @Json(name = "decimals") + val decimals: Int?, + + @Json(name = "currentAllowance") + val currentAllowance: BigDecimal?, + + @Json(name = "receivedFromDecimals") + val receivedFromDecimals: Int?, + + @Json(name = "expressFromDecimals") + val expressFromDecimals: Int?, +) \ No newline at end of file diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt index 43010d791d..8c53c20831 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt @@ -1,11 +1,13 @@ package com.tangem.feature.swap +import com.squareup.moshi.Moshi import com.tangem.blockchain.common.Amount import com.tangem.blockchain.common.Approver import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.Token import com.tangem.blockchain.extensions.Result import com.tangem.data.tokens.utils.CryptoCurrencyFactory +import com.tangem.datasource.api.common.response.ApiResponseError import com.tangem.datasource.api.common.response.getOrThrow import com.tangem.datasource.api.express.TangemExpressApi import com.tangem.datasource.api.express.models.request.PairsRequestBody @@ -23,10 +25,10 @@ import com.tangem.domain.wallets.legacy.WalletsStateHolder import com.tangem.domain.wallets.models.UserWalletId import com.tangem.feature.swap.converters.* import com.tangem.feature.swap.domain.SwapRepository +import com.tangem.feature.swap.domain.models.DataError import com.tangem.feature.swap.domain.models.createFromAmountWithOffset import com.tangem.feature.swap.domain.models.data.AggregatedSwapDataModel import com.tangem.feature.swap.domain.models.domain.* -import com.tangem.feature.swap.domain.models.mapErrors import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.async import kotlinx.coroutines.withContext @@ -43,6 +45,7 @@ internal class SwapRepositoryImpl @Inject constructor( private val configManager: ConfigManager, private val walletManagersFacade: WalletManagersFacade, private val walletsStateHolder: WalletsStateHolder, + private val errorsDataConverter: ErrorsDataConverter, ) : SwapRepository { private val tokensConverter = TokensConverter() @@ -165,7 +168,7 @@ internal class SwapRepositoryImpl @Inject constructor( ), ) } catch (ex: Exception) { - AggregatedSwapDataModel(null, mapErrors(ex.message)) + AggregatedSwapDataModel(null, getDataError(ex)) } } } @@ -204,7 +207,7 @@ internal class SwapRepositoryImpl @Inject constructor( dataModel = expressDataConverter.convert(response), ) } catch (ex: Exception) { - AggregatedSwapDataModel(null, mapErrors(ex.message)) + AggregatedSwapDataModel(null, getDataError(ex)) } } } @@ -301,6 +304,14 @@ internal class SwapRepositoryImpl @Inject constructor( ) } + private fun getDataError(ex: Exception) : DataError { + return if (ex is ApiResponseError.HttpException) { + errorsDataConverter.convert(ex.errorBody ?: "") + } else { + DataError.UnknownError() + } + } + companion object { // TODO("get this ids from blockchain enum later") private const val OPTIMISM_ID = "optimistic-ethereum" diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt new file mode 100644 index 0000000000..c1ff51fd25 --- /dev/null +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt @@ -0,0 +1,50 @@ +package com.tangem.feature.swap.converters + +import com.squareup.moshi.JsonAdapter +import com.tangem.datasource.api.express.models.response.ExpressErrorResponse +import com.tangem.feature.swap.domain.models.DataError +import com.tangem.feature.swap.domain.models.SwapAmount +import com.tangem.utils.converter.Converter + +internal class ErrorsDataConverter( + private val jsonAdapter: JsonAdapter, +) : Converter { + + override fun convert(errorBody: String): DataError { + try { + val errorResponse = jsonAdapter.fromJson(errorBody) + + val error = errorResponse?.error ?: return DataError.UnknownError() + + val dataError = when (error.code) { + 2010 -> DataError.BadRequest(code = error.code) + 2210 -> DataError.ExchangeProviderNotFoundError(code = error.code) + 2220 -> DataError.ExchangeProviderNotActiveError(code = error.code) + 2230 -> DataError.ExchangeProviderNotAvailableError(code = error.code) + 2240 -> DataError.ExchangeNotPossibleError(code = error.code) + 2250 -> DataError.ExchangeTooSmallAmountError( + code = error.code, + amount = SwapAmount( + requireNotNull(error.value?.minAmount), + requireNotNull(error.value?.decimals) + ) + ) + 2260 -> DataError.ExchangeNotEnoughAllowanceError( + code = error.code, + currentAllowance = requireNotNull(error.value?.currentAllowance) + ) + 2270 -> DataError.ExchangeNotEnoughBalanceError(code = error.code) + 2280 -> DataError.ExchangeInvalidAddressError(code = error.code) + 2290 -> DataError.ExchangeInvalidFromDecimalsError(code = error.code, + receivedFromDecimals = requireNotNull(error.value?.receivedFromDecimals), + expressFromDecimals = requireNotNull(error.value?.expressFromDecimals) + ) + else -> DataError.UnknownError() + } + + return dataError + } catch (e: Exception) { + return DataError.UnknownError() + } + } +} \ No newline at end of file diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt index 261dcbb069..b52fd9d560 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt @@ -1,12 +1,17 @@ package com.tangem.feature.swap.di +import com.squareup.moshi.Moshi import com.tangem.datasource.api.express.TangemExpressApi +import com.tangem.datasource.api.express.models.response.ExpressErrorResponse import com.tangem.datasource.api.oneinch.OneInchApiFactory import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.config.ConfigManager +import com.tangem.datasource.di.NetworkMoshi import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.legacy.WalletsStateHolder import com.tangem.feature.swap.SwapRepositoryImpl +import com.tangem.feature.swap.converters.ErrorsDataConverter +import com.tangem.feature.swap.converters.ExpressDataConverter import com.tangem.feature.swap.domain.SwapRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module @@ -17,11 +22,11 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -class SwapDataModule { +internal class SwapDataModule { @Provides @Singleton - fun provideSwapRepository( + internal fun provideSwapRepository( tangemTechApi: TangemTechApi, tangemExpressApi: TangemExpressApi, oneInchApiFactory: OneInchApiFactory, @@ -29,6 +34,7 @@ class SwapDataModule { configManager: ConfigManager, walletManagerFacade: WalletManagersFacade, walletsStateHolder: WalletsStateHolder, + errorsDataConverter: ErrorsDataConverter, ): SwapRepository { return SwapRepositoryImpl( tangemTechApi = tangemTechApi, @@ -38,6 +44,16 @@ class SwapDataModule { configManager = configManager, walletManagersFacade = walletManagerFacade, walletsStateHolder = walletsStateHolder, + errorsDataConverter = errorsDataConverter, ) } + + @Provides + @Singleton + internal fun provideErrorsConverter( + @NetworkMoshi moshi: Moshi + ) : ErrorsDataConverter { + val jsonAdapter = moshi.adapter(ExpressErrorResponse::class.java) + return ErrorsDataConverter(jsonAdapter) + } } \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt index a00be2a2bc..accf6dd7d1 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt @@ -1,10 +1,34 @@ package com.tangem.feature.swap.domain.models -sealed class DataError { - object UnknownError : DataError() - data class Error(val message: String) : DataError() -} +import java.math.BigDecimal -fun mapErrors(error: String?): DataError { - return error?.let { DataError.Error(it) } ?: DataError.UnknownError -} \ No newline at end of file +sealed class DataError { + + abstract val code: Int + + data class BadRequest(override val code: Int) : DataError() + + data class ExchangeProviderNotFoundError(override val code: Int): DataError() + + data class ExchangeProviderNotActiveError(override val code: Int): DataError() + + data class ExchangeProviderNotAvailableError(override val code: Int): DataError() + + data class ExchangeNotPossibleError(override val code: Int): DataError() + + data class ExchangeTooSmallAmountError(override val code: Int, val amount: SwapAmount): DataError() + + data class ExchangeNotEnoughAllowanceError(override val code: Int, val currentAllowance: BigDecimal): DataError() + + data class ExchangeNotEnoughBalanceError(override val code: Int): DataError() + + data class ExchangeInvalidAddressError(override val code: Int): DataError() + + data class ExchangeInvalidFromDecimalsError( + override val code: Int, + val receivedFromDecimals: Int, + val expressFromDecimals: Int + ): DataError() + + data class UnknownError(override val code: Int = -1): DataError() +} diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/data/AggregatedSwapDataModel.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/data/AggregatedSwapDataModel.kt index 45a895181e..9f83feedf4 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/data/AggregatedSwapDataModel.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/data/AggregatedSwapDataModel.kt @@ -11,5 +11,5 @@ import com.tangem.feature.swap.domain.models.DataError */ data class AggregatedSwapDataModel( val dataModel: T?, - val error: DataError = DataError.UnknownError, + val error: DataError = DataError.UnknownError(), ) \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index 054e89a4bc..8dc00151bb 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -502,7 +502,7 @@ internal class StateBuilder( // todo use if needed later // DataError.InsufficientLiquidity -> TODO() // DataError.NoError -> TODO() - is DataError.Error -> addWarning(uiState, error.message, true, onClick) + is DataError.ExchangeTooSmallAmountError -> addWarning(uiState, error.amount.toString(), true, onClick) else -> addWarning(uiState, null, false) {} } } From 474cd508205dd5bc635c5962b01f4619ad02fbca Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 28 Nov 2023 23:01:32 +0200 Subject: [PATCH 2/3] Updated on 2026-08-14 --- .../api/common/response/ApiResponseError.kt | 2 +- .../models/response/ExpressErrorResponse.kt | 1 - .../tangem/feature/swap/SwapRepositoryImpl.kt | 3 +-- .../swap/converters/ErrorsDataConverter.kt | 12 ++++++---- .../tangem/feature/swap/di/SwapDataModule.kt | 5 +--- .../swap/domain/di/SwapDomainModule.kt | 1 - .../feature/swap/domain/models/DataError.kt | 24 +++++++++---------- 7 files changed, 22 insertions(+), 26 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 e54744c876..e342289f0c 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 @@ -15,7 +15,7 @@ sealed class ApiResponseError : Exception() { data class HttpException( val code: Code, override val message: String?, - val errorBody: String? + val errorBody: String?, ) : ApiResponseError() { // region Error Codes diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/ExpressErrorResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/ExpressErrorResponse.kt index e6adcd593b..c0c39b0fb2 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/ExpressErrorResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/express/models/response/ExpressErrorResponse.kt @@ -2,7 +2,6 @@ package com.tangem.datasource.api.express.models.response import com.squareup.moshi.Json import java.math.BigDecimal -import java.math.BigInteger data class ExpressErrorResponse( @Json(name = "error") diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt index 8c53c20831..f4e943542b 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt @@ -1,6 +1,5 @@ package com.tangem.feature.swap -import com.squareup.moshi.Moshi import com.tangem.blockchain.common.Amount import com.tangem.blockchain.common.Approver import com.tangem.blockchain.common.Blockchain @@ -304,7 +303,7 @@ internal class SwapRepositoryImpl @Inject constructor( ) } - private fun getDataError(ex: Exception) : DataError { + private fun getDataError(ex: Exception): DataError { return if (ex is ApiResponseError.HttpException) { errorsDataConverter.convert(ex.errorBody ?: "") } else { diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt index c1ff51fd25..db420a4033 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt @@ -10,6 +10,7 @@ internal class ErrorsDataConverter( private val jsonAdapter: JsonAdapter, ) : Converter { + @Suppress("MagicNumber") override fun convert(errorBody: String): DataError { try { val errorResponse = jsonAdapter.fromJson(errorBody) @@ -26,18 +27,19 @@ internal class ErrorsDataConverter( code = error.code, amount = SwapAmount( requireNotNull(error.value?.minAmount), - requireNotNull(error.value?.decimals) - ) + requireNotNull(error.value?.decimals), + ), ) 2260 -> DataError.ExchangeNotEnoughAllowanceError( code = error.code, - currentAllowance = requireNotNull(error.value?.currentAllowance) + currentAllowance = requireNotNull(error.value?.currentAllowance), ) 2270 -> DataError.ExchangeNotEnoughBalanceError(code = error.code) 2280 -> DataError.ExchangeInvalidAddressError(code = error.code) - 2290 -> DataError.ExchangeInvalidFromDecimalsError(code = error.code, + 2290 -> DataError.ExchangeInvalidFromDecimalsError( + code = error.code, receivedFromDecimals = requireNotNull(error.value?.receivedFromDecimals), - expressFromDecimals = requireNotNull(error.value?.expressFromDecimals) + expressFromDecimals = requireNotNull(error.value?.expressFromDecimals), ) else -> DataError.UnknownError() } diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt index b52fd9d560..4c34db7b17 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt @@ -11,7 +11,6 @@ import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.legacy.WalletsStateHolder import com.tangem.feature.swap.SwapRepositoryImpl import com.tangem.feature.swap.converters.ErrorsDataConverter -import com.tangem.feature.swap.converters.ExpressDataConverter import com.tangem.feature.swap.domain.SwapRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module @@ -50,9 +49,7 @@ internal class SwapDataModule { @Provides @Singleton - internal fun provideErrorsConverter( - @NetworkMoshi moshi: Moshi - ) : ErrorsDataConverter { + internal fun provideErrorsConverter(@NetworkMoshi moshi: Moshi): ErrorsDataConverter { val jsonAdapter = moshi.adapter(ExpressErrorResponse::class.java) return ErrorsDataConverter(jsonAdapter) } diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt index 734efb5f0d..dd81f44d66 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/di/SwapDomainModule.kt @@ -14,7 +14,6 @@ import com.tangem.domain.wallets.legacy.WalletsStateHolder import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase import com.tangem.feature.swap.domain.* import com.tangem.feature.swap.domain.cache.SwapDataCacheImpl -import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles import com.tangem.lib.crypto.TransactionManager import com.tangem.lib.crypto.UserWalletManager import com.tangem.utils.coroutines.CoroutineDispatcherProvider diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt index accf6dd7d1..8ea211009c 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt @@ -8,27 +8,27 @@ sealed class DataError { data class BadRequest(override val code: Int) : DataError() - data class ExchangeProviderNotFoundError(override val code: Int): DataError() + data class ExchangeProviderNotFoundError(override val code: Int) : DataError() - data class ExchangeProviderNotActiveError(override val code: Int): DataError() + data class ExchangeProviderNotActiveError(override val code: Int) : DataError() - data class ExchangeProviderNotAvailableError(override val code: Int): DataError() + data class ExchangeProviderNotAvailableError(override val code: Int) : DataError() - data class ExchangeNotPossibleError(override val code: Int): DataError() + data class ExchangeNotPossibleError(override val code: Int) : DataError() - data class ExchangeTooSmallAmountError(override val code: Int, val amount: SwapAmount): DataError() + data class ExchangeTooSmallAmountError(override val code: Int, val amount: SwapAmount) : DataError() - data class ExchangeNotEnoughAllowanceError(override val code: Int, val currentAllowance: BigDecimal): DataError() + data class ExchangeNotEnoughAllowanceError(override val code: Int, val currentAllowance: BigDecimal) : DataError() - data class ExchangeNotEnoughBalanceError(override val code: Int): DataError() + data class ExchangeNotEnoughBalanceError(override val code: Int) : DataError() - data class ExchangeInvalidAddressError(override val code: Int): DataError() + data class ExchangeInvalidAddressError(override val code: Int) : DataError() data class ExchangeInvalidFromDecimalsError( override val code: Int, val receivedFromDecimals: Int, - val expressFromDecimals: Int - ): DataError() + val expressFromDecimals: Int, + ) : DataError() - data class UnknownError(override val code: Int = -1): DataError() -} + data class UnknownError(override val code: Int = -1) : DataError() +} \ No newline at end of file From 0f536155181f7befd8e94c6e1fce4eb29a198694 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 28 Nov 2023 23:05:42 +0200 Subject: [PATCH 3/3] Updated on 2026-08-14 --- .../com/tangem/feature/swap/SwapRepositoryImpl.kt | 2 +- .../feature/swap/converters/ErrorsDataConverter.kt | 14 +++++--------- .../tangem/feature/swap/domain/models/DataError.kt | 4 +++- .../domain/models/data/AggregatedSwapDataModel.kt | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt index f4e943542b..9ea783fc6b 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt @@ -307,7 +307,7 @@ internal class SwapRepositoryImpl @Inject constructor( return if (ex is ApiResponseError.HttpException) { errorsDataConverter.convert(ex.errorBody ?: "") } else { - DataError.UnknownError() + DataError.UnknownError } } diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt index db420a4033..5330219b1e 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/ErrorsDataConverter.kt @@ -11,13 +11,11 @@ internal class ErrorsDataConverter( ) : Converter { @Suppress("MagicNumber") - override fun convert(errorBody: String): DataError { + override fun convert(value: String): DataError { try { - val errorResponse = jsonAdapter.fromJson(errorBody) + val error = jsonAdapter.fromJson(value)?.error ?: return DataError.UnknownError - val error = errorResponse?.error ?: return DataError.UnknownError() - - val dataError = when (error.code) { + return when (error.code) { 2010 -> DataError.BadRequest(code = error.code) 2210 -> DataError.ExchangeProviderNotFoundError(code = error.code) 2220 -> DataError.ExchangeProviderNotActiveError(code = error.code) @@ -41,12 +39,10 @@ internal class ErrorsDataConverter( receivedFromDecimals = requireNotNull(error.value?.receivedFromDecimals), expressFromDecimals = requireNotNull(error.value?.expressFromDecimals), ) - else -> DataError.UnknownError() + else -> DataError.UnknownError } - - return dataError } catch (e: Exception) { - return DataError.UnknownError() + return DataError.UnknownError } } } \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt index 8ea211009c..2c3a3e6af6 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/DataError.kt @@ -30,5 +30,7 @@ sealed class DataError { val expressFromDecimals: Int, ) : DataError() - data class UnknownError(override val code: Int = -1) : DataError() + object UnknownError : DataError() { + override val code: Int = -1 + } } \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/data/AggregatedSwapDataModel.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/data/AggregatedSwapDataModel.kt index 9f83feedf4..45a895181e 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/data/AggregatedSwapDataModel.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/data/AggregatedSwapDataModel.kt @@ -11,5 +11,5 @@ import com.tangem.feature.swap.domain.models.DataError */ data class AggregatedSwapDataModel( val dataModel: T?, - val error: DataError = DataError.UnknownError(), + val error: DataError = DataError.UnknownError, ) \ No newline at end of file