@nuskin/ns-product-lib 2.20.1-td-1017.1 → 2.20.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 +47 -19
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nuskin/ns-product-lib",
|
3
|
-
"version": "2.20.1
|
3
|
+
"version": "2.20.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.1
|
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,10 +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)
|
261
|
-
const
|
289
|
+
const availableQuantity = isBackOrdered ? kitOrVariant.backorderQuantity : kitOrVariant.atpQuantity
|
290
|
+
const sku = !kitBundleProducts ? defaultVariant.sku : product.id
|
262
291
|
|
263
292
|
const productDetail = {
|
264
|
-
"sku":
|
293
|
+
"sku": sku,
|
265
294
|
"globalProductID": productOrVariant.globalId && productOrVariant.globalId !== productOrVariant.sku ? productOrVariant.globalId : productOrVariant.id,
|
266
295
|
"title": productOrVariant.title,
|
267
296
|
"country": market,
|
@@ -275,8 +304,8 @@ function mapProduct(product, market, locale, config) {
|
|
275
304
|
"benefits": productOrVariant.benefits,
|
276
305
|
"usage": productOrVariant.usage,
|
277
306
|
"resources": productOrVariant.resources,
|
278
|
-
"availableQuantity":
|
279
|
-
"maxQuantity": kitOrVariant.maxQuantity,
|
307
|
+
"availableQuantity": availableQuantity,
|
308
|
+
"maxQuantity": await getSkuMaxQuantity(sku, kitOrVariant.maxQuantity, availableQuantity),
|
280
309
|
"points": "",
|
281
310
|
"cv": points && points.wholesale ? points.wholesale.cv : 0,
|
282
311
|
"pv": points && points.wholesale ? points.wholesale.pv : 0,
|
@@ -329,8 +358,7 @@ function mapProduct(product, market, locale, config) {
|
|
329
358
|
"properties": {
|
330
359
|
isBackOrdered: isBackOrdered,
|
331
360
|
inventoryStatus: isBackOrdered ? 'BACKORDER' : 'IN STOCK',
|
332
|
-
productStatus: mapProductStatus(kitOrVariant.status.status)
|
333
|
-
productionBom: productionBom
|
361
|
+
productStatus: mapProductStatus(kitOrVariant.status.status)
|
334
362
|
}
|
335
363
|
}
|
336
364
|
|
@@ -339,7 +367,7 @@ function mapProduct(product, market, locale, config) {
|
|
339
367
|
|
340
368
|
//map only if it is normal product
|
341
369
|
if (product.variants && !kitBundleProducts) {
|
342
|
-
productDetail.variants = mapVariants(product, isContentStack);
|
370
|
+
productDetail.variants = await mapVariants(product, isContentStack);
|
343
371
|
}
|
344
372
|
|
345
373
|
if (kitBundleProducts) {
|
@@ -367,7 +395,7 @@ function mapProduct(product, market, locale, config) {
|
|
367
395
|
* @param {boolean} isContentStack
|
368
396
|
* @returns {Array<object>} productVariants
|
369
397
|
*/
|
370
|
-
function mapVariants(product, isContentStack) {
|
398
|
+
async function mapVariants(product, isContentStack) {
|
371
399
|
|
372
400
|
//return if it has no variant
|
373
401
|
if (!product.variants || (product.variants && product.variants.length === 1)) {
|
@@ -376,7 +404,7 @@ function mapVariants(product, isContentStack) {
|
|
376
404
|
|
377
405
|
const variants = [];
|
378
406
|
|
379
|
-
product.variants
|
407
|
+
for (const variant of product.variants) {
|
380
408
|
const sku = variant.sku || variant.id;
|
381
409
|
|
382
410
|
const productImages = mapProductImages(variant);
|
@@ -399,7 +427,7 @@ function mapVariants(product, isContentStack) {
|
|
399
427
|
"usage": variant.usage,
|
400
428
|
"resources": variant.resoruces,
|
401
429
|
"availableQuantity": variant.availableQuantity,
|
402
|
-
"maxQuantity": variant.maxQuantity,
|
430
|
+
"maxQuantity": await getSkuMaxQuantity(sku, variant.maxQuantity, variant.availableQuantity),
|
403
431
|
"points": "",
|
404
432
|
"cv": points && points.wholesale ? points.wholesale.cv : 0,
|
405
433
|
"pv": points && points.wholesale ? points.wholesale.pv : 0,
|
@@ -457,7 +485,7 @@ function mapVariants(product, isContentStack) {
|
|
457
485
|
}
|
458
486
|
}
|
459
487
|
mapPricingJson(variants[sku], variant, isContentStack)
|
460
|
-
}
|
488
|
+
}
|
461
489
|
|
462
490
|
return variants;
|
463
491
|
}
|