diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt index 2ffd9c59ba..2a075f0226 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechApi.kt @@ -139,7 +139,7 @@ interface TangemTechApi { suspend fun getWallets(@Path("app_id") appId: String): ApiResponse> @POST("v1/user-wallets/wallets") - suspend fun createWallet(@Body body: OnlyWalletIdBody): ApiResponse + suspend fun createWallet(@Body body: WalletIdBody): ApiResponse // endregion // promo diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/OnlyWalletIdBody.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/OnlyWalletIdBody.kt deleted file mode 100644 index 6b5be8cd81..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/OnlyWalletIdBody.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.tangem.datasource.api.tangemTech.models - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -@JsonClass(generateAdapter = true) -data class OnlyWalletIdBody( - @Json(name = "id") val walletId: String, -) \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/WalletIdBody.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/WalletIdBody.kt index 3fd5ff6196..b99b869cdf 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/WalletIdBody.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/WalletIdBody.kt @@ -7,5 +7,5 @@ import com.squareup.moshi.JsonClass data class WalletIdBody( @Json(name = "id") val walletId: String, @Json(name = "name") val name: String, - @Json(name = "cards") val cards: List, + @Json(name = "cards") val cards: List? = null, ) \ No newline at end of file diff --git a/data/account/src/main/kotlin/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandler.kt b/data/account/src/main/kotlin/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandler.kt index 2a5d98b24a..7a567ee052 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandler.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandler.kt @@ -10,12 +10,13 @@ import com.tangem.datasource.api.common.response.ApiResponseError.HttpException. import com.tangem.datasource.api.common.response.ETAG_HEADER import com.tangem.datasource.api.common.response.isNetworkError import com.tangem.datasource.api.tangemTech.TangemTechApi -import com.tangem.datasource.api.tangemTech.models.OnlyWalletIdBody import com.tangem.datasource.api.tangemTech.models.UserTokensResponse +import com.tangem.datasource.api.tangemTech.models.WalletIdBody import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse import com.tangem.datasource.local.token.UserTokensResponseStore +import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.models.wallet.UserWalletId import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.withContext @@ -37,9 +38,11 @@ import javax.inject.Singleton * [REDACTED_AUTHOR] */ +@Suppress("LongParameterList") @Singleton internal class FetchWalletAccountsErrorHandler @Inject constructor( private val tangemTechApi: TangemTechApi, + private val userWalletsStore: UserWalletsStore, private val userTokensSaver: UserTokensSaver, private val userTokensResponseStore: UserTokensResponseStore, private val defaultWalletAccountsResponseFactory: DefaultWalletAccountsResponseFactory, @@ -117,9 +120,14 @@ internal class FetchWalletAccountsErrorHandler @Inject constructor( */ private suspend fun createWallet(userWalletId: UserWalletId): String? { + val userWallet = userWalletsStore.getSyncOrNull(key = userWalletId) ?: return null + val creationResponse = withContext(dispatchers.io) { tangemTechApi.createWallet( - body = OnlyWalletIdBody(walletId = userWalletId.stringValue), + body = WalletIdBody( + walletId = userWalletId.stringValue, + name = userWallet.name, + ), ) } diff --git a/data/account/src/test/java/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandlerTest.kt b/data/account/src/test/java/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandlerTest.kt index 5598bdd163..5dce1a4bd9 100644 --- a/data/account/src/test/java/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandlerTest.kt +++ b/data/account/src/test/java/com/tangem/data/account/fetcher/FetchWalletAccountsErrorHandlerTest.kt @@ -10,18 +10,17 @@ import com.tangem.datasource.api.common.response.ApiResponseError import com.tangem.datasource.api.common.response.ApiResponseError.HttpException.Code import com.tangem.datasource.api.common.response.ETAG_HEADER import com.tangem.datasource.api.tangemTech.TangemTechApi -import com.tangem.datasource.api.tangemTech.models.OnlyWalletIdBody import com.tangem.datasource.api.tangemTech.models.UserTokensResponse +import com.tangem.datasource.api.tangemTech.models.WalletIdBody import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse import com.tangem.datasource.api.tangemTech.models.account.WalletAccountDTO import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse import com.tangem.datasource.local.token.UserTokensResponseStore +import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider -import io.mockk.clearMocks -import io.mockk.coEvery -import io.mockk.coVerify -import io.mockk.mockk +import io.mockk.* import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -34,6 +33,7 @@ import org.junit.jupiter.api.TestInstance class FetchWalletAccountsErrorHandlerTest { private val tangemTechApi: TangemTechApi = mockk() + private val userWalletsStore: UserWalletsStore = mockk() private val userTokensSaver: UserTokensSaver = mockk(relaxUnitFun = true) private val userTokensResponseStore: UserTokensResponseStore = mockk(relaxUnitFun = true) private val defaultWalletAccountsResponseFactory: DefaultWalletAccountsResponseFactory = mockk() @@ -41,6 +41,7 @@ class FetchWalletAccountsErrorHandlerTest { private val handler = FetchWalletAccountsErrorHandler( tangemTechApi = tangemTechApi, + userWalletsStore = userWalletsStore, userTokensSaver = userTokensSaver, userTokensResponseStore = userTokensResponseStore, defaultWalletAccountsResponseFactory = defaultWalletAccountsResponseFactory, @@ -111,8 +112,15 @@ class FetchWalletAccountsErrorHandlerTest { code = Code.CREATED, ) + val walletName = "Wallet" + val userWallet = mockk { + every { this@mockk.walletId } returns userWalletId + every { this@mockk.name } returns walletName + } + coEvery { userWalletsStore.getSyncOrNull(userWalletId) } returns userWallet + coEvery { - tangemTechApi.createWallet(OnlyWalletIdBody(userWalletId.stringValue)) + tangemTechApi.createWallet(WalletIdBody(walletId = userWalletId.stringValue, name = walletName)) } returns apiResponse coEvery { pushWalletAccounts(userWalletId, listOf(accountDTO)) } returns savedAccountsResponse @@ -128,7 +136,7 @@ class FetchWalletAccountsErrorHandlerTest { // Assert coVerify { userTokensSaver.pushWithRetryer(userWalletId, response = savedAccountsResponse.toUserTokensResponse()) - tangemTechApi.createWallet(OnlyWalletIdBody(userWalletId.stringValue)) + tangemTechApi.createWallet(WalletIdBody(walletId = userWalletId.stringValue, name = "Wallet")) eTagsStore.store(userWalletId, ETagsStore.Key.WalletAccounts, eTagValue) pushWalletAccounts(userWalletId, listOf(accountDTO)) storeWalletAccounts(userWalletId, savedAccountsResponse) diff --git a/data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletsRepository.kt b/data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletsRepository.kt index 692e0dce0d..8c373d273b 100644 --- a/data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletsRepository.kt +++ b/data/wallets/src/main/java/com/tangem/data/wallets/DefaultWalletsRepository.kt @@ -254,8 +254,13 @@ internal class DefaultWalletsRepository( override suspend fun createWallet(userWalletId: UserWalletId) { withContext(dispatchers.io) { + val userWallet = userWalletsStore.getSyncStrict(key = userWalletId) + tangemTechApi.createWallet( - body = OnlyWalletIdBody(userWalletId.stringValue), + body = WalletIdBody( + walletId = userWalletId.stringValue, + name = userWallet.name, + ), ) } } diff --git a/data/wallets/src/test/java/com/tangem/data/wallets/DefaultWalletsRepositoryTest.kt b/data/wallets/src/test/java/com/tangem/data/wallets/DefaultWalletsRepositoryTest.kt index d2e030bc54..e2a9090de4 100644 --- a/data/wallets/src/test/java/com/tangem/data/wallets/DefaultWalletsRepositoryTest.kt +++ b/data/wallets/src/test/java/com/tangem/data/wallets/DefaultWalletsRepositoryTest.kt @@ -8,9 +8,9 @@ import com.tangem.datasource.api.common.AuthProvider import com.tangem.datasource.api.common.response.ApiResponse import com.tangem.datasource.api.common.response.ApiResponseError.HttpException import com.tangem.datasource.api.tangemTech.TangemTechApi -import com.tangem.datasource.api.tangemTech.models.WalletResponse import com.tangem.datasource.api.tangemTech.models.PromocodeActivationBody import com.tangem.datasource.api.tangemTech.models.PromocodeActivationResponse +import com.tangem.datasource.api.tangemTech.models.WalletResponse import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.domain.models.wallet.UserWallet @@ -226,15 +226,17 @@ class DefaultWalletsRepositoryTest { // THEN coVerify(exactly = 1) { tangemTechApi.associateApplicationIdWithWallets( - eq(applicationId), - match { body -> + applicationId = eq(applicationId), + body = match { body -> body.size == 2 && body.any { - it.walletId == wallet1Id && it.cards.any { card -> card.cardPublicKey == "public_key_1" } && + it.walletId == wallet1Id && + it.cards!!.any { card -> card.cardPublicKey == "public_key_1" } && it.name == "Wallet 1" } && body.any { - it.walletId == wallet2Id && it.cards.any { card -> card.cardPublicKey == "public_key_2" } && + it.walletId == wallet2Id && + it.cards!!.any { card -> card.cardPublicKey == "public_key_2" } && it.name == "Wallet 2" } }, diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/model/MultiWalletFinalizeModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/model/MultiWalletFinalizeModel.kt index d4436b86c7..e2d6ccafca 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/model/MultiWalletFinalizeModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/model/MultiWalletFinalizeModel.kt @@ -304,11 +304,19 @@ internal class MultiWalletFinalizeModel @Inject constructor( } if (userWallet.scanResponse.cardTypesResolver.isWallet2() && userWallet.isImported) { - launch(NonCancellable) { walletsRepository.markWallet2WasCreated(userWallet.walletId) } + launch(NonCancellable) { + runCatching { + walletsRepository.markWallet2WasCreated(userWallet.walletId) + } + } } if (userWallet.isMultiCurrency) { - launch(NonCancellable) { walletsRepository.createWallet(userWallet.walletId) } + launch(NonCancellable) { + runCatching { + walletsRepository.createWallet(userWallet.walletId) + } + } } // user wallet is fully created and saved, remove scan response from preferences