Updated on 2026-08-14

This commit is contained in:
Tangem 2025-08-04 14:07:40 +04:00
parent 709bbdbe43
commit a52c9cb106
6 changed files with 193 additions and 0 deletions

View file

@ -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)

View file

@ -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()
}
}

View file

@ -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
}
}

View file

@ -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
}
}

View file

@ -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
}
}

View file

@ -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
}
}