@nuskin/ns-product-lib 2.21.0-td-1017.1 → 2.21.0
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 -20
- package/src/product.js +6 -0
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nuskin/ns-product-lib",
|
3
|
-
"version": "2.21.0
|
3
|
+
"version": "2.21.0",
|
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,11 +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
|
262
|
-
|
289
|
+
const availableQuantity = isBackOrdered ? kitOrVariant.backorderQuantity : kitOrVariant.atpQuantity
|
290
|
+
const sku = !kitBundleProducts ? defaultVariant.sku : product.id
|
263
291
|
|
264
292
|
const productDetail = {
|
265
|
-
"sku":
|
293
|
+
"sku": sku,
|
266
294
|
"globalProductID": productOrVariant.globalId && productOrVariant.globalId !== productOrVariant.sku ? productOrVariant.globalId : productOrVariant.id,
|
267
295
|
"title": productOrVariant.title,
|
268
296
|
"country": market,
|
@@ -276,8 +304,8 @@ function mapProduct(product, market, locale, config) {
|
|
276
304
|
"benefits": productOrVariant.benefits,
|
277
305
|
"usage": productOrVariant.usage,
|
278
306
|
"resources": productOrVariant.resources,
|
279
|
-
"availableQuantity":
|
280
|
-
"maxQuantity": kitOrVariant.maxQuantity,
|
307
|
+
"availableQuantity": availableQuantity,
|
308
|
+
"maxQuantity": await getSkuMaxQuantity(sku, kitOrVariant.maxQuantity, availableQuantity),
|
281
309
|
"points": "",
|
282
310
|
"cv": points && points.wholesale ? points.wholesale.cv : 0,
|
283
311
|
"pv": points && points.wholesale ? points.wholesale.pv : 0,
|
@@ -330,8 +358,7 @@ function mapProduct(product, market, locale, config) {
|
|
330
358
|
"properties": {
|
331
359
|
isBackOrdered: isBackOrdered,
|
332
360
|
inventoryStatus: isBackOrdered ? 'BACKORDER' : 'IN STOCK',
|
333
|
-
productStatus: mapProductStatus(kitOrVariant.status.status)
|
334
|
-
productionBom: productionBom
|
361
|
+
productStatus: mapProductStatus(kitOrVariant.status.status)
|
335
362
|
}
|
336
363
|
}
|
337
364
|
|
@@ -340,7 +367,7 @@ function mapProduct(product, market, locale, config) {
|
|
340
367
|
|
341
368
|
//map only if it is normal product
|
342
369
|
if (product.variants && !kitBundleProducts) {
|
343
|
-
productDetail.variants = mapVariants(product, isContentStack);
|
370
|
+
productDetail.variants = await mapVariants(product, isContentStack);
|
344
371
|
}
|
345
372
|
|
346
373
|
if (kitBundleProducts) {
|
@@ -368,7 +395,7 @@ function mapProduct(product, market, locale, config) {
|
|
368
395
|
* @param {boolean} isContentStack
|
369
396
|
* @returns {Array<object>} productVariants
|
370
397
|
*/
|
371
|
-
function mapVariants(product, isContentStack) {
|
398
|
+
async function mapVariants(product, isContentStack) {
|
372
399
|
|
373
400
|
//return if it has no variant
|
374
401
|
if (!product.variants || (product.variants && product.variants.length === 1)) {
|
@@ -377,7 +404,7 @@ function mapVariants(product, isContentStack) {
|
|
377
404
|
|
378
405
|
const variants = [];
|
379
406
|
|
380
|
-
product.variants
|
407
|
+
for (const variant of product.variants) {
|
381
408
|
const sku = variant.sku || variant.id;
|
382
409
|
|
383
410
|
const productImages = mapProductImages(variant);
|
@@ -400,7 +427,7 @@ function mapVariants(product, isContentStack) {
|
|
400
427
|
"usage": variant.usage,
|
401
428
|
"resources": variant.resoruces,
|
402
429
|
"availableQuantity": variant.availableQuantity,
|
403
|
-
"maxQuantity": variant.maxQuantity,
|
430
|
+
"maxQuantity": await getSkuMaxQuantity(sku, variant.maxQuantity, variant.availableQuantity),
|
404
431
|
"points": "",
|
405
432
|
"cv": points && points.wholesale ? points.wholesale.cv : 0,
|
406
433
|
"pv": points && points.wholesale ? points.wholesale.pv : 0,
|
@@ -458,7 +485,7 @@ function mapVariants(product, isContentStack) {
|
|
458
485
|
}
|
459
486
|
}
|
460
487
|
mapPricingJson(variants[sku], variant, isContentStack)
|
461
|
-
}
|
488
|
+
}
|
462
489
|
|
463
490
|
return variants;
|
464
491
|
}
|
package/src/product.js
CHANGED
@@ -30,6 +30,8 @@ const Product = function (productData) {
|
|
30
30
|
this.longDescr = "";
|
31
31
|
this.sizeWeight = "";
|
32
32
|
this.nettoWeight = "";
|
33
|
+
this.grossWeight = 0.0;
|
34
|
+
this.weightUnit = '';
|
33
35
|
this.productLabels = {};
|
34
36
|
this.dangerousGoods = false;
|
35
37
|
this.count = "";
|
@@ -547,6 +549,8 @@ const Product = function (productData) {
|
|
547
549
|
retData.eventName = this.eventName;
|
548
550
|
retData.sizeWeight = this.sizeWeight;
|
549
551
|
retData.nettoWeight = this.nettoWeight;
|
552
|
+
retData.grossWeight = this.grossWeight;
|
553
|
+
retData.weightUnit = this.weightUnit;
|
550
554
|
retData.productLabels = this.productLabels;
|
551
555
|
retData.variants = toVariantJSON(this.variants);
|
552
556
|
retData.searchScore = this.searchScore;
|
@@ -665,6 +669,8 @@ const Product = function (productData) {
|
|
665
669
|
this.savedEventName = productData.savedEventName;
|
666
670
|
this.sizeWeight = productData.sizeWeight;
|
667
671
|
this.nettoWeight = productData.nettoWeight;
|
672
|
+
this.grossWeight = productData.grossWeight;
|
673
|
+
this.weightUnit = productData.weightUnit;
|
668
674
|
this.productLabels = productData.productLabels;
|
669
675
|
this.salesLabel = productData.salesLabel;
|
670
676
|
this.eventName = productData.eventName;
|