@nuskin/ns-product-lib 2.20.1-td-1017.1 → 2.20.2-gms-13639.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 +48 -19
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.2-gms-13639.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,
|
@@ -309,6 +338,7 @@ function mapProduct(product, market, locale, config) {
|
|
309
338
|
"orderTypes": mapOrderTypes(kitOrVariant.availableChannels, kitOrVariant.purchaseTypes),
|
310
339
|
"custTypes": mapCustomerTypes(kitOrVariant.customerTypes),
|
311
340
|
"backOrderDate": kitOrVariant.backorderedAvailableDate,
|
341
|
+
"atpQuantity" : kitOrVariant.atpQuantity,
|
312
342
|
"size": productOrVariant.size,
|
313
343
|
"status": mapProductStatus(kitOrVariant.status.status),
|
314
344
|
"variantType": "Other",
|
@@ -329,8 +359,7 @@ function mapProduct(product, market, locale, config) {
|
|
329
359
|
"properties": {
|
330
360
|
isBackOrdered: isBackOrdered,
|
331
361
|
inventoryStatus: isBackOrdered ? 'BACKORDER' : 'IN STOCK',
|
332
|
-
productStatus: mapProductStatus(kitOrVariant.status.status)
|
333
|
-
productionBom: productionBom
|
362
|
+
productStatus: mapProductStatus(kitOrVariant.status.status)
|
334
363
|
}
|
335
364
|
}
|
336
365
|
|
@@ -339,7 +368,7 @@ function mapProduct(product, market, locale, config) {
|
|
339
368
|
|
340
369
|
//map only if it is normal product
|
341
370
|
if (product.variants && !kitBundleProducts) {
|
342
|
-
productDetail.variants = mapVariants(product, isContentStack);
|
371
|
+
productDetail.variants = await mapVariants(product, isContentStack);
|
343
372
|
}
|
344
373
|
|
345
374
|
if (kitBundleProducts) {
|
@@ -367,7 +396,7 @@ function mapProduct(product, market, locale, config) {
|
|
367
396
|
* @param {boolean} isContentStack
|
368
397
|
* @returns {Array<object>} productVariants
|
369
398
|
*/
|
370
|
-
function mapVariants(product, isContentStack) {
|
399
|
+
async function mapVariants(product, isContentStack) {
|
371
400
|
|
372
401
|
//return if it has no variant
|
373
402
|
if (!product.variants || (product.variants && product.variants.length === 1)) {
|
@@ -376,7 +405,7 @@ function mapVariants(product, isContentStack) {
|
|
376
405
|
|
377
406
|
const variants = [];
|
378
407
|
|
379
|
-
product.variants
|
408
|
+
for (const variant of product.variants) {
|
380
409
|
const sku = variant.sku || variant.id;
|
381
410
|
|
382
411
|
const productImages = mapProductImages(variant);
|
@@ -399,7 +428,7 @@ function mapVariants(product, isContentStack) {
|
|
399
428
|
"usage": variant.usage,
|
400
429
|
"resources": variant.resoruces,
|
401
430
|
"availableQuantity": variant.availableQuantity,
|
402
|
-
"maxQuantity": variant.maxQuantity,
|
431
|
+
"maxQuantity": await getSkuMaxQuantity(sku, variant.maxQuantity, variant.availableQuantity),
|
403
432
|
"points": "",
|
404
433
|
"cv": points && points.wholesale ? points.wholesale.cv : 0,
|
405
434
|
"pv": points && points.wholesale ? points.wholesale.pv : 0,
|
@@ -457,7 +486,7 @@ function mapVariants(product, isContentStack) {
|
|
457
486
|
}
|
458
487
|
}
|
459
488
|
mapPricingJson(variants[sku], variant, isContentStack)
|
460
|
-
}
|
489
|
+
}
|
461
490
|
|
462
491
|
return variants;
|
463
492
|
}
|