Updated on 2026-08-14
This commit is contained in:
parent
7cb4b57fe9
commit
cf79b3b9a8
6 changed files with 49 additions and 14 deletions
|
|
@ -54,9 +54,10 @@ internal class DefaultWalletAccountsFetcher @Inject constructor(
|
|||
|
||||
override suspend fun fetch(userWalletId: UserWalletId): GetWalletAccountsResponse {
|
||||
val savedAccountsResponse = getAccountsResponseStore(userWalletId = userWalletId).getSyncOrNull()
|
||||
val accountsResponse = fetchWalletAccounts(userWalletId, savedAccountsResponse)
|
||||
val fetchResult = fetchWalletAccounts(userWalletId, savedAccountsResponse)
|
||||
val accountsResponse = fetchResult.accountsResponse
|
||||
|
||||
return when {
|
||||
val updatedResponse = when {
|
||||
accountsResponse.accounts.isEmpty() -> {
|
||||
initializeAccounts(userWalletId, accountsResponse)
|
||||
}
|
||||
|
|
@ -65,6 +66,12 @@ internal class DefaultWalletAccountsFetcher @Inject constructor(
|
|||
}
|
||||
else -> accountsResponse
|
||||
}
|
||||
|
||||
if (fetchResult.error != null) {
|
||||
throw fetchResult.error
|
||||
}
|
||||
|
||||
return updatedResponse
|
||||
}
|
||||
|
||||
override suspend fun getSaved(userWalletId: UserWalletId): GetWalletAccountsResponse? {
|
||||
|
|
@ -123,7 +130,7 @@ internal class DefaultWalletAccountsFetcher @Inject constructor(
|
|||
private suspend fun fetchWalletAccounts(
|
||||
userWalletId: UserWalletId,
|
||||
savedAccountsResponse: GetWalletAccountsResponse?,
|
||||
): GetWalletAccountsResponse {
|
||||
): FetchResult {
|
||||
return safeApiCall(
|
||||
call = {
|
||||
val apiResponse = withContext(dispatchers.io) {
|
||||
|
|
@ -138,7 +145,7 @@ internal class DefaultWalletAccountsFetcher @Inject constructor(
|
|||
val responseBody = apiResponse.bind()
|
||||
store(userWalletId = userWalletId, response = responseBody)
|
||||
|
||||
responseBody
|
||||
FetchResult(responseBody)
|
||||
},
|
||||
onError = { throwable ->
|
||||
// pushWalletAccounts and storeWalletAccounts help to avoid cyclic dependency
|
||||
|
|
@ -211,4 +218,9 @@ internal class DefaultWalletAccountsFetcher @Inject constructor(
|
|||
private fun getAccountsResponseStore(userWalletId: UserWalletId): AccountsResponseStore {
|
||||
return accountsResponseStoreFactory.create(userWalletId = userWalletId)
|
||||
}
|
||||
|
||||
data class FetchResult(
|
||||
val accountsResponse: GetWalletAccountsResponse,
|
||||
val error: Throwable? = null,
|
||||
)
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
package com.tangem.data.account.fetcher
|
||||
|
||||
import com.tangem.data.account.fetcher.DefaultWalletAccountsFetcher.FetchResult
|
||||
import com.tangem.data.account.utils.DefaultWalletAccountsResponseFactory
|
||||
import com.tangem.data.common.cache.etag.ETagsStore
|
||||
import com.tangem.data.common.currency.UserTokensResponseAccountIdEnricher
|
||||
|
|
@ -69,13 +70,15 @@ internal class FetchWalletAccountsErrorHandler @Inject constructor(
|
|||
savedAccountsResponse: GetWalletAccountsResponse?,
|
||||
pushWalletAccounts: suspend (UserWalletId, List<WalletAccountDTO>) -> GetWalletAccountsResponse?,
|
||||
storeWalletAccounts: suspend (UserWalletId, GetWalletAccountsResponse) -> Unit,
|
||||
): GetWalletAccountsResponse {
|
||||
): FetchResult {
|
||||
val isResponseUpToDate = error.isNetworkError(code = Code.NOT_MODIFIED)
|
||||
if (isResponseUpToDate) {
|
||||
Timber.e("ETag is up to date, no need to update accounts for wallet: $userWalletId")
|
||||
return requireNotNull(savedAccountsResponse) {
|
||||
val response = requireNotNull(savedAccountsResponse) {
|
||||
"Saved accounts response is null for wallet: $userWalletId"
|
||||
}
|
||||
|
||||
return FetchResult(response)
|
||||
}
|
||||
|
||||
val response = savedAccountsResponse ?: createDefaultResponse(userWalletId)
|
||||
|
|
@ -95,7 +98,7 @@ internal class FetchWalletAccountsErrorHandler @Inject constructor(
|
|||
|
||||
storeWalletAccounts(userWalletId, response)
|
||||
|
||||
return response
|
||||
return FetchResult(response, error)
|
||||
}
|
||||
|
||||
private suspend fun createDefaultResponse(userWalletId: UserWalletId): GetWalletAccountsResponse {
|
||||
|
|
|
|||
|
|
@ -151,9 +151,9 @@ internal class DefaultAccountsCRUDRepository(
|
|||
)
|
||||
|
||||
val syncedResponse = walletAccountsSaver.push(userWalletId = accountList.userWalletId, accounts = accountDTOs)
|
||||
if (syncedResponse != null) {
|
||||
walletAccountsSaver.store(userWalletId = accountList.userWalletId, response = syncedResponse)
|
||||
}
|
||||
?: error("Failed to push accounts for wallet: ${accountList.userWalletId}")
|
||||
|
||||
walletAccountsSaver.store(userWalletId = accountList.userWalletId, response = syncedResponse)
|
||||
}
|
||||
|
||||
override suspend fun saveAccount(account: Account.CryptoPortfolio) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue