@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuskin/ns-product-lib",
3
- "version": "2.21.0-td-1017.1",
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.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.2-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,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 productionBom = kitBundleProducts && kitBundleProducts.isProductionBom
262
- ? kitBundleProducts.isProductionBom : false;
289
+ const availableQuantity = isBackOrdered ? kitOrVariant.backorderQuantity : kitOrVariant.atpQuantity
290
+ const sku = !kitBundleProducts ? defaultVariant.sku : product.id
263
291
 
264
292
  const productDetail = {
265
- "sku": !kitBundleProducts ? defaultVariant.sku : product.id,
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": isBackOrdered ? kitOrVariant.backorderQuantity : kitOrVariant.atpQuantity,
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.forEach(variant => {
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;