Updated on 2026-08-14

This commit is contained in:
Tangem 2023-10-15 10:28:52 +08:00
parent c8006eddda
commit 9c52a130c4
25 changed files with 199 additions and 131 deletions

View file

@ -0,0 +1,16 @@
package com.tangem.domain.wallets.legacy
import arrow.core.raise.Raise
import arrow.core.raise.ensureNotNull
internal inline fun <Error> Raise<Error>.ensureUserWalletListManagerNotNull(
walletsStateHolder: WalletsStateHolder,
raise: (Throwable) -> Error,
): UserWalletsListManager {
return ensureNotNull(
value = walletsStateHolder.userWalletsListManager,
raise = {
raise(IllegalStateException("User wallets list manager not initialized"))
},
)
}

View file

@ -3,4 +3,6 @@ package com.tangem.domain.wallets.models
sealed interface DeleteWalletError {
object DataError : DeleteWalletError
object UnableToDelete : DeleteWalletError
}

View file

@ -2,10 +2,12 @@ package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.left
import arrow.core.raise.either
import arrow.core.right
import com.tangem.common.doOnFailure
import com.tangem.common.doOnSuccess
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.models.DeleteWalletError
import com.tangem.domain.wallets.models.UserWalletId
@ -19,13 +21,17 @@ import com.tangem.domain.wallets.models.UserWalletId
class DeleteWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
suspend operator fun invoke(userWalletId: UserWalletId): Either<DeleteWalletError, Unit> {
val userWalletsListManager = walletsStateHolder.userWalletsListManager
?: return DeleteWalletError.DataError.left()
return either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = { DeleteWalletError.DataError },
)
userWalletsListManager.delete(userWalletIds = listOf(userWalletId))
.doOnSuccess { return Unit.right() }
.doOnFailure { return DeleteWalletError.DataError.left() }
userWalletsListManager.delete(userWalletIds = listOf(userWalletId))
.doOnSuccess { return Unit.right() }
.doOnFailure { return DeleteWalletError.UnableToDelete.left() }
return Unit.right()
return Unit.right()
}
}
}

View file

@ -0,0 +1,34 @@
package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.raise.either
import arrow.core.raise.ensureNotNull
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.models.GetUserWalletError
import com.tangem.domain.wallets.models.UserWallet
/**
* Use case for getting selected wallet.
* Important! If all wallets is locked, use case returns a error.
*
* @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager'
*
[REDACTED_AUTHOR]
*/
class GetSelectedWalletSyncUseCase(private val walletsStateHolder: WalletsStateHolder) {
operator fun invoke(): Either<GetUserWalletError, UserWallet> {
return either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = GetUserWalletError::DataError,
)
ensureNotNull(
value = userWalletsListManager.selectedUserWalletSync,
raise = { GetUserWalletError.UserWalletNotFound },
)
}
}
}

View file

@ -2,14 +2,14 @@ package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.raise.either
import arrow.core.raise.ensureNotNull
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.models.GetUserWalletError
import com.tangem.domain.wallets.models.UserWallet
import kotlinx.coroutines.flow.Flow
/**
* Use case for getting selected wallet.
* Important! If all wallets is locked, use case returns a error.
* Use case for getting flow of selected wallet.
*
* @property walletsStateHolder state holder for getting static initialized 'userWalletsListManager'
*
@ -17,21 +17,14 @@ import com.tangem.domain.wallets.models.UserWallet
*/
class GetSelectedWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
operator fun invoke(): Either<GetUserWalletError, UserWallet> {
operator fun invoke(): Either<GetUserWalletError, Flow<UserWallet>> {
return either {
val userWalletsListManager = ensureNotNull(
value = walletsStateHolder.userWalletsListManager,
raise = {
val error = IllegalStateException("User wallets list manager not initialized")
GetUserWalletError.DataError(error)
},
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = GetUserWalletError::DataError,
)
ensureNotNull(
value = userWalletsListManager.selectedUserWalletSync,
raise = { GetUserWalletError.UserWalletNotFound },
)
userWalletsListManager.selectedUserWallet
}
}
}

View file

