@nuskin/ns-product-lib 2.20.0-td-1000.2 → 2.20.1-pa-163.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.0-td-1000.2",
3
+ "version": "2.20.1-pa-163.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.0-td-1000.2",
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,9 +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)
289
+ const availableQuantity = isBackOrdered ? kitOrVariant.backorderQuantity : kitOrVariant.atpQuantity
290
+ const sku = !kitBundleProducts ? defaultVariant.sku : product.id
261
291
 
262
292
  const productDetail = {
263
- "sku": !kitBundleProducts ? defaultVariant.sku : product.id,
293
+ "sku": sku,
264
294
  "globalProductID": productOrVariant.globalId && productOrVariant.globalId !== productOrVariant.sku ? productOrVariant.globalId : productOrVariant.id,
265
295
  "title": productOrVariant.title,
266
296
  "country": market,
@@ -274,8 +304,8 @@ function mapProduct(product, market, locale, config) {
274
304
  "benefits": productOrVariant.benefits,
275
305
  "usage": productOrVariant.usage,
276
306
  "resources": productOrVariant.resources,
277
- "availableQuantity": isBackOrdered ? kitOrVariant.backorderQuantity : kitOrVariant.atpQuantity,
278
- "maxQuantity": kitOrVariant.maxQuantity,
307
+ "availableQuantity": availableQuantity,
308
+ "maxQuantity": await getSkuMaxQuantity(sku, kitOrVariant.maxQuantity, availableQuantity),
279
309
  "points": "",
280
310
  "cv": points && points.wholesale ? points.wholesale.cv : 0,
281
311
  "pv": points && points.wholesale ? points.wholesale.pv : 0,
@@ -337,7 +367,7 @@ function mapProduct(product, market, locale, config) {
337
367
 
338
368
  //map only if it is normal product
339
369
  if (product.variants && !kitBundleProducts) {
340
- productDetail.variants = mapVariants(product, isContentStack);
370
+ productDetail.variants = await mapVariants(product, isContentStack);
341
371
  }
342
372
 
343
373
  if (kitBundleProducts) {
@@ -365,7 +395,7 @@ function mapProduct(product, market, locale, config) {
365
395
  * @param {boolean} isContentStack
366
396
  * @returns {Array<object>} productVariants
367
397
  */
368
- function mapVariants(product, isContentStack) {
398
+ async function mapVariants(product, isContentStack) {
369
399
 
370
400
  //return if it has no variant
371
401
  if (!product.variants || (product.variants && product.variants.length === 1)) {
@@ -374,7 +404,7 @@ function mapVariants(product, isContentStack) {
374
404
 
375
405
  const variants = [];
376
406
 
377
- product.variants.forEach(variant => {
407
+ for (const variant of product.variants) {
378
408
  const sku = variant.sku || variant.id;
379
409
 
380
410
  const productImages = mapProductImages(variant);
@@ -397,7 +427,7 @@ function mapVariants(product, isContentStack) {
397
427
  "usage": variant.usage,
398
428
  "resources": variant.resoruces,
399
429
  "availableQuantity": variant.availableQuantity,
400
- "maxQuantity": variant.maxQuantity,
430
+ "maxQuantity": await getSkuMaxQuantity(sku, variant.maxQuantity, variant.availableQuantity),
401
431
  "points": "",
402
432
  "cv": points && points.wholesale ? points.wholesale.cv : 0,
403
433
  "pv": points && points.wholesale ? points.wholesale.pv : 0,
@@ -455,7 +485,7 @@ function mapVariants(product, isContentStack) {
455
485
  }
456
486
  }
457
487
  mapPricingJson(variants[sku], variant, isContentStack)
458
- });
488
+ }
459
489
 
460
490
  return variants;
461
491
  }
@@ -75,7 +75,7 @@ const ProductData = {
75
75
  const filter = skuFilter.join(" OR ")
76
76
 
77
77
  let url = `${config.API_Base_URLs}/orchestrationservices/storefront/catalogs/search/`;
78
- if (config.API_Base_URLs && config.API_Base_URLs.indexOf('apis') > -1) {
78
+ if (config.API_Base_URLs && config.API_Base_URLs.endsWith('/storefront')) {
79
79
  url = `${config.API_Base_URLs}/catalogs/search/`;
80
80
  }
81
81
  const href = `${url}?filter='\\\\''${encodeURI(filter)}'\\''`;