@nuskin/ns-product-lib 2.20.0-td-1000.2 → 2.20.1-pa-163.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/src/graph-ql/product.js +46 -16
- package/src/productData.js +1 -1
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nuskin/ns-product-lib",
|
3
|
-
"version": "2.20.
|
3
|
+
"version": "2.20.1-pa-163.1",
|
4
4
|
"description": "This project contains shared Product models and code between the backend and frontend.",
|
5
5
|
"main": "src/index.js",
|
6
6
|
"scripts": {
|
@@ -19,11 +19,11 @@
|
|
19
19
|
"license": "ISC",
|
20
20
|
"homepage": "https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/blob/master/README.md",
|
21
21
|
"devDependencies": {
|
22
|
-
"@nuskin/configuration-sdk": "3.0.
|
22
|
+
"@nuskin/configuration-sdk": "3.0.1",
|
23
23
|
"@nuskin/ns-common-lib": "1.4.8",
|
24
24
|
"@nuskin/ns-util": "4.7.2",
|
25
|
-
"@nuskin/product-lib": "2.4.
|
26
|
-
"axios": "1.
|
25
|
+
"@nuskin/product-lib": "2.4.1",
|
26
|
+
"axios": "1.11.0",
|
27
27
|
"axios-mock-adapter": "1.21.2",
|
28
28
|
"eslint": "^8.56.0",
|
29
29
|
"eslint-config-google": "^0.14.0",
|
@@ -39,7 +39,7 @@
|
|
39
39
|
"@nuskin/configuration-sdk": "3.x",
|
40
40
|
"@nuskin/ns-common-lib": "1.x",
|
41
41
|
"@nuskin/ns-util": "4.x",
|
42
|
-
"axios": "1.
|
42
|
+
"axios": "1.11.0"
|
43
43
|
},
|
44
44
|
"dependencies": {
|
45
45
|
"qs": "6.11.0"
|
package/src/graph-ql/product.js
CHANGED
@@ -2,6 +2,7 @@ const ProductStatus = require("../models/productStatus");
|
|
2
2
|
const CustomerTypes = require('./customerTypes');
|
3
3
|
const Product = require("../product");
|
4
4
|
const {productLib} = require('@nuskin/product-lib');
|
5
|
+
const {getConfiguration} = require('@nuskin/configuration-sdk')
|
5
6
|
|
6
7
|
/**
|
7
8
|
* Get product by ID
|
@@ -31,7 +32,7 @@ async function getProduct(id, market, locale, config) {
|
|
31
32
|
if (data && data.data) {
|
32
33
|
//use to get default variant based on requested sku
|
33
34
|
config.sku = id;
|
34
|
-
const product = mapProduct(data.data, market, locale, config);
|
35
|
+
const product = await mapProduct(data.data, market, locale, config);
|
35
36
|
productData.products.push(new Product(product));
|
36
37
|
productData.count = productData.products.length;
|
37
38
|
}
|
@@ -72,18 +73,18 @@ async function getProducts(ids, market, locale, config) {
|
|
72
73
|
|
73
74
|
try {
|
74
75
|
const data = await productLib.getProductsById(
|
75
|
-
ids, market, locale,
|
76
|
-
null, 1, okta,
|
76
|
+
ids, market, locale,
|
77
|
+
null, 1, okta,
|
77
78
|
config.graphqlUrl.includes('test') ? 'test' : config.graphqlUrl.includes('dev') ? 'dev' : 'prod'
|
78
79
|
);
|
79
80
|
if (data && data.products) {
|
80
81
|
const mappedProducts = mapSkusToProducts(ids,data.products);
|
81
82
|
//use to get default variant based on requested sku
|
82
|
-
|
83
|
+
for (const {sku, product} of mappedProducts) {
|
83
84
|
config.sku = sku;
|
84
|
-
const newProduct = mapProduct(product, market, locale, config);
|
85
|
+
const newProduct = await mapProduct(product, market, locale, config);
|
85
86
|
productsData.products.push(new Product(newProduct));
|
86
|
-
}
|
87
|
+
}
|
87
88
|
productsData.count = productsData.products.length;
|
88
89
|
}
|
89
90
|
} catch (e) {
|
@@ -236,6 +237,33 @@ function mapPricingJson(productDetail, kitOrVariant, isContentStack) {
|
|
236
237
|
}
|
237
238
|
}
|
238
239
|
|
240
|
+
async function getSkuMaxQuantity(sku, defMaxQuantity, availableQuantity) {
|
241
|
+
const {Basic: basicCfg} = await getConfiguration(['Basic'])
|
242
|
+
let configMaxes
|
243
|
+
let maxQuantity = defMaxQuantity;
|
244
|
+
|
245
|
+
try {
|
246
|
+
configMaxes = basicCfg.skuMaxQty
|
247
|
+
.map((cm) => JSON.parse(cm))
|
248
|
+
.reduce((map, cmItem) => {
|
249
|
+
map[cmItem.sku] = cmItem.maxQty;
|
250
|
+
return map;
|
251
|
+
}, {});
|
252
|
+
} catch (err) {
|
253
|
+
console.log('Error parsing skuMaxQty from config', err);
|
254
|
+
configMaxes = {};
|
255
|
+
}
|
256
|
+
if (configMaxes && Object.keys(configMaxes).length > 0) {
|
257
|
+
if (Object.hasOwn(configMaxes, sku)) {
|
258
|
+
if (configMaxes[sku] < availableQuantity) {
|
259
|
+
maxQuantity = configMaxes[sku];
|
260
|
+
}
|
261
|
+
}
|
262
|
+
}
|
263
|
+
return maxQuantity;
|
264
|
+
}
|
265
|
+
|
266
|
+
|
239
267
|
/**
|
240
268
|
*
|
241
269
|
* Map product data to be product card consumable structure *
|
@@ -246,9 +274,9 @@ function mapPricingJson(productDetail, kitOrVariant, isContentStack) {
|
|
246
274
|
* @returns {object} Product
|
247
275
|
*/
|
248
276
|
// eslint-disable-next-line no-unused-vars
|
249
|
-
function mapProduct(product, market, locale, config) {
|
277
|
+
async function mapProduct(product, market, locale, config) {
|
250
278
|
const kitBundleProducts = product.bundle;
|
251
|
-
|
279
|
+
|
252
280
|
//serves as parent
|
253
281
|
const defaultVariant = !kitBundleProducts ? product.variants.find(v => v.sku === config.sku) : null
|
254
282
|
const kitOrVariant = !kitBundleProducts ? defaultVariant : kitBundleProducts
|
@@ -258,9 +286,11 @@ function mapProduct(product, market, locale, config) {
|
|
258
286
|
const points = kitOrVariant.points
|
259
287
|
const isBackOrdered = kitOrVariant.status.inventory === 'backordered'
|
260
288
|
const promoData = mapPromos(kitOrVariant)
|
289
|
+
const availableQuantity = isBackOrdered ? kitOrVariant.backorderQuantity : kitOrVariant.atpQuantity
|
290
|
+
const sku = !kitBundleProducts ? defaultVariant.sku : product.id
|
261
291
|
|
262
292
|
const productDetail = {
|
263
|
-
"sku":
|
293
|
+
"sku": sku,
|
264
294
|
"globalProductID": productOrVariant.globalId && productOrVariant.globalId !== productOrVariant.sku ? productOrVariant.globalId : productOrVariant.id,
|
265
295
|
"title": productOrVariant.title,
|
266
296
|
"country": market,
|
@@ -274,8 +304,8 @@ function mapProduct(product, market, locale, config) {
|
|
274
304
|
"benefits": productOrVariant.benefits,
|
275
305
|
"usage": productOrVariant.usage,
|
276
306
|
"resources": productOrVariant.resources,
|
277
|
-
"availableQuantity":
|
278
|
-
"maxQuantity": kitOrVariant.maxQuantity,
|
307
|
+
"availableQuantity": availableQuantity,
|
308
|
+
"maxQuantity": await getSkuMaxQuantity(sku, kitOrVariant.maxQuantity, availableQuantity),
|
279
309
|
"points": "",
|
280
310
|
"cv": points && points.wholesale ? points.wholesale.cv : 0,
|
281
311
|
"pv": points && points.wholesale ? points.wholesale.pv : 0,
|
@@ -337,7 +367,7 @@ function mapProduct(product, market, locale, config) {
|
|
337
367
|
|
338
368
|
//map only if it is normal product
|
339
369
|
if (product.variants && !kitBundleProducts) {
|
340
|
-
productDetail.variants = mapVariants(product, isContentStack);
|
370
|
+
productDetail.variants = await mapVariants(product, isContentStack);
|
341
371
|
}
|
342
372
|
|
343
373
|
if (kitBundleProducts) {
|
@@ -365,7 +395,7 @@ function mapProduct(product, market, locale, config) {
|
|
365
395
|
* @param {boolean} isContentStack
|
366
396
|
* @returns {Array<object>} productVariants
|
367
397
|
*/
|
368
|
-
function mapVariants(product, isContentStack) {
|
398
|
+
async function mapVariants(product, isContentStack) {
|
369
399
|
|
370
400
|
//return if it has no variant
|
371
401
|
if (!product.variants || (product.variants && product.variants.length === 1)) {
|
@@ -374,7 +404,7 @@ function mapVariants(product, isContentStack) {
|
|
374
404
|
|
375
405
|
const variants = [];
|
376
406
|
|
377
|
-
product.variants
|
407
|
+
for (const variant of product.variants) {
|
378
408
|
const sku = variant.sku || variant.id;
|
379
409
|
|
380
410
|
const productImages = mapProductImages(variant);
|
@@ -397,7 +427,7 @@ function mapVariants(product, isContentStack) {
|
|
397
427
|
"usage": variant.usage,
|
398
428
|
"resources": variant.resoruces,
|
399
429
|
"availableQuantity": variant.availableQuantity,
|
400
|
-
"maxQuantity": variant.maxQuantity,
|
430
|
+
"maxQuantity": await getSkuMaxQuantity(sku, variant.maxQuantity, variant.availableQuantity),
|
401
431
|
"points": "",
|
402
432
|
"cv": points && points.wholesale ? points.wholesale.cv : 0,
|
403
433
|
"pv": points && points.wholesale ? points.wholesale.pv : 0,
|
@@ -455,7 +485,7 @@ function mapVariants(product, isContentStack) {
|
|
455
485
|
}
|
456
486
|
}
|
457
487
|
mapPricingJson(variants[sku], variant, isContentStack)
|
458
|
-
}
|
488
|
+
}
|
459
489
|
|
460
490
|
return variants;
|
461
491
|
}
|
package/src/productData.js
CHANGED
@@ -75,7 +75,7 @@ const ProductData = {
|
|
75
75
|
const filter = skuFilter.join(" OR ")
|
76
76
|
|
77
77
|
let url = `${config.API_Base_URLs}/orchestrationservices/storefront/catalogs/search/`;
|
78
|
-
if (config.API_Base_URLs && config.API_Base_URLs.
|
78
|
+
if (config.API_Base_URLs && config.API_Base_URLs.endsWith('/storefront')) {
|
79
79
|
url = `${config.API_Base_URLs}/catalogs/search/`;
|
80
80
|
}
|
81
81
|
const href = `${url}?filter='\\\\''${encodeURI(filter)}'\\''`;
|