@@ -2,8 +2,13 @@ package com.woocommerce.android.ui.woopos.orders
22
33import com.woocommerce.android.model.Order
44import com.woocommerce.android.model.OrderMapper
5+ import com.woocommerce.android.model.Refund
56import com.woocommerce.android.tools.SelectedSite
7+ import com.woocommerce.android.ui.woopos.common.data.WooPosRetrieveOrderRefunds
68import kotlinx.coroutines.Dispatchers
9+ import kotlinx.coroutines.async
10+ import kotlinx.coroutines.awaitAll
11+ import kotlinx.coroutines.coroutineScope
712import kotlinx.coroutines.flow.Flow
813import kotlinx.coroutines.flow.flow
914import kotlinx.coroutines.withContext
@@ -16,21 +21,27 @@ import java.util.concurrent.atomic.AtomicInteger
1621import javax.inject.Inject
1722
1823sealed class LoadOrdersResult {
19- data class SuccessCache (val orders : List <Order >) : LoadOrdersResult()
20- data class SuccessRemote (val orders : List <Order >) : LoadOrdersResult()
24+ data class SuccessCache (val ordersWithRefunds : Map <Order , RefundFetchResult >) : LoadOrdersResult()
25+ data class SuccessRemote (val ordersWithRefunds : Map <Order , RefundFetchResult >) : LoadOrdersResult()
2126 data class Error (val message : String ) : LoadOrdersResult()
2227}
2328
2429sealed class SearchOrdersResult {
25- data class Success (val orders : List <Order >) : SearchOrdersResult()
30+ data class Success (val ordersWithRefunds : Map <Order , RefundFetchResult >) : SearchOrdersResult()
2631 data class Error (val message : String ) : SearchOrdersResult()
2732}
2833
34+ sealed class RefundFetchResult {
35+ data class Success (val refunds : List <Refund >) : RefundFetchResult()
36+ object Error : RefundFetchResult()
37+ }
38+
2939class WooPosOrdersDataSource @Inject constructor(
3040 private val restClient : OrderRestClient ,
3141 private val selectedSite : SelectedSite ,
3242 private val orderMapper : OrderMapper ,
33- private val ordersCache : WooPosOrdersInMemoryCache
43+ private val ordersCache : WooPosOrdersInMemoryCache ,
44+ private val retrieveOrderRefunds : WooPosRetrieveOrderRefunds
3445) {
3546 private val canLoadMore = AtomicBoolean (false )
3647 private val page = AtomicInteger (1 )
@@ -45,12 +56,16 @@ class WooPosOrdersDataSource @Inject constructor(
4556
4657 fun loadOrders (): Flow <LoadOrdersResult > = flow {
4758 val cached = ordersCache.getAll()
48- if (cached.isNotEmpty()) emit(LoadOrdersResult .SuccessCache (cached))
59+ if (cached.isNotEmpty()) {
60+ val cachedWithRefunds = fetchRefundsForOrders(cached)
61+ emit(LoadOrdersResult .SuccessCache (cachedWithRefunds))
62+ }
4963
5064 val result = loadFirstPage()
51- result.onSuccess {
52- ordersCache.setAll(it)
53- emit(LoadOrdersResult .SuccessRemote (it))
65+ result.onSuccess { orders ->
66+ ordersCache.setAll(orders)
67+ val ordersWithRefunds = fetchRefundsForOrders(orders)
68+ emit(LoadOrdersResult .SuccessRemote (ordersWithRefunds))
5469 }.onFailure {
5570 emit(LoadOrdersResult .Error (it.message ? : UNKNOWN_ERROR ))
5671 }
@@ -59,13 +74,20 @@ class WooPosOrdersDataSource @Inject constructor(
5974 suspend fun searchOrders (searchQuery : String ): SearchOrdersResult {
6075 val result = loadFirstPage(searchQuery)
6176 return result.fold(
62- onSuccess = { SearchOrdersResult .Success (it) },
77+ onSuccess = { orders ->
78+ val ordersWithRefunds = fetchRefundsForOrders(orders)
79+ SearchOrdersResult .Success (ordersWithRefunds)
80+ },
6381 onFailure = { SearchOrdersResult .Error (it.message ? : UNKNOWN_ERROR ) }
6482 )
6583 }
6684
67- suspend fun loadMore (searchQuery : String? = null): Result <List <Order >> =
68- withContext(Dispatchers .IO ) { loadNextPage(searchQuery) }
85+ suspend fun loadMore (searchQuery : String? = null): Result <Map <Order , RefundFetchResult >> =
86+ withContext(Dispatchers .IO ) {
87+ loadNextPage(searchQuery).map { orders ->
88+ fetchRefundsForOrders(orders)
89+ }
90+ }
6991
7092 suspend fun refreshOrderById (orderId : Long ): Result <Order > {
7193 val site = selectedSite.get()
@@ -135,4 +157,16 @@ class WooPosOrdersDataSource @Inject constructor(
135157
136158 private fun WCOrderStore.OrderError.toThrowable (): Throwable =
137159 Throwable (" [$type ] $message " )
160+
161+ private suspend fun fetchRefundsForOrders (orders : List <Order >): Map <Order , RefundFetchResult > =
162+ coroutineScope {
163+ orders.map { order ->
164+ async {
165+ retrieveOrderRefunds(order).fold(
166+ onSuccess = { refunds -> order to RefundFetchResult .Success (refunds) },
167+ onFailure = { order to RefundFetchResult .Error }
168+ )
169+ }
170+ }.awaitAll().toMap()
171+ }
138172}
0 commit comments