@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 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.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.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,
@@ -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.forEach(variant => {
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
  }