@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuskin/ns-product-lib",
3
- "version": "2.20.1-td-1017.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.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-td-1017.1",
26
- "axios": "1.8.3",
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.8.3"
42
+ "axios": "1.11.0"
43
43
  },
44
44
  "dependencies": {
45
45
  "qs": "6.11.0"
@@ -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
- mappedProducts.forEach(({sku , product})=>{
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 productionBom = product.bundle && product.bundle.isProductionBom ? product.bundle.isProductionBom : false;
289
+ const availableQuantity = isBackOrdered ? kitOrVariant.backorderQuantity : kitOrVariant.atpQuantity
290
+ const sku = !kitBundleProducts ? defaultVariant.sku : product.id
262
291
 
263
292
  const productDetail = {
264
- "sku": !kitBundleProducts ? defaultVariant.sku : product.id,
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": isBackOrdered ? kitOrVariant.backorderQuantity : kitOrVariant.atpQuantity,
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.forEach(variant => {
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
  }