From a52c9cb10687db4cdcde085e2728904d49e3e7e7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 4 Aug 2025 14:07:40 +0400 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle.kts | 1 + .../tap/di/domain/AccountDomainModule.kt | 40 ++++++++++++++ .../usecase/AddCryptoPortfolioUseCase.kt | 55 +++++++++++++++++++ .../usecase/ArchiveCryptoPortfolioUseCase.kt | 22 ++++++++ .../usecase/RecoverCryptoPortfolioUseCase.kt | 25 +++++++++ .../usecase/UpdateCryptoPortfolioUseCase.kt | 50 +++++++++++++++++ 6 files changed, 193 insertions(+) create mode 100644 app/src/main/java/com/tangem/tap/di/domain/AccountDomainModule.kt create mode 100644 domain/account/src/main/java/com/tangem/domain/account/usecase/AddCryptoPortfolioUseCase.kt create mode 100644 domain/account/src/main/java/com/tangem/domain/account/usecase/ArchiveCryptoPortfolioUseCase.kt create mode 100644 domain/account/src/main/java/com/tangem/domain/account/usecase/RecoverCryptoPortfolioUseCase.kt create mode 100644 domain/account/src/main/java/com/tangem/domain/account/usecase/UpdateCryptoPortfolioUseCase.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 19dd55b0e1..e90dbf8a85 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -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) diff --git a/app/src/main/java/com/tangem/tap/di/domain/AccountDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/AccountDomainModule.kt new file mode 100644 index 0000000000..22e627efca --- /dev/null +++ b/app/src/main/java/com/tangem/tap/di/domain/AccountDomainModule.kt @@ -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() + } +} \ No newline at end of file diff --git a/domain/account/src/main/java/com/tangem/domain/account/usecase/AddCryptoPortfolioUseCase.kt b/domain/account/src/main/java/com/tangem/domain/account/usecase/AddCryptoPortfolioUseCase.kt new file mode 100644 index 0000000000..fb2ebb4717 --- /dev/null +++ b/domain/account/src/main/java/com/tangem/domain/account/usecase/AddCryptoPortfolioUseCase.kt @@ -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 = 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 + } +} \ No newline at end of file diff --git a/domain/account/src/main/java/com/tangem/domain/account/usecase/ArchiveCryptoPortfolioUseCase.kt b/domain/account/src/main/java/com/tangem/domain/account/usecase/ArchiveCryptoPortfolioUseCase.kt new file mode 100644 index 0000000000..8e473b507d --- /dev/null +++ b/domain/account/src/main/java/com/tangem/domain/account/usecase/ArchiveCryptoPortfolioUseCase.kt @@ -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 = 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 + } +} \ No newline at end of file diff --git a/domain/account/src/main/java/com/tangem/domain/account/usecase/RecoverCryptoPortfolioUseCase.kt b/domain/account/src/main/java/com/tangem/domain/account/usecase/RecoverCryptoPortfolioUseCase.kt new file mode 100644 index 0000000000..2d27ad3a32 --- /dev/null +++ b/domain/account/src/main/java/com/tangem/domain/account/usecase/RecoverCryptoPortfolioUseCase.kt @@ -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 = 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 + } +} \ No newline at end of file diff --git a/domain/account/src/main/java/com/tangem/domain/account/usecase/UpdateCryptoPortfolioUseCase.kt b/domain/account/src/main/java/com/tangem/domain/account/usecase/UpdateCryptoPortfolioUseCase.kt new file mode 100644 index 0000000000..cec8cbc039 --- /dev/null +++ b/domain/account/src/main/java/com/tangem/domain/account/usecase/UpdateCryptoPortfolioUseCase.kt @@ -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 = 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 + } +} \ No newline at end of file