Skip to content

Commit 4ad6488

Browse files
authored
Merge pull request #14462 from woocommerce/issue/WOOMOB-726-migrate-config-room
[Shipping Labels] Migrate config cache from DataStore to Room
2 parents 1a16984 + c7ca1ef commit 4ad6488

File tree

22 files changed

+4328
-292
lines changed

22 files changed

+4328
-292
lines changed

RELEASE-NOTES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- [*] Shipping Labels: Fix layout issue with address status indicator [https://github.com/woocommerce/woocommerce-android/pull/14437]
1212
- [*] Shipping Labels: Updated shipments tab layout [https://github.com/woocommerce/woocommerce-android/pull/14448]
1313
- [*] Shipping Labels: Add a message for purchased shipments to the Split Shipments screen [https://github.com/woocommerce/woocommerce-android/pull/14455]
14+
- [Internal] Migrate the cache of the `/config` endpoint to Room instead of DataStore [https://github.com/woocommerce/woocommerce-android/pull/14462]
1415

1516
23.0
1617
-----

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/details/OrderDetailViewModel.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ import com.woocommerce.android.ui.orders.creation.shipping.GetShippingMethodsWit
5757
import com.woocommerce.android.ui.orders.creation.shipping.RefreshShippingMethods
5858
import com.woocommerce.android.ui.orders.creation.shipping.ShippingLineDetails
5959
import com.woocommerce.android.ui.orders.creation.shipping.ShippingMethodsRepository
60-
import com.woocommerce.android.ui.orders.wooshippinglabels.datasource.WooShippingConfigDataStore
6160
import com.woocommerce.android.ui.orders.wooshippinglabels.datasource.WooShippingEligibilityDataStore
6261
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippingLabelModel
6362
import com.woocommerce.android.ui.orders.wooshippinglabels.models.fillProducts
@@ -114,7 +113,6 @@ class OrderDetailViewModel @Inject constructor(
114113
private val shippingLabelOnboardingRepository: ShippingLabelOnboardingRepository,
115114
private val shippingLabelRepository: WooShippingLabelRepository,
116115
private val eligibilityDataStore: WooShippingEligibilityDataStore,
117-
private val configDataStore: WooShippingConfigDataStore,
118116
private val orderDetailsTransactionLauncher: OrderDetailsTransactionLauncher,
119117
private val getOrderSubscriptions: GetOrderSubscriptions,
120118
private val giftCardRepository: GiftCardRepository,
@@ -908,11 +906,11 @@ class OrderDetailViewModel @Inject constructor(
908906

909907
private suspend fun loadOrderShippingLabels(): ListInfo<ShippingLabelModel> {
910908
if (isRevampWooShippingEnabled) {
911-
configDataStore.getPurchasedLabels(navArgs.orderId).first()
909+
shippingLabelRepository.getPurchasedLabels(navArgs.orderId)
912910
} else {
913911
orderDetailRepository.getOrderShippingLabels(navArgs.orderId)
914912
.map { it.toShippingLabelModel() }
915-
}?.fillProducts(awaitOrder().items)
913+
}.fillProducts(awaitOrder().items)
916914
.whenNotNullNorEmpty { return ListInfo(list = it) }
917915
return ListInfo(isVisible = false)
918916
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/GetShipments.kt

Lines changed: 11 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,18 @@ package com.woocommerce.android.ui.orders.wooshippinglabels
33
import com.woocommerce.android.model.Order
44
import com.woocommerce.android.model.getNonRefundedProducts
55
import com.woocommerce.android.ui.orders.details.OrderDetailRepository
6-
import com.woocommerce.android.ui.orders.wooshippinglabels.datasource.WooShippingConfigDataStore
76
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShipmentUIModel
87
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippableItemModel
8+
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippingLabelModel
99
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippingLabelStatus
10-
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.ShippingLabelDTO
11-
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.WooShippingNetworkingMapper
12-
import com.woocommerce.android.ui.orders.wooshippinglabels.rates.networking.DestinationAddressDTO
13-
import com.woocommerce.android.ui.orders.wooshippinglabels.rates.networking.OriginAddressDTO
10+
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.WooShippingLabelRepository
1411
import com.woocommerce.android.ui.products.details.ProductDetailRepository
15-
import kotlinx.coroutines.flow.first
1612
import javax.inject.Inject
1713

1814
class GetShipments @Inject constructor(
15+
private val wooShippingLabelRepository: WooShippingLabelRepository,
1916
private val orderDetailRepository: OrderDetailRepository,
20-
private val productDetailRepository: ProductDetailRepository,
21-
private val configDataStore: WooShippingConfigDataStore,
22-
private val mapper: WooShippingNetworkingMapper,
17+
private val productDetailRepository: ProductDetailRepository
2318
) {
2419
suspend operator fun invoke(order: Order): List<ShipmentUIModel> {
2520
val refunds = orderDetailRepository.getOrderRefunds(order.id)
@@ -46,11 +41,10 @@ class GetShipments @Inject constructor(
4641
}
4742
}
4843

49-
val config = configDataStore.observeConfig(order.id).first()
44+
val shipments = wooShippingLabelRepository.getShipments(order.id)
45+
val labels = wooShippingLabelRepository.getLabels(order.id)
5046

51-
val shipments = config?.shipments
52-
53-
var shipmentUIModelList = if (shipments.isNullOrEmpty()) {
47+
var shipmentUIModelList = if (shipments.isEmpty()) {
5448
listOf(ShipmentUIModel(localId = "0", items = orderItems))
5549
} else {
5650
shipments.map { (shipmentId, shipmentItems) ->
@@ -64,55 +58,23 @@ class GetShipments @Inject constructor(
6458
}
6559
}.sortedBy { it.localId.toLong() }
6660

67-
config?.shippingLabelData?.let { data ->
68-
// If there are purchased labels, merge their data into the result list
69-
data.currentOrderLabels?.let { labels ->
70-
shipmentUIModelList = mergePurchaseData(shipmentUIModelList, labels)
71-
}
72-
73-
// If there are stored addresses, merge them into the result list
74-
data.storedData?.let { storedData ->
75-
shipmentUIModelList = mergeAddresses(
76-
shipmentUIModelList,
77-
storedData.selectedOrigin,
78-
storedData.selectedDestination
79-
)
80-
}
81-
}
61+
// If there are purchased labels, merge their data into the result list
62+
shipmentUIModelList = mergePurchaseData(shipmentUIModelList, labels)
8263

8364
return shipmentUIModelList
8465
}
8566

8667
private fun mergePurchaseData(
8768
shipmentUIModelList: List<ShipmentUIModel>,
88-
currentOrderLabels: List<ShippingLabelDTO>
69+
currentOrderLabels: List<ShippingLabelModel>
8970
) = shipmentUIModelList.map { shipmentUIModel ->
9071
val purchasedNonRefundedLabel = currentOrderLabels.find {
9172
it.shipmentId == shipmentUIModel.remoteId && it.status == ShippingLabelStatus.PURCHASED && it.refund == null
9273
}
9374
if (purchasedNonRefundedLabel == null) {
9475
shipmentUIModel
9576
} else {
96-
shipmentUIModel.copy(purchased = true, label = mapper.invoke(purchasedNonRefundedLabel))
77+
shipmentUIModel.copy(purchased = true, label = purchasedNonRefundedLabel)
9778
}
9879
}
99-
100-
private fun mergeAddresses(
101-
shipmentUIModelList: List<ShipmentUIModel>,
102-
originAddresses: Map<String, OriginAddressDTO>?,
103-
destinationAddresses: Map<String, DestinationAddressDTO>?
104-
): List<ShipmentUIModel> = shipmentUIModelList.map { shipmentUIModel ->
105-
val remoteId = shipmentUIModel.remoteId ?: return@map shipmentUIModel
106-
val key = getStoredDataKey(remoteId)
107-
108-
val updatedLabel = shipmentUIModel.label?.copy(
109-
originAddress = originAddresses?.get(key)?.let { mapper(it) }
110-
?: shipmentUIModel.label.originAddress,
111-
destinationAddress = destinationAddresses?.get(key)?.let { mapper(it) }
112-
?: shipmentUIModel.label.destinationAddress
113-
)
114-
shipmentUIModel.copy(label = updatedLabel)
115-
}
116-
117-
private fun getStoredDataKey(shipmentId: String) = "shipment_$shipmentId"
11880
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/SplitShipment.kt

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
package com.woocommerce.android.ui.orders.wooshippinglabels
22

33
import com.woocommerce.android.tools.SelectedSite
4-
import com.woocommerce.android.ui.orders.wooshippinglabels.datasource.WooShippingConfigDataStore
54
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShipmentUIModel
65
import com.woocommerce.android.ui.orders.wooshippinglabels.models.ShippableItemModel
7-
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.Item
8-
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.ShipmentMap
6+
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.ShipmentItem
97
import com.woocommerce.android.ui.orders.wooshippinglabels.networking.WooShippingLabelRepository
10-
import kotlinx.coroutines.flow.first
118
import javax.inject.Inject
129

1310
class SplitShipment @Inject constructor(
1411
private val selectedSite: SelectedSite,
15-
private val wooShippingLabelRepository: WooShippingLabelRepository,
16-
private val configDataStore: WooShippingConfigDataStore,
12+
private val wooShippingLabelRepository: WooShippingLabelRepository
1713
) {
1814

1915
suspend operator fun invoke(orderId: Long, shipments: List<ShipmentUIModel>): Result<List<ShipmentUIModel>> {
@@ -30,7 +26,6 @@ class SplitShipment @Inject constructor(
3026
if (response.isError || result == null) {
3127
Result.failure(Exception("Split shipment failed"))
3228
} else {
33-
updateCachedShipments(orderId, result.data)
3429
// Update remote ids
3530
val newShipments = shipments.map { it.copy(remoteId = it.localId) }
3631
Result.success(newShipments)
@@ -52,7 +47,7 @@ class SplitShipment @Inject constructor(
5247
}.associate { it.remoteId!! to it.localId.toInt() }
5348

5449
private fun List<ShipmentUIModel>.toShipmentMap() = associate {
55-
it.localId to it.items.map { item -> Item(id = item.itemId, subItems = item.subItems()) }
50+
it.localId to it.items.map { item -> ShipmentItem(id = item.itemId, subItems = item.subItems()) }
5651
}
5752

5853
/**
@@ -65,10 +60,4 @@ class SplitShipment @Inject constructor(
6560
} else {
6661
emptyList()
6762
}
68-
69-
private suspend fun updateCachedShipments(orderId: Long, newShipments: ShipmentMap) {
70-
configDataStore.observeConfig(orderId).first()?.let {
71-
configDataStore.saveConfig(orderId, it.copy(shipments = newShipments))
72-
}
73-
}
7463
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/datasource/WooShippingConfigDataStore.kt

Lines changed: 0 additions & 51 deletions
This file was deleted.

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/orders/wooshippinglabels/networking/DTOs.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ data class UpdateShipmentsResponse(
8080
/**
8181
* Alias for a mapping of shipment id (as String) to the list of items contained in each shipment.
8282
*/
83-
typealias ShipmentMap = Map<String, List<Item>>
83+
typealias ShipmentMap = Map<String, List<ShipmentItem>>
8484

8585
data class ConfigDTO(
8686
@SerializedName("shipments")
@@ -103,7 +103,7 @@ data class StoredDataDTO(
103103
val selectedDestination: Map<String, DestinationAddressDTO>,
104104
)
105105

106-
data class Item(@SerializedName("id") val id: Long?, @SerializedName("subItems") val subItems: List<String>?)
106+
data class ShipmentItem(@SerializedName("id") val id: Long?, @SerializedName("subItems") val subItems: List<String>?)
107107

108108
data class GetShippingLabelResponse(
109109
@SerializedName("success") val success: Boolean? = null,

0 commit comments

Comments
 (0)