Skip to content
This repository was archived by the owner on Feb 4, 2025. It is now read-only.

Commit 64479b5

Browse files
authored
Merge pull request #3116 from wordpress-mobile/issue/13041-woo-search-products-by-global-unique-id
[Woo] [Product Global Unique Id] Search Products by Global Unique Id
2 parents b06ca0e + 5762422 commit 64479b5

File tree

4 files changed

+92
-1
lines changed

4 files changed

+92
-1
lines changed

plugins/woocommerce/src/main/java/org/wordpress/android/fluxc/action/WCProductAction.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.wordpress.android.fluxc.store.WCProductStore.RemoteUpdateProductImagesPayload;
2929
import org.wordpress.android.fluxc.store.WCProductStore.RemoteUpdateProductPayload;
3030
import org.wordpress.android.fluxc.store.WCProductStore.RemoteUpdatedProductPasswordPayload;
31+
import org.wordpress.android.fluxc.store.WCProductStore.SearchProductsByGlobalUniqueIdPayload;
3132
import org.wordpress.android.fluxc.store.WCProductStore.SearchProductsPayload;
3233
import org.wordpress.android.fluxc.store.WCProductStore.UpdateProductImagesPayload;
3334
import org.wordpress.android.fluxc.store.WCProductStore.UpdateProductPasswordPayload;
@@ -40,6 +41,8 @@ public enum WCProductAction implements IAction {
4041
FETCH_PRODUCTS,
4142
@Action(payloadType = SearchProductsPayload.class)
4243
SEARCH_PRODUCTS,
44+
@Action(payloadType = SearchProductsByGlobalUniqueIdPayload.class)
45+
SEARCH_PRODUCTS_BY_GLOBAL_UNIQUE_ID,
4346
@Action(payloadType = FetchProductShippingClassListPayload.class)
4447
FETCH_PRODUCT_SHIPPING_CLASS_LIST,
4548
@Action(payloadType = FetchSingleProductShippingClassPayload.class)

plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/product/ProductRestClient.kt

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ class ProductRestClient @Inject constructor(
420420
sortType: ProductSorting = DEFAULT_PRODUCT_SORTING,
421421
searchQuery: String? = null,
422422
skuSearchOptions: SkuSearchOptions = SkuSearchOptions.Disabled,
423+
globalUniqueIdSearchQuery: String? = null,
423424
includedProductIds: List<Long>? = null,
424425
filterOptions: Map<ProductFilterOption, String>? = null,
425426
excludedProductIds: List<Long>? = null
@@ -432,6 +433,7 @@ class ProductRestClient @Inject constructor(
432433
offset = offset,
433434
searchQuery = searchQuery,
434435
skuSearchOptions = skuSearchOptions,
436+
globalUniqueIdSearchQuery = globalUniqueIdSearchQuery,
435437
includedProductIds = includedProductIds,
436438
excludedProductIds = excludedProductIds,
437439
filterOptions = filterOptions
@@ -452,7 +454,7 @@ class ProductRestClient @Inject constructor(
452454

453455
val loadedMore = offset > 0
454456
val canLoadMore = productModels.size == pageSize
455-
if (searchQuery == null) {
457+
if (searchQuery == null && globalUniqueIdSearchQuery == null) {
456458
val payload = RemoteProductListPayload(
457459
site,
458460
productModels,
@@ -497,6 +499,26 @@ class ProductRestClient @Inject constructor(
497499
}
498500
}
499501

502+
fun searchProductsByGlobalUniqueId(
503+
site: SiteModel,
504+
globalUniqueIdSearchQuery: String? = null,
505+
pageSize: Int = DEFAULT_PRODUCT_PAGE_SIZE,
506+
offset: Int = 0,
507+
sorting: ProductSorting = DEFAULT_PRODUCT_SORTING,
508+
excludedProductIds: List<Long>? = null,
509+
filterOptions: Map<ProductFilterOption, String>? = null
510+
) {
511+
fetchProducts(
512+
site = site,
513+
pageSize = pageSize,
514+
offset = offset,
515+
sortType = sorting,
516+
globalUniqueIdSearchQuery = globalUniqueIdSearchQuery,
517+
excludedProductIds = excludedProductIds,
518+
filterOptions = filterOptions
519+
)
520+
}
521+
500522
fun searchProducts(
501523
site: SiteModel,
502524
searchQuery: String,
@@ -583,6 +605,7 @@ class ProductRestClient @Inject constructor(
583605
offset: Int,
584606
searchQuery: String?,
585607
skuSearchOptions: SkuSearchOptions,
608+
globalUniqueIdSearchQuery: String? = null,
586609
includedProductIds: List<Long>? = null,
587610
excludedProductIds: List<Long>? = null,
588611
filterOptions: Map<ProductFilterOption, String>? = null
@@ -631,9 +654,20 @@ class ProductRestClient @Inject constructor(
631654
}
632655
}
633656

657+
addGlobalUniqueIdSearchQuery(params, globalUniqueIdSearchQuery)
658+
634659
return params
635660
}
636661

662+
private fun addGlobalUniqueIdSearchQuery(
663+
params: MutableMap<String, String>,
664+
globalUniqueIdSearchQuery: String?
665+
) {
666+
if (!globalUniqueIdSearchQuery.isNullOrEmpty()) {
667+
params["global_unique_id"] = globalUniqueIdSearchQuery
668+
}
669+
}
670+
637671
/**
638672
* Makes a GET request to `/wp-json/wc/v3/products/categories` retrieving a list of product
639673
* categories for the given WooCommerce [SiteModel].

plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/store/WCProductStore.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,16 @@ class WCProductStore @Inject constructor(
125125
var filterOptions: Map<ProductFilterOption, String>? = null,
126126
) : Payload<BaseNetworkError>()
127127

128+
class SearchProductsByGlobalUniqueIdPayload(
129+
var site: SiteModel,
130+
var globalUniqueId: String,
131+
var pageSize: Int = DEFAULT_PRODUCT_PAGE_SIZE,
132+
var offset: Int = 0,
133+
var sorting: ProductSorting = DEFAULT_PRODUCT_SORTING,
134+
var excludedProductIds: List<Long>? = null,
135+
var filterOptions: Map<ProductFilterOption, String>? = null,
136+
) : Payload<BaseNetworkError>()
137+
128138
class FetchProductVariationsPayload(
129139
var site: SiteModel,
130140
var remoteProductId: Long,
@@ -905,6 +915,9 @@ class WCProductStore @Inject constructor(
905915
WCProductAction.SEARCH_PRODUCTS ->
906916
searchProducts(action.payload as SearchProductsPayload)
907917

918+
WCProductAction.SEARCH_PRODUCTS_BY_GLOBAL_UNIQUE_ID ->
919+
searchProductsByGlobalUniqueId(action.payload as SearchProductsByGlobalUniqueIdPayload)
920+
908921
WCProductAction.UPDATE_PRODUCT_IMAGES ->
909922
updateProductImages(action.payload as UpdateProductImagesPayload)
910923

@@ -1211,6 +1224,20 @@ class WCProductStore @Inject constructor(
12111224
}
12121225
}
12131226

1227+
private fun searchProductsByGlobalUniqueId(payload: SearchProductsByGlobalUniqueIdPayload) {
1228+
with(payload) {
1229+
wcProductRestClient.searchProductsByGlobalUniqueId(
1230+
site = site,
1231+
globalUniqueIdSearchQuery = globalUniqueId,
1232+
pageSize = pageSize,
1233+
offset = offset,
1234+
sorting = sorting,
1235+
excludedProductIds = excludedProductIds,
1236+
filterOptions = filterOptions
1237+
)
1238+
}
1239+
}
1240+
12141241
suspend fun fetchProductVariations(payload: FetchProductVariationsPayload): OnProductChanged {
12151242
return coroutineEngine.withDefaultContext(API, this, "fetchProductVariations") {
12161243
val result = with(payload) {

plugins/woocommerce/src/test/java/org/wordpress/android/fluxc/network/rest/wpcom/wc/product/ProductRestClientTest.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,33 @@ class ProductRestClientTest {
162162
}
163163
}
164164

165+
@Test
166+
fun `when fetch products called with the global unique id, then correct params is used for network call`() {
167+
runBlockingTest {
168+
val globalUniqueIdSearchQuery = "test global unique id"
169+
sut.fetchProducts(
170+
site = site,
171+
globalUniqueIdSearchQuery = globalUniqueIdSearchQuery
172+
)
173+
val argumentCaptor = argumentCaptor<MutableMap<String, String>>()
174+
verify(wooNetwork).executeGetGsonRequest(
175+
any(),
176+
any(),
177+
clazz = eq(Array<ProductApiResponse>::class.java),
178+
params = argumentCaptor.capture(),
179+
enableCaching = any(),
180+
cacheTimeToLive = any(),
181+
forced = any(),
182+
requestTimeout = any(),
183+
retries = any()
184+
)
185+
186+
assertThat(argumentCaptor.firstValue.getOrDefault("global_unique_id", null)).isEqualTo(
187+
globalUniqueIdSearchQuery
188+
)
189+
}
190+
}
191+
165192
private fun WCProductModel.withRegularPrice(newRegularPrice: String): WCProductModel =
166193
copy().apply {
167194
remoteProductId = this@withRegularPrice.remoteProductId

0 commit comments

Comments
 (0)