@ -4,6 +4,7 @@ import arrow.core.Either
import arrow.core.raise.either
import arrow.core.raise.ensureNotNull
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.models.GetUserWalletError
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
@ -12,13 +13,9 @@ import kotlinx.coroutines.flow.firstOrNull
class GetUserWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
suspend operator fun invoke(userWalletId: UserWalletId): Either<Any, UserWallet> = either {
val userWalletsListManager = ensureNotNull(
value = walletsStateHolder.userWalletsListManager,
raise = {
val error = IllegalStateException("User wallets list manager not initialized")
GetUserWalletError.DataError(error)
},
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = GetUserWalletError::DataError,
)
val userWallets = userWalletsListManager.userWallets.firstOrNull().orEmpty()

View file

@ -2,11 +2,13 @@ package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.left
import arrow.core.raise.either
import arrow.core.right
import com.tangem.common.doOnFailure
import com.tangem.common.doOnSuccess
import com.tangem.domain.wallets.legacy.UserWalletsListError
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.models.SaveWalletError
import com.tangem.domain.wallets.models.UserWallet
@ -20,18 +22,24 @@ import com.tangem.domain.wallets.models.UserWallet
class SaveWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
suspend operator fun invoke(userWallet: UserWallet, canOverride: Boolean = false): Either<SaveWalletError, Unit> {
val userWalletListManager = walletsStateHolder.userWalletsListManager
?: return SaveWalletError.DataError.left()
return either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = { SaveWalletError.DataError },
)
userWalletListManager.save(userWallet, canOverride)
.doOnSuccess { return Unit.right() }
.doOnFailure {
return when (it) {
is UserWalletsListError.WalletAlreadySaved -> SaveWalletError.WalletAlreadySaved(it.messageResId)
else -> SaveWalletError.DataError
}.left()
}
userWalletsListManager.save(userWallet, canOverride)
.doOnSuccess { return Unit.right() }
.doOnFailure {
return when (it) {
is UserWalletsListError.WalletAlreadySaved -> SaveWalletError.WalletAlreadySaved(
it.messageResId,
)
else -> SaveWalletError.DataError
}.left()
}
return Unit.right()
return Unit.right()
}
}
}

View file

@ -3,11 +3,11 @@ package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.left
import arrow.core.raise.either
import arrow.core.raise.ensureNotNull
import arrow.core.right
import com.tangem.common.doOnFailure
import com.tangem.common.doOnSuccess
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.models.SelectWalletError
import com.tangem.domain.wallets.models.UserWalletId
@ -22,8 +22,8 @@ class SelectWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
suspend operator fun invoke(userWalletId: UserWalletId): Either<SelectWalletError, Unit> {
return either {
val userWalletsListManager = ensureNotNull(
value = walletsStateHolder.userWalletsListManager,
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = { SelectWalletError.DataError },
)

View file

@ -2,10 +2,12 @@ package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.left
import arrow.core.raise.either
import arrow.core.right
import com.tangem.common.doOnFailure
import com.tangem.common.doOnSuccess
import com.tangem.domain.wallets.legacy.WalletsStateHolder
import com.tangem.domain.wallets.legacy.ensureUserWalletListManagerNotNull
import com.tangem.domain.wallets.models.UpdateWalletError
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
@ -23,13 +25,17 @@ class UpdateWalletUseCase(private val walletsStateHolder: WalletsStateHolder) {
userWalletId: UserWalletId,
update: suspend (UserWallet) -> UserWallet,
): Either<UpdateWalletError, UserWallet> {
val userWalletsListManager = walletsStateHolder.userWalletsListManager
?: return UpdateWalletError.DataError.left()
return either {
val userWalletsListManager = ensureUserWalletListManagerNotNull(
walletsStateHolder = walletsStateHolder,
raise = { UpdateWalletError.DataError },
)
userWalletsListManager.update(userWalletId, update)
.doOnSuccess { return it.right() }
.doOnFailure { return UpdateWalletError.DataError.left() }
userWalletsListManager.update(userWalletId, update)
.doOnSuccess { return it.right() }
.doOnFailure { return UpdateWalletError.DataError.left() }
return UpdateWalletError.DataError.left()
return UpdateWalletError.DataError.left()
}
}
}