@nuskin/ns-product-lib 2.7.0-cx24-3702.2 → 2.7.0-cx24-3682.8
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/CHANGELOG.md +36 -13
- package/package.json +2 -2
- package/src/equinox-helpers/index.js +158 -29
- package/src/equinox-helpers/interceptors/index.js +5 -0
- package/src/equinox-helpers/interceptors/productNotFound.js +70 -0
- package/src/equinox-helpers/mappers/index.js +5 -0
- package/src/equinox-helpers/mappers/properties.js +182 -0
- package/src/equinox-helpers/models/index.js +5 -0
- package/src/equinox-helpers/models/productNotFound.js +32 -0
- package/src/product.js +62 -65
- package/src/productData.js +26 -42
package/CHANGELOG.md
CHANGED
@@ -1,37 +1,60 @@
|
|
1
|
-
# [2.7.0-cx24-
|
1
|
+
# [2.7.0-cx24-3682.8](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.7.0-cx24-3682.7...v2.7.0-cx24-3682.8) (2023-03-26)
|
2
2
|
|
3
3
|
|
4
4
|
### New
|
5
5
|
|
6
|
-
*
|
6
|
+
* MySite product cards show blank data when users have setup AEM Base SKU's(55) in Admin #CX24-3682 ([3d69bbe](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/3d69bbe486f13f4ae2a9fe4c07f53c4d27932177)), closes [#CX24-3682](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3682)
|
7
7
|
|
8
|
-
# [2.7.0-cx24-
|
8
|
+
# [2.7.0-cx24-3682.7](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.7.0-cx24-3682.6...v2.7.0-cx24-3682.7) (2023-03-25)
|
9
9
|
|
10
10
|
|
11
11
|
### New
|
12
12
|
|
13
|
-
*
|
13
|
+
* MySite product cards show blank data when users have setup AEM Base SKU's(55) in Admin #CX24-3682 ([a8f0331](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/a8f0331970ed4631ceba029d48e246b83627a046)), closes [#CX24-3682](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3682)
|
14
14
|
|
15
|
-
|
15
|
+
# [2.7.0-cx24-3682.6](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.7.0-cx24-3682.5...v2.7.0-cx24-3682.6) (2023-03-25)
|
16
16
|
|
17
17
|
|
18
|
-
###
|
18
|
+
### New
|
19
19
|
|
20
|
-
*
|
20
|
+
* MySite product cards show blank data when users have setup AEM Base SKU's(55) in Admin #CX24-3682 ([13f2b76](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/13f2b76990dd2e4f4226367332212dcc7bd19977)), closes [#CX24-3682](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3682)
|
21
21
|
|
22
|
-
# [2.7.0-cx24-
|
22
|
+
# [2.7.0-cx24-3682.5](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.7.0-cx24-3682.4...v2.7.0-cx24-3682.5) (2023-03-25)
|
23
23
|
|
24
24
|
|
25
|
-
###
|
25
|
+
### New
|
26
26
|
|
27
|
-
*
|
27
|
+
* MySite product cards show blank data when users have setup AEM Base SKU's(55) in Admin #CX24-3682 ([588161d](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/588161d54fa2e97f6bee2fe33523f3f1bdcb1ed2)), closes [#CX24-3682](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3682)
|
28
28
|
|
29
|
-
|
29
|
+
# [2.7.0-cx24-3682.4](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.7.0-cx24-3682.3...v2.7.0-cx24-3682.4) (2023-03-24)
|
30
30
|
|
31
31
|
|
32
|
-
###
|
32
|
+
### New
|
33
|
+
|
34
|
+
* MySite product cards show blank data when users have setup AEM Base SKU's(55) in Admin #CX24-3682 ([f55854a](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/f55854ad4abb17dbd373fe5e36a38deb2bb8fc53)), closes [#CX24-3682](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3682)
|
35
|
+
|
36
|
+
# [2.7.0-cx24-3682.3](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.7.0-cx24-3682.2...v2.7.0-cx24-3682.3) (2023-03-24)
|
37
|
+
|
38
|
+
|
39
|
+
### New
|
40
|
+
|
41
|
+
* MySite product cards show blank data when users have setup AEM Base SKU's(55) in Admin #CX24-3682 ([3ce010e](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/3ce010e162034d2cc49619f553baf7b8b7fcd4e0)), closes [#CX24-3682](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3682)
|
42
|
+
|
43
|
+
# [2.7.0-cx24-3682.2](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.7.0-cx24-3682.1...v2.7.0-cx24-3682.2) (2023-03-24)
|
44
|
+
|
45
|
+
|
46
|
+
### New
|
47
|
+
|
48
|
+
* MySite product cards show blank data when users have setup AEM Base SKU's(55) in Admin #CX24-3682 ([219fbd5](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/219fbd59b96ed9cbbc3ea94a24d886f0e8ca563f)), closes [#CX24-3682](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3682)
|
49
|
+
* MySite product cards show blank data when users have setup AEM Base SKU's(55) in Admin #CX24-3682 ([b86a1d2](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/b86a1d2610892564c643bd851d873e507efedd49)), closes [#CX24-3682](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3682)
|
50
|
+
* MySite product cards show blank data when users have setup AEM Base SKU's(55) in Admin #CX24-3682 ([60d61cc](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/60d61ccd38e9b971b7ac53cf4224a9897a63fef4)), closes [#CX24-3682](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3682)
|
51
|
+
|
52
|
+
# [2.7.0-cx24-3682.1](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.1...v2.7.0-cx24-3682.1) (2023-03-24)
|
53
|
+
|
54
|
+
|
55
|
+
### New
|
33
56
|
|
34
|
-
*
|
57
|
+
* MySite product cards show blank data when users have setup AEM Base SKU's(55) in Admin #CX24-3682 ([99cc11a](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/commit/99cc11a7a274d97c03efc0a4bcdd0e03eb7b552a)), closes [#CX24-3682](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/issues/CX24-3682)
|
35
58
|
|
36
59
|
## [2.6.1](https://code.tls.nuskin.io/ns-am/product/js-libs/ns-product-lib/compare/v2.6.0...v2.6.1) (2023-03-16)
|
37
60
|
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nuskin/ns-product-lib",
|
3
|
-
"version": "2.7.0-cx24-
|
3
|
+
"version": "2.7.0-cx24-3682.8",
|
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": {
|
@@ -33,7 +33,7 @@
|
|
33
33
|
"dependencies": {
|
34
34
|
"@nuskin/configuration-sdk": "2.2.3",
|
35
35
|
"@nuskin/ns-common-lib": "1.4.5",
|
36
|
-
"@nuskin/ns-util": "4.2.
|
36
|
+
"@nuskin/ns-util": "4.2.5",
|
37
37
|
"axios": "0.27.2",
|
38
38
|
"qs": "6.11.0"
|
39
39
|
},
|
@@ -4,7 +4,9 @@
|
|
4
4
|
* @type {object}
|
5
5
|
* @property {ProductChildSku[]} childSkus
|
6
6
|
* @property {Inventory} [inventoryProperties]
|
7
|
-
|
7
|
+
*/
|
8
|
+
|
9
|
+
/**
|
8
10
|
* @typedef ProductChildSku
|
9
11
|
* @type {object}
|
10
12
|
* @property {string} productId
|
@@ -13,43 +15,170 @@
|
|
13
15
|
* @property {number} skuQuantity
|
14
16
|
* @property {string} availableChannels
|
15
17
|
* @property {Inventory} [inventory]
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
*/
|
19
|
+
|
20
|
+
/**
|
21
|
+
* Types common to Product model and Equinox Product model
|
22
|
+
* @typedef Inventory
|
23
|
+
* @type {object}
|
24
|
+
* @property {number} atpQty
|
25
|
+
* @property {boolean} backOrdered
|
26
|
+
*/
|
27
|
+
|
28
|
+
/**
|
29
|
+
* @description This model represents the error response.
|
30
|
+
* @typedef EquinoxErrorResponse
|
31
|
+
* @type {object}
|
32
|
+
* @property {string} code e.g., SFOSER002
|
33
|
+
* @property {string} message e.g., No Results Found dot Search Term null
|
34
|
+
* @property {number} timestamp e.g., 1679715447962
|
35
|
+
*/
|
36
|
+
|
37
|
+
/**
|
38
|
+
* @description This model represents the response.
|
39
|
+
* @typedef EquinoxResponse
|
40
|
+
* @type {object}
|
41
|
+
* @property {EquinoxProduct[]} product
|
42
|
+
*/
|
43
|
+
|
44
|
+
/**
|
19
45
|
* @description This model represents a product within an Equinox response.
|
20
46
|
* @typedef EquinoxProduct
|
21
47
|
* @type {object}
|
22
|
-
* @property {string} identifier
|
23
|
-
* @property {
|
24
|
-
* @property {
|
25
|
-
*
|
26
|
-
|
48
|
+
* @property {string} identifier E.g., Normal - "blt8b757df6dcaa199c" | Kit - "02001076"
|
49
|
+
* @property {EquinoxProductProperties} properties
|
50
|
+
* @property {EquinoxProductVariant[]} [sku] or varaints - available only when product is a normal product.
|
51
|
+
* @property {"kit"|"bundle"} [type] available only when product is type of kit.
|
52
|
+
*/
|
53
|
+
|
54
|
+
/**
|
55
|
+
* @typedef {(
|
56
|
+
* EquinoxProductCommonProperties & EquinoxNormalProductProperties
|
57
|
+
* )} EquinoxProductProperties
|
58
|
+
*/
|
59
|
+
|
60
|
+
/**
|
61
|
+
* @description These are the properties unique to Normal product type.
|
62
|
+
* @typedef EquinoxNormalProductProperties
|
63
|
+
* @type {object}
|
64
|
+
* @property {string} ingredients
|
65
|
+
* @property {string} benefits
|
66
|
+
* @property {string} usage
|
67
|
+
* @property {string} resources
|
68
|
+
* @property {string} scanQualifiedCount E.g., "0"
|
69
|
+
* @property {string} status E.g., "active"
|
70
|
+
* @property {string} size E.g., "30 mL / 1 fl.oz"
|
71
|
+
* @property {string} productDetailsDescription E.g., "[]"
|
72
|
+
*/
|
73
|
+
|
74
|
+
/**
|
75
|
+
* @description These are the properties unique to Kit product type.
|
76
|
+
* @typedef EquinoxKitProductProperties
|
77
|
+
* @type {object}
|
78
|
+
* @property {string} skukits E.g., "02002145~1,02002146~1,02002147~1,02002148~1,02002142~1,02002143~1"
|
79
|
+
* @property {string} productStatus E.g., "Sellable"
|
80
|
+
* @property {string} availableChannels E.g., "subscription,arsPhone,kiosk,mobile,web"
|
81
|
+
*/
|
82
|
+
|
83
|
+
/**
|
84
|
+
* @description These are the common properties between Normal and Kit product types
|
85
|
+
* @typedef EquinoxProductCommonProperties
|
86
|
+
* @type {object}
|
87
|
+
* @property {string} name E.g., "180° Cell Renewal Fluid"
|
88
|
+
* @property {string} imageURL E.g., "https://nuskin.com/content/dam/global/...ule-refreshed.jpg"
|
89
|
+
* @property {string} market E.g., "CA"
|
90
|
+
* @property {string} description E.g., "180° Ampoule"
|
91
|
+
* @property {string} customerTypes E.g., "BrandAffiliate,Preferred,Retail"
|
92
|
+
* @property {string} division E.g., "Nu Skin"
|
93
|
+
*/
|
94
|
+
|
95
|
+
/**
|
96
|
+
* @typedef EquinoxProductVariant
|
27
97
|
* @type {object}
|
28
|
-
* @property {
|
29
|
-
*
|
98
|
+
* @property {string} identifier E.g., "02002145"
|
99
|
+
* @property {string} inventory E.g., "IN STOCK"
|
100
|
+
* @property {EquinoxProductVariantProperties} properties
|
101
|
+
* @property {any[]} promotion E.g., ???
|
102
|
+
* @property {EquinoxProductPriceFacets} priceFacets
|
103
|
+
* @property {EquinoxProductInventoryProperties} inventoryProperties
|
104
|
+
* @property {EquinxProductTotalValue} totalValue
|
105
|
+
* @property {boolean} [default] For multi-variant products, this indicates that this is the searched SKU
|
30
106
|
* when using catalogs/search endpoint.
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
*
|
35
|
-
* @typedef EquinoxProductProperties
|
107
|
+
*/
|
108
|
+
|
109
|
+
/**
|
110
|
+
* @typedef EquinoxProductVariantProperties
|
36
111
|
* @type {object}
|
37
|
-
* @property {string} availableChannels
|
38
|
-
*
|
39
|
-
*
|
40
|
-
*
|
41
|
-
*
|
42
|
-
*
|
43
|
-
* @
|
112
|
+
* @property {string} availableChannels E.g., "subscription,arsPhone,kiosk,mobile,web"
|
113
|
+
* @property {string} imageURL E.g., "https://nuskin.com/cont...21/ca-180-Ampoule-refreshed.jpg"
|
114
|
+
* @property {string} name E.g., "180° Cell Renewal Fluid"
|
115
|
+
* @property {string} market E.g., "CA"
|
116
|
+
* @property {string} description E.g., "180° Ampoule"
|
117
|
+
* @property {string} ingredients
|
118
|
+
* @property {string} benefits
|
119
|
+
* @property {string} usage
|
120
|
+
* @property {string} resources
|
121
|
+
* @property {string} scanQualifiedCount E.g., "0"
|
122
|
+
* @property {string} customerTypes E.g., "BrandAffiliate,Preferred,Retail"
|
123
|
+
* @property {string} division E.g., "Nu Skin"
|
124
|
+
* @property {string} status E.g., "active"
|
125
|
+
* @property {string} size E.g., "30 mL / 1 fl.oz"
|
126
|
+
* @property {string} [variantLabel]
|
127
|
+
* @property {string} [isExclusive] E.g., "false" - Why is this a string??
|
128
|
+
*/
|
129
|
+
|
130
|
+
/**
|
131
|
+
* @description Why are properties not camelCase and type of string instead of number? Super weird!
|
132
|
+
* @typedef EquinoxProductPriceFacets
|
44
133
|
* @type {object}
|
45
|
-
* @property {
|
46
|
-
* @property {
|
47
|
-
*
|
48
|
-
*
|
49
|
-
*
|
134
|
+
* @property {string} CV E.g., "76.0"
|
135
|
+
* @property {string} Regular Price E.g., "76.0"
|
136
|
+
* @property {string} PV E.g., "54.15"
|
137
|
+
* @property {string} Wholesale Price E.g., "88.0"
|
138
|
+
* @property {string} SB E.g., "4.25"
|
139
|
+
*/
|
140
|
+
|
141
|
+
/**
|
142
|
+
* @description
|
143
|
+
* @typedef EquinoxProductInventoryProperties
|
144
|
+
* @type {object}
|
145
|
+
* @property {boolean} available E.g., true
|
146
|
+
* @property {boolean} lowStock E.g., false
|
147
|
+
* @property {string} binName E.g., "1046_CA01"
|
148
|
+
* @property {boolean} backOrdered E.g., false
|
149
|
+
* @property {number} expectedBackOrderAvailabilityDate E.g., 0
|
150
|
+
* @property {boolean} preOrdered E.g., false
|
151
|
+
* @property {number} expectedPreOrderAvailabilityDate E.g., 0
|
152
|
+
* @property {number} atpQty E.g., 49882
|
153
|
+
* @property {number} preOrderedQty E.g., 0
|
154
|
+
* @property {number} backOrderedQty E.g., 0
|
155
|
+
* @property {number|null} lowStockThreshold E.g., null
|
156
|
+
* @property {number|null} outOfStockThreshold E.g., null
|
157
|
+
*/
|
158
|
+
|
159
|
+
/**
|
160
|
+
* @description
|
161
|
+
* @typedef EquinxProductTotalValue
|
162
|
+
* @type {object}
|
163
|
+
* @property {number} priceAfterDiscount E.g., 2
|
164
|
+
* @property {number} originalPrice E.g., 2
|
165
|
+
* @property {number} totaldiscount E.g., 0
|
166
|
+
* @property {{
|
167
|
+
* CV: { CV: number },
|
168
|
+
* "Regular Price": {
|
169
|
+
* "Regular Price": number
|
170
|
+
* },
|
171
|
+
* PV: { PV: number },
|
172
|
+
* "Wholesale Price": {
|
173
|
+
* "Wholesale Price": number
|
174
|
+
* },
|
175
|
+
* SB: { SB: number },
|
176
|
+
* }} priceFacets
|
177
|
+
*/
|
178
|
+
|
179
|
+
/**
|
50
180
|
* Standalone types. These are types not related to Product
|
51
181
|
* and Equinox Product models.
|
52
|
-
*
|
53
182
|
* @typedef KitSKUQuantity
|
54
183
|
* @type {object}
|
55
184
|
* @property {string} sku
|
@@ -0,0 +1,70 @@
|
|
1
|
+
const { productNotFound } = require('../models');
|
2
|
+
|
3
|
+
// httpStatus codes
|
4
|
+
const httpStatus = { notFound: 404 };
|
5
|
+
|
6
|
+
/**
|
7
|
+
* productNotFoundInterceptor returns a model "ProductNotFound" when the status code is Not Found.
|
8
|
+
* Note: Do not polute this file. Create a new file for new interceptor.
|
9
|
+
*
|
10
|
+
* @param {import('axios').AxiosError} error
|
11
|
+
* @returns {import('axios').AxiosResponse<import('../').EquinoxResponse>}
|
12
|
+
*/
|
13
|
+
function productNotFoundInterceptor(error) {
|
14
|
+
const segments = 'catalogs/search';
|
15
|
+
const { config, response } = error;
|
16
|
+
|
17
|
+
if (response.status === httpStatus.notFound && config.url.includes(segments)) {
|
18
|
+
const params = new URLSearchParams(config.url);
|
19
|
+
const filterParam = Array.from(params.values())[0];
|
20
|
+
const sku = getSKU(filterParam);
|
21
|
+
|
22
|
+
if (sku !== null) {
|
23
|
+
const response = {
|
24
|
+
...error.response,
|
25
|
+
data: {
|
26
|
+
product: [
|
27
|
+
productNotFound(sku)
|
28
|
+
]
|
29
|
+
},
|
30
|
+
statusText: getStatusText(error.response)
|
31
|
+
};
|
32
|
+
|
33
|
+
return response;
|
34
|
+
}
|
35
|
+
|
36
|
+
console.error('Unable to detect SKU from the given parameter', filterParam);
|
37
|
+
}
|
38
|
+
|
39
|
+
return Promise.reject(error);
|
40
|
+
}
|
41
|
+
|
42
|
+
/**
|
43
|
+
* getSKU returns the SKU from the given parameter.
|
44
|
+
* @param {string} param '\\''index_key_productId="02010489" OR index_key_skuId="02010489"'''
|
45
|
+
* @returns {string|null} SKU
|
46
|
+
*/
|
47
|
+
function getSKU(param) {
|
48
|
+
const result = param.match(/\d{8}/);
|
49
|
+
|
50
|
+
if (result === null) {
|
51
|
+
return null;
|
52
|
+
}
|
53
|
+
|
54
|
+
return result[0];
|
55
|
+
}
|
56
|
+
|
57
|
+
/**
|
58
|
+
* @param {import('axios').AxiosResponse<import('../').EquinoxErrorResponse>} [response]
|
59
|
+
* @returns {string}
|
60
|
+
*/
|
61
|
+
function getStatusText(response) {
|
62
|
+
if (response) {
|
63
|
+
const { code, message, timestamp } = response.data;
|
64
|
+
return `Floating product found -- ${timestamp} ${code}: ${message}`;
|
65
|
+
}
|
66
|
+
|
67
|
+
return '';
|
68
|
+
}
|
69
|
+
|
70
|
+
module.exports = productNotFoundInterceptor;
|
@@ -0,0 +1,182 @@
|
|
1
|
+
// @ts-check
|
2
|
+
/**
|
3
|
+
* mapProperties maps the properties of a product.
|
4
|
+
* @param {import('../').EquinoxProductProperties} props
|
5
|
+
*/
|
6
|
+
function mapProperties(props) {
|
7
|
+
/** @type {import('../').EquinoxProductProperties} */
|
8
|
+
const properties = {};
|
9
|
+
properties.name = mapName(props.name);
|
10
|
+
properties.description = mapDescription(props.description);
|
11
|
+
properties.productDetailsDescription = mapProductDetailsDescription(props.productDetailsDescription);
|
12
|
+
properties.ingredients = mapIngredients(props.ingredients);
|
13
|
+
properties.benefits = mapBenefits(props.benefits);
|
14
|
+
properties.usage = mapUsage(props.usage);
|
15
|
+
properties.scanQualifiedCount = mapScanQualifiedCount(props.scanQualifiedCount);
|
16
|
+
properties.division = mapDivision(props.division);
|
17
|
+
properties.imageURL = mapImageURL(props.imageURL);
|
18
|
+
properties.market = mapMarket(props.market);
|
19
|
+
properties.resources = mapResources(props.resources);
|
20
|
+
properties.customerTypes = mapCustomerTypes(props.customerTypes);
|
21
|
+
properties.size = mapSize(props.size);
|
22
|
+
|
23
|
+
return properties;
|
24
|
+
}
|
25
|
+
|
26
|
+
/**
|
27
|
+
* @param {string|undefined} name
|
28
|
+
* @returns {string}
|
29
|
+
*/
|
30
|
+
function mapName(name) {
|
31
|
+
if (name) {
|
32
|
+
return name;
|
33
|
+
}
|
34
|
+
|
35
|
+
return '';
|
36
|
+
}
|
37
|
+
|
38
|
+
/**
|
39
|
+
* @param {string|undefined} description
|
40
|
+
* @returns {string}
|
41
|
+
*/
|
42
|
+
function mapDescription(description) {
|
43
|
+
if (description) {
|
44
|
+
return description;
|
45
|
+
}
|
46
|
+
|
47
|
+
return '';
|
48
|
+
}
|
49
|
+
|
50
|
+
/**
|
51
|
+
* @param {string} productDetailsDescription
|
52
|
+
* @returns {string}
|
53
|
+
*/
|
54
|
+
function mapProductDetailsDescription(productDetailsDescription) {
|
55
|
+
if (productDetailsDescription) {
|
56
|
+
return productDetailsDescription;
|
57
|
+
}
|
58
|
+
|
59
|
+
return '';
|
60
|
+
}
|
61
|
+
|
62
|
+
/**
|
63
|
+
* @param {string|undefined} ingredients
|
64
|
+
* @returns {string}
|
65
|
+
*/
|
66
|
+
function mapIngredients(ingredients) {
|
67
|
+
if (ingredients) {
|
68
|
+
return ingredients;
|
69
|
+
}
|
70
|
+
|
71
|
+
return '';
|
72
|
+
}
|
73
|
+
|
74
|
+
/**
|
75
|
+
* @param {string|undefined} benefits
|
76
|
+
* @returns {string}
|
77
|
+
*/
|
78
|
+
function mapBenefits(benefits) {
|
79
|
+
if (benefits) {
|
80
|
+
return benefits;
|
81
|
+
}
|
82
|
+
|
83
|
+
return '';
|
84
|
+
}
|
85
|
+
|
86
|
+
/**
|
87
|
+
* @param {string|undefined} usage
|
88
|
+
* @returns {string}
|
89
|
+
*/
|
90
|
+
function mapUsage(usage) {
|
91
|
+
if (usage) {
|
92
|
+
return usage;
|
93
|
+
}
|
94
|
+
|
95
|
+
return '';
|
96
|
+
}
|
97
|
+
|
98
|
+
/**
|
99
|
+
* @param {string|undefined} scanQualifiedCount
|
100
|
+
* @returns {string}
|
101
|
+
*/
|
102
|
+
function mapScanQualifiedCount(scanQualifiedCount) {
|
103
|
+
if (scanQualifiedCount) {
|
104
|
+
return scanQualifiedCount;
|
105
|
+
}
|
106
|
+
|
107
|
+
return '';
|
108
|
+
}
|
109
|
+
|
110
|
+
/**
|
111
|
+
* @param {string|undefined} division
|
112
|
+
* @returns {string}
|
113
|
+
*/
|
114
|
+
function mapDivision(division) {
|
115
|
+
if (division) {
|
116
|
+
return division;
|
117
|
+
}
|
118
|
+
|
119
|
+
return '';
|
120
|
+
}
|
121
|
+
|
122
|
+
/**
|
123
|
+
* @param {string|undefined} imageURL
|
124
|
+
* @returns {string}
|
125
|
+
*/
|
126
|
+
function mapImageURL(imageURL) {
|
127
|
+
if (imageURL) {
|
128
|
+
return imageURL;
|
129
|
+
}
|
130
|
+
|
131
|
+
return '';
|
132
|
+
}
|
133
|
+
|
134
|
+
/**
|
135
|
+
* @param {string|undefined} market
|
136
|
+
* @returns {string}
|
137
|
+
*/
|
138
|
+
function mapMarket(market) {
|
139
|
+
if (market) {
|
140
|
+
return market;
|
141
|
+
}
|
142
|
+
|
143
|
+
return '';
|
144
|
+
}
|
145
|
+
|
146
|
+
/**
|
147
|
+
* @param {string|undefined} resources
|
148
|
+
* @returns {string}
|
149
|
+
*/
|
150
|
+
function mapResources(resources) {
|
151
|
+
if (resources) {
|
152
|
+
return resources;
|
153
|
+
}
|
154
|
+
|
155
|
+
return '';
|
156
|
+
}
|
157
|
+
|
158
|
+
/**
|
159
|
+
* @param {string|undefined} customerTypes
|
160
|
+
* @returns {string}
|
161
|
+
*/
|
162
|
+
function mapCustomerTypes(customerTypes) {
|
163
|
+
if (customerTypes) {
|
164
|
+
return customerTypes;
|
165
|
+
}
|
166
|
+
|
167
|
+
return '';
|
168
|
+
}
|
169
|
+
|
170
|
+
/**
|
171
|
+
* @param {string|undefined} size
|
172
|
+
* @returns {string}
|
173
|
+
*/
|
174
|
+
function mapSize(size) {
|
175
|
+
if (size) {
|
176
|
+
return size;
|
177
|
+
}
|
178
|
+
|
179
|
+
return '';
|
180
|
+
}
|
181
|
+
|
182
|
+
module.exports = mapProperties;
|
@@ -0,0 +1,32 @@
|
|
1
|
+
// @ts-check
|
2
|
+
const { mapProperties } = require('../mappers');
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @param {string} sku
|
6
|
+
* @returns {import('../').EquinoxProduct}
|
7
|
+
*/
|
8
|
+
function productNotFound(sku) {
|
9
|
+
/** @type {import('../').EquinoxProduct} */
|
10
|
+
const model = {};
|
11
|
+
model.identifier = sku || '';
|
12
|
+
model.properties = mapProperties({
|
13
|
+
name: '',
|
14
|
+
imageURL: '',
|
15
|
+
market: '',
|
16
|
+
description: '',
|
17
|
+
customerTypes: '',
|
18
|
+
division: '',
|
19
|
+
ingredients: '',
|
20
|
+
benefits: '',
|
21
|
+
usage: '',
|
22
|
+
resources: '',
|
23
|
+
scanQualifiedCount: '',
|
24
|
+
status: '',
|
25
|
+
size: '',
|
26
|
+
productDetailsDescription: ''
|
27
|
+
});
|
28
|
+
|
29
|
+
return model;
|
30
|
+
}
|
31
|
+
|
32
|
+
module.exports = productNotFound;
|
package/src/product.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
|
3
|
-
const { isTrue }
|
3
|
+
const { isTrue } = require("@nuskin/ns-common-lib");
|
4
4
|
|
5
5
|
const ProductUtils = require("./productUtils.js");
|
6
6
|
|
@@ -8,7 +8,7 @@ const Agelocme = require("./agelocme.js");
|
|
8
8
|
const PriceType = require("./models/priceType.js");
|
9
9
|
const ProductStatus = require("./models/productStatus.js");
|
10
10
|
|
11
|
-
const Product = function
|
11
|
+
const Product = function(productData) {
|
12
12
|
this.priceMap = {};
|
13
13
|
this.pvMap = {};
|
14
14
|
this.cvMap = {};
|
@@ -76,15 +76,14 @@ const Product = function (productData) {
|
|
76
76
|
//@example "IN STOCK"
|
77
77
|
this.inventory = "";
|
78
78
|
this.equinoxProductId = "";
|
79
|
-
this.properties = {};
|
80
79
|
|
81
|
-
this.setMarketAttributes = function
|
80
|
+
this.setMarketAttributes = function(productStatus) {
|
82
81
|
if (productStatus.marketAttributes) {
|
83
82
|
this.marketAttributes = productStatus.marketAttributes;
|
84
83
|
}
|
85
84
|
};
|
86
85
|
|
87
|
-
this.getAgelocmeKeyPart = function
|
86
|
+
this.getAgelocmeKeyPart = function() {
|
88
87
|
let keyPart = null;
|
89
88
|
if (this.agelocme) {
|
90
89
|
keyPart =
|
@@ -98,27 +97,27 @@ const Product = function (productData) {
|
|
98
97
|
return keyPart;
|
99
98
|
};
|
100
99
|
|
101
|
-
this.getHighlightedSku = function
|
100
|
+
this.getHighlightedSku = function() {
|
102
101
|
let rv = this.sku;
|
103
102
|
if (this.highlightedSku) rv = this.highlightedSku;
|
104
103
|
return rv;
|
105
104
|
};
|
106
105
|
|
107
|
-
this.getProductSearchTitle = function
|
106
|
+
this.getProductSearchTitle = function() {
|
108
107
|
if (this.agelocme && this.agelocme.label) {
|
109
108
|
return this.agelocme.label;
|
110
109
|
}
|
111
110
|
return this.title;
|
112
111
|
};
|
113
112
|
|
114
|
-
this.getProductSearchSku = function
|
113
|
+
this.getProductSearchSku = function() {
|
115
114
|
if (this.agelocme && this.agelocme.code) {
|
116
115
|
return this.agelocme.code;
|
117
116
|
}
|
118
117
|
return this.getHighlightedSku();
|
119
118
|
};
|
120
119
|
|
121
|
-
this.getDescription = function
|
120
|
+
this.getDescription = function() {
|
122
121
|
let description = this.longDescr;
|
123
122
|
if (!description || description.length === 0) {
|
124
123
|
return this.shortDescr;
|
@@ -126,7 +125,7 @@ const Product = function (productData) {
|
|
126
125
|
return description;
|
127
126
|
};
|
128
127
|
|
129
|
-
this.setFullImage = function
|
128
|
+
this.setFullImage = function(fullImage) {
|
130
129
|
if (fullImage) {
|
131
130
|
this.fullImage = fullImage.replace("http:", "https:");
|
132
131
|
} else {
|
@@ -134,19 +133,19 @@ const Product = function (productData) {
|
|
134
133
|
}
|
135
134
|
};
|
136
135
|
|
137
|
-
this.getFullImage = function
|
136
|
+
this.getFullImage = function() {
|
138
137
|
return this.fullImage ? this.fullImage.replace("http:", "https:") : "";
|
139
138
|
};
|
140
139
|
|
141
|
-
this.setProductCarouselImages = function
|
140
|
+
this.setProductCarouselImages = function(productCarouselImages) {
|
142
141
|
this.productCarouselImages = productCarouselImages;
|
143
142
|
};
|
144
143
|
|
145
|
-
this.getProductCarouselImages = function
|
144
|
+
this.getProductCarouselImages = function() {
|
146
145
|
return this.productCarouselImages;
|
147
146
|
};
|
148
147
|
|
149
|
-
this.setImageAltText = function
|
148
|
+
this.setImageAltText = function(altText) {
|
150
149
|
if (altText) {
|
151
150
|
this.imageAltText = altText;
|
152
151
|
} else {
|
@@ -154,11 +153,11 @@ const Product = function (productData) {
|
|
154
153
|
}
|
155
154
|
};
|
156
155
|
|
157
|
-
this.getImageAltText = function
|
156
|
+
this.getImageAltText = function() {
|
158
157
|
return this.imageAltText || this.title;
|
159
158
|
};
|
160
159
|
|
161
|
-
this.setThumbnail = function
|
160
|
+
this.setThumbnail = function(thumbnail) {
|
162
161
|
if (thumbnail) {
|
163
162
|
this.thumbnail = thumbnail.replace("http:", "https:");
|
164
163
|
} else {
|
@@ -166,7 +165,7 @@ const Product = function (productData) {
|
|
166
165
|
}
|
167
166
|
};
|
168
167
|
|
169
|
-
this.setThumbnailFromSku = function
|
168
|
+
this.setThumbnailFromSku = function(sku) {
|
170
169
|
// WARNING: Base URL will need to be handled in the client (call setBaseUrl)
|
171
170
|
// eslint-disable-next-line max-len
|
172
171
|
// this.thumbnail = `${RunConfigService.getBaseUrl()}/content/products/${ProductUtils.getTokenizedSku(sku)}/jcr:content/fullImage.img.100.100.png`;
|
@@ -176,43 +175,43 @@ const Product = function (productData) {
|
|
176
175
|
)}/jcr:content/fullImage.img.100.100.png`;
|
177
176
|
};
|
178
177
|
|
179
|
-
this.getThumbnail = function
|
178
|
+
this.getThumbnail = function() {
|
180
179
|
return this.thumbnail ? this.thumbnail.replace("http:", "https:") : "";
|
181
180
|
};
|
182
181
|
|
183
|
-
this.hasAvailableQuantity = function
|
182
|
+
this.hasAvailableQuantity = function(qty = 1) {
|
184
183
|
return Math.min(this.maxQuantity, this.availableQuantity) >= qty;
|
185
184
|
};
|
186
185
|
|
187
|
-
this.setPoints = function
|
186
|
+
this.setPoints = function(points) {
|
188
187
|
this.points = ensureFloatVal(points) || "";
|
189
188
|
};
|
190
189
|
|
191
|
-
this.getPointsFixed = function
|
190
|
+
this.getPointsFixed = function() {
|
192
191
|
return parseFloat(this.points).toFixed(2);
|
193
192
|
};
|
194
193
|
|
195
|
-
this.setCv = function
|
194
|
+
this.setCv = function(cv) {
|
196
195
|
this.cv = ensureFloatVal(cv) || "";
|
197
196
|
};
|
198
197
|
|
199
|
-
this.getCvFixed = function
|
198
|
+
this.getCvFixed = function() {
|
200
199
|
return parseFloat(this.cv).toFixed(2);
|
201
200
|
};
|
202
201
|
|
203
|
-
this.setPv = function
|
202
|
+
this.setPv = function(pv) {
|
204
203
|
this.pv = ensureFloatVal(pv) || "";
|
205
204
|
};
|
206
205
|
|
207
|
-
this.getPvFixed = function
|
206
|
+
this.getPvFixed = function() {
|
208
207
|
return parseFloat(this.pv || 0).toFixed(2);
|
209
208
|
};
|
210
209
|
|
211
|
-
this.setPrice = function
|
210
|
+
this.setPrice = function(price) {
|
212
211
|
this.price = ensureFloatVal(price, true);
|
213
212
|
};
|
214
213
|
|
215
|
-
this.setFormattedPrice = function
|
214
|
+
this.setFormattedPrice = function(formattedPrice) {
|
216
215
|
this.formattedPrice = formattedPrice;
|
217
216
|
};
|
218
217
|
|
@@ -221,13 +220,13 @@ const Product = function (productData) {
|
|
221
220
|
* added to the cart the event pricing needs to be remembered if toggling between
|
222
221
|
* pricetypes with event pricing and pricetype without event pricing
|
223
222
|
*/
|
224
|
-
this.lockEventName = function
|
223
|
+
this.lockEventName = function() {
|
225
224
|
if (!this.savedEventName && this.eventName) {
|
226
225
|
this.savedEventName = this.eventName;
|
227
226
|
}
|
228
227
|
};
|
229
228
|
|
230
|
-
this.setPriceAndPvFromType = function
|
229
|
+
this.setPriceAndPvFromType = function(_priceType, _activeEvents = null, option = {}) {
|
231
230
|
// WARNING: priceType needs to be handled client-side
|
232
231
|
// const priceType = ConfigService.getMarketConfig().showWholeSalePricing && !AccountManager.isLoggedIn()
|
233
232
|
// ? PriceType.WWHL
|
@@ -272,11 +271,11 @@ const Product = function (productData) {
|
|
272
271
|
return changed;
|
273
272
|
};
|
274
273
|
|
275
|
-
this.getPrice = function
|
274
|
+
this.getPrice = function() {
|
276
275
|
return this.price ? this.price : 0;
|
277
276
|
};
|
278
277
|
|
279
|
-
this.getPriceFixed = function
|
278
|
+
this.getPriceFixed = function() {
|
280
279
|
if (typeof this.price === "number") {
|
281
280
|
return parseFloat(this.price.toFixed(2));
|
282
281
|
} else {
|
@@ -284,15 +283,15 @@ const Product = function (productData) {
|
|
284
283
|
}
|
285
284
|
};
|
286
285
|
|
287
|
-
this.getOriginalPrice = function
|
286
|
+
this.getOriginalPrice = function() {
|
288
287
|
return this.priceType ? this.priceMap[this.priceType] : null;
|
289
288
|
};
|
290
289
|
|
291
|
-
this.addPricing = function
|
290
|
+
this.addPricing = function(type, price) {
|
292
291
|
this.priceMap[type] = price;
|
293
292
|
};
|
294
293
|
|
295
|
-
this.addPricingFromStatus = function
|
294
|
+
this.addPricingFromStatus = function(productStatus, priceType, option ={}) {
|
296
295
|
let modified = false;
|
297
296
|
|
298
297
|
if (!priceType) {
|
@@ -327,7 +326,7 @@ const Product = function (productData) {
|
|
327
326
|
}, this);
|
328
327
|
}
|
329
328
|
this.orderTypes = ProductUtils.mergeOrderTypes(this.orderTypes, productStatus.orderType);
|
330
|
-
if
|
329
|
+
if(productStatus.childSkus) {
|
331
330
|
this.childSkus = productStatus.childSkus;
|
332
331
|
}
|
333
332
|
this.setPriceAndPvFromType(priceType, null, option);
|
@@ -347,15 +346,15 @@ const Product = function (productData) {
|
|
347
346
|
return modified;
|
348
347
|
};
|
349
348
|
|
350
|
-
this.addPvWithType = function
|
349
|
+
this.addPvWithType = function(type, pv) {
|
351
350
|
this.pvMap[type] = pv;
|
352
351
|
};
|
353
352
|
|
354
|
-
this.addCvWithType = function
|
353
|
+
this.addCvWithType = function(type, cv) {
|
355
354
|
this.cvMap[type] = cv;
|
356
355
|
};
|
357
356
|
|
358
|
-
this.getPricing = function
|
357
|
+
this.getPricing = function(type) {
|
359
358
|
let retVal = null;
|
360
359
|
|
361
360
|
if (type) {
|
@@ -382,7 +381,7 @@ const Product = function (productData) {
|
|
382
381
|
return eventPriceTypes;
|
383
382
|
};
|
384
383
|
|
385
|
-
this.getPvWithType = function
|
384
|
+
this.getPvWithType = function(type) {
|
386
385
|
let rv = this.pvMap[type];
|
387
386
|
if (rv == null) {
|
388
387
|
// Assumption: we always have WWHL from the service
|
@@ -392,7 +391,7 @@ const Product = function (productData) {
|
|
392
391
|
return rv;
|
393
392
|
};
|
394
393
|
|
395
|
-
this.getCvWithType = function
|
394
|
+
this.getCvWithType = function(type) {
|
396
395
|
let rv = this.cvMap[type];
|
397
396
|
if (rv == null) {
|
398
397
|
rv = this.cvMap[PriceType.WWHL];
|
@@ -400,77 +399,77 @@ const Product = function (productData) {
|
|
400
399
|
return rv;
|
401
400
|
};
|
402
401
|
|
403
|
-
this.hasAdrOption = function
|
402
|
+
this.hasAdrOption = function() {
|
404
403
|
return this.orderTypes["adr"];
|
405
404
|
};
|
406
405
|
|
407
|
-
this.isAdrOnly = function
|
406
|
+
this.isAdrOnly = function() {
|
408
407
|
return this.hasAdrOption() && !this.hasOrderOption();
|
409
408
|
};
|
410
409
|
|
411
|
-
this.hasMultipleOrderTypes = function
|
410
|
+
this.hasMultipleOrderTypes = function() {
|
412
411
|
return this.hasOrderOption() && this.hasAdrOption();
|
413
412
|
};
|
414
413
|
|
415
|
-
this.hasOrderOption = function
|
414
|
+
this.hasOrderOption = function() {
|
416
415
|
return this.orderTypes["order"];
|
417
416
|
};
|
418
417
|
|
419
|
-
this.isDistributor = function
|
418
|
+
this.isDistributor = function() {
|
420
419
|
return this.custTypes.includes("10");
|
421
420
|
};
|
422
421
|
|
423
|
-
this.isCustomer = function
|
422
|
+
this.isCustomer = function() {
|
424
423
|
return this.custTypes.includes("20");
|
425
424
|
};
|
426
425
|
|
427
|
-
this.isPreferredCustomer = function
|
426
|
+
this.isPreferredCustomer = function() {
|
428
427
|
return this.custTypes.includes("30");
|
429
428
|
};
|
430
429
|
|
431
|
-
this.isBase = function
|
430
|
+
this.isBase = function() {
|
432
431
|
return this.sku.substring(2, 4) === "55";
|
433
432
|
};
|
434
433
|
|
435
|
-
this.isVariant = function
|
434
|
+
this.isVariant = function() {
|
436
435
|
return this.baseSku.length > 0 && this.variantSkus().length === 0;
|
437
436
|
};
|
438
437
|
|
439
|
-
this.setVariant = function
|
438
|
+
this.setVariant = function(variantProduct) {
|
440
439
|
if (variantProduct && variantProduct.sku) {
|
441
440
|
this.variants[variantProduct.sku] = variantProduct;
|
442
441
|
}
|
443
442
|
};
|
444
443
|
|
445
|
-
this.getVariant = function
|
444
|
+
this.getVariant = function(sku) {
|
446
445
|
return this.variants[sku];
|
447
446
|
};
|
448
447
|
|
449
|
-
this.variantSkus = function
|
448
|
+
this.variantSkus = function() {
|
450
449
|
return Object.keys(this.variants);
|
451
450
|
};
|
452
451
|
|
453
|
-
this.getVariantsList = function
|
452
|
+
this.getVariantsList = function() {
|
454
453
|
return Object.values(this.variants);
|
455
454
|
};
|
456
455
|
|
457
|
-
this.getMinPrice = function
|
456
|
+
this.getMinPrice = function() {
|
458
457
|
return this.priceMap[`min-${this.priceType}`];
|
459
458
|
};
|
460
459
|
|
461
|
-
this.getMaxPrice = function
|
460
|
+
this.getMaxPrice = function() {
|
462
461
|
return this.priceMap[`max-${this.priceType}`];
|
463
462
|
};
|
464
463
|
|
465
|
-
this.getMinPv = function
|
464
|
+
this.getMinPv = function() {
|
466
465
|
return this.pvMap[`min-${this.priceType}`];
|
467
466
|
};
|
468
467
|
|
469
|
-
this.getMaxPv = function
|
468
|
+
this.getMaxPv = function() {
|
470
469
|
return this.pvMap[`max-${this.priceType}`];
|
471
470
|
};
|
472
471
|
|
473
|
-
this.toJSON = function
|
472
|
+
this.toJSON = function() {
|
474
473
|
let retData = {};
|
475
474
|
retData.sku = this.sku;
|
476
475
|
retData.globalProductID = this.globalProductID;
|
@@ -535,16 +534,15 @@ const Product = function (productData) {
|
|
535
534
|
retData.addOns = this.addOns;
|
536
535
|
retData.inventory = this.inventory;
|
537
536
|
retData.equinoxProductId = this.equinoxProductId;
|
538
|
-
retData.properties = this.properties;
|
539
537
|
|
540
538
|
return retData;
|
541
539
|
};
|
542
540
|
|
543
|
-
this.setMeCommerceProductData = function
|
541
|
+
this.setMeCommerceProductData = function(/*productData*/) {
|
544
542
|
console.error("setMeCommerceProductData is deprecated!");
|
545
543
|
};
|
546
544
|
|
547
|
-
this.setBaseUrl = function
|
545
|
+
this.setBaseUrl = function(baseUrl) {
|
548
546
|
this.thumbnail = ProductUtils.applyBaseUrl(this.thumbnail, baseUrl);
|
549
547
|
this.fullImage = ProductUtils.applyBaseUrl(this.fullImage, baseUrl);
|
550
548
|
|
@@ -556,7 +554,7 @@ const Product = function (productData) {
|
|
556
554
|
}
|
557
555
|
};
|
558
556
|
|
559
|
-
this.setProductData = function
|
557
|
+
this.setProductData = function(productData) {
|
560
558
|
let data;
|
561
559
|
|
562
560
|
if (productData) {
|
@@ -664,7 +662,7 @@ const Product = function (productData) {
|
|
664
662
|
? data.pvMap
|
665
663
|
: this.pvMap;
|
666
664
|
this.orderTypes = ProductUtils.mergeOrderTypes(this.orderTypes, data.orderTypes);
|
667
|
-
if
|
665
|
+
if(data.childSkus) {
|
668
666
|
this.childSkus = data.childSkus;
|
669
667
|
}
|
670
668
|
this.custTypes = data.custTypes || [];
|
@@ -677,11 +675,10 @@ const Product = function (productData) {
|
|
677
675
|
}
|
678
676
|
|
679
677
|
this.equinoxProductId = data.equinoxProductId;
|
680
|
-
this.properties = data.properties;
|
681
678
|
}
|
682
679
|
};
|
683
680
|
|
684
|
-
this.isEmpty = function
|
681
|
+
this.isEmpty = function() {
|
685
682
|
return (
|
686
683
|
isFieldEmpty(this.sku) &&
|
687
684
|
isFieldEmpty(this.title) &&
|
package/src/productData.js
CHANGED
@@ -6,6 +6,7 @@ const Product = require("./product");
|
|
6
6
|
const CustomerTypes = require('./models/customerTypes');
|
7
7
|
const ProductStatus = require("./models/productStatus");
|
8
8
|
const { mapAvailableQuantity, mapChildSKU } = require('./equinox-helpers');
|
9
|
+
const { productNotFoundInterceptor } = require('./equinox-helpers/interceptors');
|
9
10
|
|
10
11
|
const productTypes = {
|
11
12
|
kit: 'kit'
|
@@ -66,9 +67,11 @@ const ProductData = {
|
|
66
67
|
}
|
67
68
|
|
68
69
|
const filter = skuFilter.join(" OR ")
|
70
|
+
//axios.defaults.withCredentials = true;
|
69
71
|
|
70
72
|
const url = `${config.API_Base_URLs}/orchestrationservices/storefront/catalogs/search/`;
|
71
73
|
const href = `${url}?filter='\\\\''${encodeURI(filter)}'\\''`;
|
74
|
+
axios.interceptors.response.use((res) => res, productNotFoundInterceptor);
|
72
75
|
const response = await axios.request({
|
73
76
|
method: 'get',
|
74
77
|
url: href,
|
@@ -81,6 +84,7 @@ const ProductData = {
|
|
81
84
|
withCredentials: true
|
82
85
|
});
|
83
86
|
|
87
|
+
axios.interceptors.response.eject(productNotFoundInterceptor);
|
84
88
|
return response;
|
85
89
|
},
|
86
90
|
|
@@ -132,11 +136,9 @@ const ProductData = {
|
|
132
136
|
let thumbnailImage = imageURL ? imageURL + '?width=40' : ''
|
133
137
|
|
134
138
|
|
135
|
-
const { eventName, eventLabels, computedPrice, defaultProductPrice
|
139
|
+
const { eventName, eventLabels, computedPrice, defaultProductPrice } = this.getEqProductPromotions(eqVariant);
|
136
140
|
const productPrice = eventName ? defaultProductPrice : eqVariant.priceFacets["Regular Price"];
|
137
141
|
const discountedPrice = eventName ? computedPrice : eqVariant.priceFacets["Regular Price"];
|
138
|
-
const productCVPrice = eventName ? CVPrice : eqVariant.priceFacets.CV;
|
139
|
-
const productPVPrice = eventName ? PVPrice : eqVariant.priceFacets.PV;
|
140
142
|
|
141
143
|
return {
|
142
144
|
"sku": eqVariant.identifier,
|
@@ -243,8 +245,8 @@ const ProductData = {
|
|
243
245
|
"availableQuantity": eqVariant.inventoryProperties.atpQty,
|
244
246
|
"maxQuantity": 999,
|
245
247
|
"points": "",
|
246
|
-
"cv":
|
247
|
-
"pv":
|
248
|
+
"cv": (eqVariant.priceFacets.CV) ? eqVariant.priceFacets.CV : '',
|
249
|
+
"pv": eqVariant.priceFacets.PV,
|
248
250
|
"priceType": "WRTL",
|
249
251
|
"price": discountedPrice,
|
250
252
|
"priceMap": {
|
@@ -257,14 +259,14 @@ const ProductData = {
|
|
257
259
|
"WHL": eqVariant.priceFacets["Wholesale Price"]
|
258
260
|
},
|
259
261
|
"cvMap": {
|
260
|
-
"WWHL":
|
261
|
-
"WADW":
|
262
|
-
"WHL":
|
262
|
+
"WWHL": (eqVariant.priceFacets.CV) ? eqVariant.priceFacets.CV : '',
|
263
|
+
"WADW": (eqVariant.priceFacets.CV) ? eqVariant.priceFacets.CV : '',
|
264
|
+
"WHL": (eqVariant.priceFacets.CV) ? eqVariant.priceFacets.CV : ''
|
263
265
|
},
|
264
266
|
"pvMap": {
|
265
|
-
"WWHL":
|
266
|
-
"WADW":
|
267
|
-
"WHL":
|
267
|
+
"WWHL": eqVariant.priceFacets.PV,
|
268
|
+
"WADW": eqVariant.priceFacets.PV,
|
269
|
+
"WHL": eqVariant.priceFacets.PV
|
268
270
|
},
|
269
271
|
"orderTypes": this._setOrderType(eqVariant.properties),
|
270
272
|
"custTypes": this.switchCustType(eqVariant.properties.customerTypes),
|
@@ -297,8 +299,7 @@ const ProductData = {
|
|
297
299
|
},
|
298
300
|
"restrictedMarkets": [],
|
299
301
|
"addOns": [],
|
300
|
-
"equinoxProductId": eqVariant.identifier
|
301
|
-
"properties": eqVariant.properties
|
302
|
+
"equinoxProductId": eqVariant.identifier
|
302
303
|
};
|
303
304
|
},
|
304
305
|
|
@@ -322,16 +323,6 @@ const ProductData = {
|
|
322
323
|
const computedPrice = product.totalValue && product.totalValue.priceAfterDiscount
|
323
324
|
? product.totalValue.priceAfterDiscount
|
324
325
|
: 0;
|
325
|
-
|
326
|
-
let CVPrice = 0,
|
327
|
-
PVPrice = 0;
|
328
|
-
|
329
|
-
if (product.totalValue && product.totalValue.priceFacets) {
|
330
|
-
const productPriceFacets = product.totalValue.priceFacets;
|
331
|
-
CVPrice = productPriceFacets.CV && productPriceFacets.CV.CVAfterDiscount ? productPriceFacets.CV.CVAfterDiscount : 0;
|
332
|
-
PVPrice = productPriceFacets.PV && productPriceFacets.PV.PVAfterDiscount ? productPriceFacets.PV.PVAfterDiscount : 0;
|
333
|
-
}
|
334
|
-
|
335
326
|
let eventName = "";
|
336
327
|
const eventLabels = [];
|
337
328
|
|
@@ -345,19 +336,17 @@ const ProductData = {
|
|
345
336
|
eventLabels: eventLabels.join(','),
|
346
337
|
defaultProductPrice,
|
347
338
|
computedPrice,
|
348
|
-
eventName
|
349
|
-
CVPrice,
|
350
|
-
PVPrice
|
339
|
+
eventName
|
351
340
|
}
|
352
341
|
},
|
353
342
|
|
354
343
|
eqProductMapper: async function (productDataResponse, skus) {
|
355
344
|
let count = 0;
|
345
|
+
let variants = {};
|
356
346
|
const products = [];
|
357
347
|
|
358
348
|
for (const productData of productDataResponse) {
|
359
349
|
try {
|
360
|
-
let variants = {};
|
361
350
|
let product = (productData.type && productData.type === "kit") ? productData : productData.sku[count];
|
362
351
|
let imageURL = product.properties.imageURL ? product.properties.imageURL : '';
|
363
352
|
let thumbnailImage = imageURL ? imageURL + '?width=40' : ''
|
@@ -375,14 +364,10 @@ const ProductData = {
|
|
375
364
|
eventName,
|
376
365
|
eventLabels,
|
377
366
|
computedPrice,
|
378
|
-
defaultProductPrice
|
379
|
-
CVPrice,
|
380
|
-
PVPrice
|
367
|
+
defaultProductPrice
|
381
368
|
} = this.getEqProductPromotions(product);
|
382
369
|
const productPrice = eventName ? defaultProductPrice : product.priceFacets["Regular Price"];
|
383
370
|
const discountedPrice = eventName ? computedPrice : product.priceFacets["Regular Price"];
|
384
|
-
const productCVPrice = eventName ? CVPrice : product.priceFacets.CV;
|
385
|
-
const productPVPrice = eventName ? PVPrice : product.priceFacets.PV;
|
386
371
|
|
387
372
|
product.childSkus = await this.fetchChildSkus(product);
|
388
373
|
product.availableQuantity = mapAvailableQuantity(product);
|
@@ -421,8 +406,8 @@ const ProductData = {
|
|
421
406
|
"scanQualified": productData.properties.scanQualifiedCount,
|
422
407
|
"maxQuantity": 999,
|
423
408
|
"points": "",
|
424
|
-
"cv":
|
425
|
-
"pv":
|
409
|
+
"cv": (product.priceFacets.CV) ? product.priceFacets.CV : '',
|
410
|
+
"pv": product.priceFacets.PV,
|
426
411
|
"priceType": "WRTL",
|
427
412
|
"price": discountedPrice,
|
428
413
|
"priceMap": {
|
@@ -435,14 +420,14 @@ const ProductData = {
|
|
435
420
|
"WWHL": product.priceFacets["Wholesale Price"]
|
436
421
|
},
|
437
422
|
"cvMap": {
|
438
|
-
"WWHL":
|
439
|
-
"WADW":
|
440
|
-
"WHL":
|
423
|
+
"WWHL": (product.priceFacets.CV) ? product.priceFacets.CV : '',
|
424
|
+
"WADW": (product.priceFacets.CV) ? product.priceFacets.CV : '',
|
425
|
+
"WHL": (product.priceFacets.CV) ? product.priceFacets.CV : ''
|
441
426
|
},
|
442
427
|
"pvMap": {
|
443
|
-
"WWHL":
|
444
|
-
"WADW":
|
445
|
-
"WHL":
|
428
|
+
"WWHL": product.priceFacets.PV,
|
429
|
+
"WADW": product.priceFacets.PV,
|
430
|
+
"WHL": product.priceFacets.PV
|
446
431
|
},
|
447
432
|
"orderTypes": this._setOrderType(product.properties),
|
448
433
|
"custTypes": this.switchCustType(product.properties.customerTypes),
|
@@ -477,8 +462,7 @@ const ProductData = {
|
|
477
462
|
"restrictedMarkets": [],
|
478
463
|
"addOns": [],
|
479
464
|
"inventory": product.inventory || "", //inventory label
|
480
|
-
"equinoxProductId": productData.identifier
|
481
|
-
"properties": product.properties
|
465
|
+
"equinoxProductId": productData.identifier
|
482
466
|
};
|
483
467
|
|
484
468
|
products.push(new Product(product));
|