Updated on 2026-08-14

This commit is contained in:
Tangem 2025-04-29 17:06:39 +05:00
parent 46385fa3f0
commit 3b6855578c
10 changed files with 37 additions and 41 deletions

View file

@ -32,7 +32,7 @@ data class OnrampDataJson(
val requestId: String,
@Json(name = "externalTxId")
val externalTxId: String,
val externalTxId: String?,
@Json(name = "externalTxUrl")
val externalTxUrl: String?,

View file

@ -21,7 +21,7 @@ data class OnrampStatusResponse(
val failReason: String?,
@Json(name = "externalTxId")
val externalTxId: String,
val externalTxId: String?,
@Json(name = "externalTxUrl")
val externalTxUrl: String?,

View file

@ -32,7 +32,7 @@ internal class DefaultOnrampTransactionRepository(
)?.map(transactionConverter::convert) ?: mutableSetOf()
val updated = stored.toMutableSet()
.addOrReplace(transaction) { it.externalTxId == transaction.externalTxId }
.addOrReplace(transaction) { it.txId == transaction.txId }
.map(transactionConverter::convertBack)
.toSet()
@ -44,12 +44,12 @@ internal class DefaultOnrampTransactionRepository(
}
}
override suspend fun getTransactionById(externalTxId: String): OnrampTransaction? = withContext(dispatchers.io) {
override suspend fun getTransactionById(txId: String): OnrampTransaction? = withContext(dispatchers.io) {
val stored = appPreferencesStore.getObjectSetSync<OnrampTransactionDTO>(
PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY,
).map(transactionConverter::convert)
stored.firstOrNull { it.externalTxId == externalTxId }
stored.firstOrNull { it.txId == txId }
}
override fun getTransactions(
@ -63,19 +63,16 @@ internal class DefaultOnrampTransactionRepository(
}.map(transactionConverter::convert)
}
override suspend fun updateTransactionStatus(
externalTxId: String,
externalTxUrl: String,
status: OnrampStatus.Status,
) = withContext(dispatchers.io) {
val updatedTx = getTransactionById(externalTxId)?.copy(
externalTxUrl = externalTxUrl,
status = status,
) ?: return@withContext
storeTransaction(updatedTx)
}
override suspend fun updateTransactionStatus(txId: String, externalTxUrl: String, status: OnrampStatus.Status) =
withContext(dispatchers.io) {
val updatedTx = getTransactionById(txId)?.copy(
externalTxUrl = externalTxUrl,
status = status,
) ?: return@withContext
storeTransaction(updatedTx)
}
override suspend fun removeTransaction(externalTxId: String) {
override suspend fun removeTransaction(txId: String) {
withContext(dispatchers.io) {
appPreferencesStore.editData { mutablePreferences ->
runCatching {
@ -83,7 +80,7 @@ internal class DefaultOnrampTransactionRepository(
PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY,
)?.toMutableSet()
stored?.removeIf { it.externalTxId == externalTxId }
stored?.removeIf { it.txId == txId }
mutablePreferences.setObjectSet<OnrampTransactionDTO>(
key = PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY,

View file

@ -6,7 +6,7 @@ data class OnrampStatus(
val payoutAddress: String,
val status: Status,
val failReason: String?,
val externalTxId: String,
val externalTxId: String?,
val externalTxUrl: String?,
val payoutHash: String?,
val createdAt: String,

View file

@ -11,11 +11,11 @@ class OnrampRemoveTransactionUseCase(
private val errorResolver: OnrampErrorResolver,
) {
suspend operator fun invoke(externalTxId: String?): Either<OnrampError, Unit> {
if (externalTxId == null) return OnrampError.DomainError("Transaction id not provided").left()
suspend operator fun invoke(txId: String?): Either<OnrampError, Unit> {
if (txId == null) return OnrampError.DomainError("Transaction id not provided").left()
return Either.catch {
onrampTransactionRepository.removeTransaction(externalTxId)
onrampTransactionRepository.removeTransaction(txId)
}.mapLeft(errorResolver::resolve)
}
}

View file

@ -10,12 +10,11 @@ class OnrampUpdateTransactionStatusUseCase(
private val errorResolver: OnrampErrorResolver,
) {
suspend operator fun invoke(externalTxId: String, externalTxUrl: String, status: OnrampStatus.Status) =
Either.catch {
onrampTransactionRepository.updateTransactionStatus(
externalTxId = externalTxId,
externalTxUrl = externalTxUrl,
status = status,
)
}.mapLeft(errorResolver::resolve)
suspend operator fun invoke(txId: String, externalTxUrl: String, status: OnrampStatus.Status) = Either.catch {
onrampTransactionRepository.updateTransactionStatus(
txId = txId,
externalTxUrl = externalTxUrl,
status = status,
)
}.mapLeft(errorResolver::resolve)
}

View file

@ -10,11 +10,11 @@ interface OnrampTransactionRepository {
suspend fun storeTransaction(transaction: OnrampTransaction)
suspend fun getTransactionById(externalTxId: String): OnrampTransaction?
suspend fun getTransactionById(txId: String): OnrampTransaction?
fun getTransactions(userWalletId: UserWalletId, cryptoCurrencyId: CryptoCurrency.ID): Flow<List<OnrampTransaction>>
suspend fun updateTransactionStatus(externalTxId: String, externalTxUrl: String, status: OnrampStatus.Status)
suspend fun updateTransactionStatus(txId: String, externalTxUrl: String, status: OnrampStatus.Status)
suspend fun removeTransaction(externalTxId: String)
suspend fun removeTransaction(txId: String)
}

View file

@ -74,7 +74,7 @@ internal class OnrampStatusFactory @AssistedInject constructor(
val selectedTx = bottomSheetConfig.value as? ExpressTransactionStateUM.OnrampUM ?: return
if (selectedTx.activeStatus.isAutoDisposable || isForceDispose) {
onrampRemoveTransactionUseCase(externalTxId = selectedTx.info.txExternalId)
onrampRemoveTransactionUseCase(txId = selectedTx.info.txId)
}
}
@ -97,14 +97,14 @@ internal class OnrampStatusFactory @AssistedInject constructor(
private suspend fun List<ExpressTransactionStateUM.OnrampUM>.clearHiddenTerminal() {
this.filter { it.activeStatus.isHidden && it.activeStatus.isTerminal }
.forEach { onrampRemoveTransactionUseCase(externalTxId = it.info.txExternalId) }
.forEach { onrampRemoveTransactionUseCase(txId = it.info.txId) }
}
private suspend fun sendStatusUpdateAnalytics(
onrampTx: ExpressTransactionStateUM.OnrampUM,
statusModel: OnrampStatus,
) {
val externalTxId = statusModel.externalTxId
val txId = statusModel.txId
val status = toAnalyticStatus(statusModel.status) ?: return
if (statusModel.status != onrampTx.activeStatus) {
@ -117,7 +117,7 @@ internal class OnrampStatusFactory @AssistedInject constructor(
),
)
onrampUpdateTransactionStatusUseCase(
externalTxId = externalTxId,
txId = txId,
externalTxUrl = statusModel.externalTxUrl.orEmpty(),
status = statusModel.status,
)

View file

@ -37,7 +37,7 @@ internal class OnrampStatusFactory @Inject constructor(
val selectedTx = bottomSheetConfig.value as? ExpressTransactionStateUM.OnrampUM ?: return
if (selectedTx.activeStatus.isAutoDisposable || forceDispose) {
onrampRemoveTransactionUseCase(externalTxId = selectedTx.info.txExternalId)
onrampRemoveTransactionUseCase(txId = selectedTx.info.txId)
}
}
@ -61,7 +61,7 @@ internal class OnrampStatusFactory @Inject constructor(
Timber.e("Couldn't update onramp status. $it")
},
ifRight = { statusModel ->
val externalTxId = statusModel.externalTxId
val txId = statusModel.txId
val status = toAnalyticStatus(statusModel.status) ?: return
if (statusModel.status != onrampTx.activeStatus) {
@ -74,7 +74,7 @@ internal class OnrampStatusFactory @Inject constructor(
),
)
onrampUpdateTransactionStatusUseCase(
externalTxId = externalTxId,
txId = txId,
externalTxUrl = statusModel.externalTxUrl.orEmpty(),
status = statusModel.status,
)

View file

@ -87,6 +87,6 @@ internal class SingleWalletExpressStatusesSubscriber(
private suspend fun List<OnrampTransaction>.clearHiddenTerminal() {
this.filter { it.status.isHidden && it.status.isTerminal }
.forEach { onrampRemoveTransactionUseCase(externalTxId = it.externalTxId) }
.forEach { onrampRemoveTransactionUseCase(txId = it.txId) }
}
}