Updated on 2026-08-14
This commit is contained in:
parent
709bbdbe43
commit
a52c9cb106
6 changed files with 193 additions and 0 deletions
|
|
@ -80,6 +80,7 @@ configurations.androidTestImplementation {
|
|||
dependencies {
|
||||
implementation(projects.domain.legacy)
|
||||
implementation(projects.libs.blockchainSdk)
|
||||
implementation(projects.domain.account)
|
||||
implementation(projects.domain.models)
|
||||
implementation(projects.domain.core)
|
||||
implementation(projects.domain.card)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
package com.tangem.tap.di.domain
|
||||
|
||||
import com.tangem.domain.account.usecase.AddCryptoPortfolioUseCase
|
||||
import com.tangem.domain.account.usecase.ArchiveCryptoPortfolioUseCase
|
||||
import com.tangem.domain.account.usecase.RecoverCryptoPortfolioUseCase
|
||||
import com.tangem.domain.account.usecase.UpdateCryptoPortfolioUseCase
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
internal object AccountDomainModule {
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideAddCryptoPortfolioUseCase(): AddCryptoPortfolioUseCase {
|
||||
return AddCryptoPortfolioUseCase()
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideUpdateCryptoPortfolioUseCase(): UpdateCryptoPortfolioUseCase {
|
||||
return UpdateCryptoPortfolioUseCase()
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideArchiveCryptoPortfolioUseCase(): ArchiveCryptoPortfolioUseCase {
|
||||
return ArchiveCryptoPortfolioUseCase()
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideRecoverCryptoPortfolioUseCase(): RecoverCryptoPortfolioUseCase {
|
||||
return RecoverCryptoPortfolioUseCase()
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
package com.tangem.domain.account.usecase
|
||||
|
||||
import arrow.core.Either
|
||||
import arrow.core.raise.either
|
||||
import com.tangem.domain.account.models.AccountList
|
||||
import com.tangem.domain.account.usecase.AddCryptoPortfolioUseCase.Error.AccountCreation
|
||||
import com.tangem.domain.models.TokensGroupType
|
||||
import com.tangem.domain.models.TokensSortType
|
||||
import com.tangem.domain.models.account.Account
|
||||
import com.tangem.domain.models.account.AccountId
|
||||
import com.tangem.domain.models.account.AccountName
|
||||
import com.tangem.domain.models.account.CryptoPortfolioIcon
|
||||
import com.tangem.domain.models.wallet.UserWalletId
|
||||
import java.util.UUID
|
||||
|
||||
/**
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
class AddCryptoPortfolioUseCase {
|
||||
|
||||
suspend operator fun invoke(
|
||||
userWalletId: UserWalletId,
|
||||
accountName: AccountName,
|
||||
icon: CryptoPortfolioIcon,
|
||||
derivationIndex: Int,
|
||||
): Either<Error, Account.CryptoPortfolio> = either {
|
||||
Account.CryptoPortfolio(
|
||||
accountId = AccountId(userWalletId = userWalletId, value = UUID.randomUUID().toString()),
|
||||
name = accountName.value,
|
||||
accountIcon = icon,
|
||||
derivationIndex = derivationIndex,
|
||||
isArchived = false,
|
||||
cryptoCurrencyList = Account.CryptoPortfolio.CryptoCurrencyList(
|
||||
currencies = emptySet(),
|
||||
sortType = TokensSortType.NONE,
|
||||
groupType = TokensGroupType.NONE,
|
||||
),
|
||||
)
|
||||
.mapLeft(::AccountCreation)
|
||||
.bind()
|
||||
|
||||
// TODO: [REDACTED_JIRA]
|
||||
// Save to local store
|
||||
// Save to backend (tokens migration) – asynchronously
|
||||
}
|
||||
|
||||
sealed interface Error {
|
||||
|
||||
data class AccountCreation(val cause: Account.CryptoPortfolio.Error) : Error
|
||||
|
||||
data class AccountListRequirementsNotMet(val cause: AccountList.Error) : Error
|
||||
|
||||
data object DataOperationFailed : Error
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
package com.tangem.domain.account.usecase
|
||||
|
||||
import arrow.core.Either
|
||||
import arrow.core.raise.either
|
||||
import com.tangem.domain.models.account.AccountId
|
||||
|
||||
/**
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
class ArchiveCryptoPortfolioUseCase {
|
||||
|
||||
suspend operator fun invoke(accountId: AccountId): Either<Error, Unit> = either {
|
||||
// TODO: [REDACTED_JIRA]
|
||||
// Remove the account from the list of active accounts
|
||||
// Add the account to the list of archived accounts
|
||||
// Save to backend
|
||||
}
|
||||
|
||||
sealed interface Error {
|
||||
data object DataOperationFailed : Error
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
package com.tangem.domain.account.usecase
|
||||
|
||||
import arrow.core.Either
|
||||
import arrow.core.raise.either
|
||||
import com.tangem.domain.models.account.Account
|
||||
import com.tangem.domain.models.account.AccountId
|
||||
|
||||
/**
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
class RecoverCryptoPortfolioUseCase {
|
||||
|
||||
suspend operator fun invoke(accountId: AccountId): Either<Error, Account.CryptoPortfolio> = either {
|
||||
raise(Error.DataOperationFailed)
|
||||
|
||||
// TODO: [REDACTED_JIRA]
|
||||
// Remove the account from the list of archived accounts
|
||||
// Add the account to the list of active accounts
|
||||
// Save to backend
|
||||
}
|
||||
|
||||
sealed interface Error {
|
||||
data object DataOperationFailed : Error
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
package com.tangem.domain.account.usecase
|
||||
|
||||
import arrow.core.Either
|
||||
import arrow.core.raise.either
|
||||
import com.tangem.domain.models.TokensGroupType
|
||||
import com.tangem.domain.models.TokensSortType
|
||||
import com.tangem.domain.models.account.Account
|
||||
import com.tangem.domain.models.account.AccountId
|
||||
import com.tangem.domain.models.account.AccountName
|
||||
import com.tangem.domain.models.account.CryptoPortfolioIcon
|
||||
import kotlin.random.Random
|
||||
|
||||
/**
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
class UpdateCryptoPortfolioUseCase {
|
||||
|
||||
suspend operator fun invoke(
|
||||
accountId: AccountId,
|
||||
name: AccountName? = null,
|
||||
icon: CryptoPortfolioIcon? = null,
|
||||
): Either<Error, Account.CryptoPortfolio> = either {
|
||||
Account.CryptoPortfolio(
|
||||
accountId = accountId,
|
||||
name = name?.value ?: "Account",
|
||||
accountIcon = icon ?: CryptoPortfolioIcon.ofDefaultCustomAccount(),
|
||||
derivationIndex = Random.nextInt(from = 0, until = 21),
|
||||
isArchived = false,
|
||||
cryptoCurrencyList = Account.CryptoPortfolio.CryptoCurrencyList(
|
||||
currencies = emptySet(),
|
||||
sortType = TokensSortType.NONE,
|
||||
groupType = TokensGroupType.NONE,
|
||||
),
|
||||
)
|
||||
.mapLeft { Error.DataOperationFailed }
|
||||
.bind()
|
||||
|
||||
// TODO: [REDACTED_JIRA]
|
||||
// Create a domain model AccountName
|
||||
// Get the current account by [accountId]
|
||||
// Create a new domain model Account from old data considering new parameters
|
||||
// Save information in local storage
|
||||
// Save to backend
|
||||
}
|
||||
|
||||
sealed interface Error {
|
||||
|
||||
data object DataOperationFailed : Error
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue