medusa-product-helper 0.0.16 → 0.0.18
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/.medusa/server/src/admin/index.js +59 -117
- package/.medusa/server/src/admin/index.mjs +59 -117
- package/.medusa/server/src/api/store/product-helper/products/route.js +41 -5
- package/.medusa/server/src/api/store/product-helper/products/validators.js +2 -1
- package/.medusa/server/src/providers/filter-providers/availability-provider.js +53 -67
- package/.medusa/server/src/providers/filter-providers/base-filter-provider.js +1 -19
- package/.medusa/server/src/providers/filter-providers/base-product-provider.js +37 -100
- package/.medusa/server/src/providers/filter-providers/category-provider.js +15 -34
- package/.medusa/server/src/providers/filter-providers/collection-provider.js +15 -32
- package/.medusa/server/src/providers/filter-providers/index.js +13 -49
- package/.medusa/server/src/providers/filter-providers/metadata-provider.js +38 -57
- package/.medusa/server/src/providers/filter-providers/price-range-provider.js +66 -79
- package/.medusa/server/src/providers/filter-providers/promotion-provider.js +106 -169
- package/.medusa/server/src/providers/filter-providers/promotion-window-provider.js +53 -93
- package/.medusa/server/src/providers/filter-providers/rating-provider.js +47 -70
- package/.medusa/server/src/services/dynamic-filter-service.js +455 -744
- package/.medusa/server/src/services/filter-provider-loader.js +91 -139
- package/.medusa/server/src/services/filter-provider-registry.js +8 -107
- package/.medusa/server/src/services/product-filter-service.js +127 -174
- package/.medusa/server/src/shared/product-metadata/utils.js +66 -116
- package/.medusa/server/src/utils/query-builders/product-filters.js +89 -111
- package/.medusa/server/src/utils/query-parser.js +24 -76
- package/.medusa/server/src/workflows/add-to-wishlist.js +12 -26
- package/.medusa/server/src/workflows/get-wishlist.js +53 -51
- package/.medusa/server/src/workflows/remove-from-wishlist.js +3 -8
- package/package.json +1 -1
|
@@ -5,99 +5,47 @@
|
|
|
5
5
|
* Normalizes query parameters from both formats:
|
|
6
6
|
* - Bracketed flat: `price_range[min]=10&price_range[max]=100`
|
|
7
7
|
* - Nested objects: `{ price_range: { min: 10, max: 100 } }`
|
|
8
|
-
*
|
|
9
|
-
* This ensures consistent handling regardless of how the HTTP server
|
|
10
|
-
* or query parser processes the query string.
|
|
11
8
|
*/
|
|
12
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
10
|
exports.normalizeQueryParams = normalizeQueryParams;
|
|
14
|
-
/**
|
|
15
|
-
* Parse a query parameter key that may be in bracketed format.
|
|
16
|
-
*
|
|
17
|
-
* Examples:
|
|
18
|
-
* - `price_range[min]` → `{ base: "price_range", key: "min" }`
|
|
19
|
-
* - `promotion[min_discount_percentage]` → `{ base: "promotion", key: "min_discount_percentage" }`
|
|
20
|
-
* - `category_id` → `{ base: "category_id", key: null }`
|
|
21
|
-
*
|
|
22
|
-
* @param key - Query parameter key (may be bracketed or flat)
|
|
23
|
-
* @returns Object with base key and nested key (if bracketed)
|
|
24
|
-
*/
|
|
25
11
|
function parseBracketedKey(key) {
|
|
26
|
-
const
|
|
27
|
-
if (
|
|
28
|
-
return {
|
|
29
|
-
base: bracketMatch[1],
|
|
30
|
-
key: bracketMatch[2],
|
|
31
|
-
};
|
|
12
|
+
const match = key.match(/^([^[]+)\[([^\]]+)\]$/);
|
|
13
|
+
if (match) {
|
|
14
|
+
return { base: match[1], key: match[2] };
|
|
32
15
|
}
|
|
33
|
-
return {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
16
|
+
return { base: key, key: null };
|
|
17
|
+
}
|
|
18
|
+
function isPlainObject(value) {
|
|
19
|
+
return value !== null &&
|
|
20
|
+
typeof value === "object" &&
|
|
21
|
+
!Array.isArray(value) &&
|
|
22
|
+
Object.getPrototypeOf(value) === Object.prototype;
|
|
37
23
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Normalize query parameters to handle both bracketed and nested formats.
|
|
40
|
-
*
|
|
41
|
-
* Converts bracketed flat keys like `price_range[min]=10` into nested objects
|
|
42
|
-
* like `{ price_range: { min: 10 } }`.
|
|
43
|
-
*
|
|
44
|
-
* Also handles already-nested objects, preserving them as-is.
|
|
45
|
-
*
|
|
46
|
-
* @param query - Raw query object (may contain bracketed keys or nested objects)
|
|
47
|
-
* @returns Normalized query object with nested structure
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* ```ts
|
|
51
|
-
* // Input: { "price_range[min]": "10", "price_range[max]": "100" }
|
|
52
|
-
* // Output: { price_range: { min: "10", max: "100" } }
|
|
53
|
-
*
|
|
54
|
-
* // Input: { price_range: { min: 10, max: 100 } }
|
|
55
|
-
* // Output: { price_range: { min: 10, max: 100 } } (unchanged)
|
|
56
|
-
* ```
|
|
57
|
-
*/
|
|
58
24
|
function normalizeQueryParams(query) {
|
|
59
25
|
const normalized = {};
|
|
60
26
|
const nestedKeys = {};
|
|
61
|
-
// First pass: collect all bracketed keys
|
|
62
27
|
for (const [key, value] of Object.entries(query)) {
|
|
63
|
-
const
|
|
64
|
-
if (
|
|
65
|
-
//
|
|
66
|
-
if (!nestedKeys[
|
|
67
|
-
nestedKeys[
|
|
68
|
-
|
|
69
|
-
nestedKeys[parsed.base][parsed.key] = value;
|
|
28
|
+
const { base, key: nestedKey } = parseBracketedKey(key);
|
|
29
|
+
if (nestedKey !== null) {
|
|
30
|
+
// Bracketed key: price_range[min]
|
|
31
|
+
if (!nestedKeys[base])
|
|
32
|
+
nestedKeys[base] = {};
|
|
33
|
+
nestedKeys[base][nestedKey] = value;
|
|
70
34
|
}
|
|
71
35
|
else {
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
if (value !== null &&
|
|
75
|
-
typeof value === "object" &&
|
|
76
|
-
!Array.isArray(value) &&
|
|
77
|
-
Object.getPrototypeOf(value) === Object.prototype) {
|
|
78
|
-
// Already nested, keep as-is
|
|
79
|
-
normalized[parsed.base] = value;
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
// Flat value, add directly
|
|
83
|
-
normalized[parsed.base] = value;
|
|
84
|
-
}
|
|
36
|
+
// Flat key: category_id or already nested object
|
|
37
|
+
normalized[base] = isPlainObject(value) ? value : value;
|
|
85
38
|
}
|
|
86
39
|
}
|
|
87
|
-
//
|
|
88
|
-
for (const [
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
normalized[baseKey] = {
|
|
92
|
-
...normalized[baseKey],
|
|
93
|
-
...nestedValues,
|
|
94
|
-
};
|
|
40
|
+
// Merge bracketed keys into normalized result
|
|
41
|
+
for (const [base, nestedValues] of Object.entries(nestedKeys)) {
|
|
42
|
+
if (isPlainObject(normalized[base])) {
|
|
43
|
+
normalized[base] = { ...normalized[base], ...nestedValues };
|
|
95
44
|
}
|
|
96
45
|
else {
|
|
97
|
-
|
|
98
|
-
normalized[baseKey] = nestedValues;
|
|
46
|
+
normalized[base] = nestedValues;
|
|
99
47
|
}
|
|
100
48
|
}
|
|
101
49
|
return normalized;
|
|
102
50
|
}
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3F1ZXJ5LXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOztBQW1CSCxvREEyQkM7QUE1Q0QsU0FBUyxpQkFBaUIsQ0FBQyxHQUFXO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtJQUVoRCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQzFDLENBQUM7SUFFRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUE7QUFDakMsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsT0FBTyxLQUFLLEtBQUssSUFBSTtRQUNkLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNyQixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTLENBQUE7QUFDMUQsQ0FBQztBQUVELFNBQWdCLG9CQUFvQixDQUFDLEtBQThCO0lBQ2pFLE1BQU0sVUFBVSxHQUE0QixFQUFFLENBQUE7SUFDOUMsTUFBTSxVQUFVLEdBQTRDLEVBQUUsQ0FBQTtJQUU5RCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRXZELElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3ZCLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1lBQzVDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUE7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDTixpREFBaUQ7WUFDakQsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFDekQsQ0FBQztJQUNILENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUM5RCxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBNEIsRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFBO1FBQ3hGLENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQTtRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUMifQ==
|
|
@@ -5,37 +5,25 @@ const utils_1 = require("@medusajs/framework/utils");
|
|
|
5
5
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
6
|
const wishlist_1 = require("../modules/wishlist");
|
|
7
7
|
const validateCustomerAndProductStep = (0, workflows_sdk_1.createStep)("validate-customer-and-product", async (input, { container }) => {
|
|
8
|
-
// Validate customer exists using remote query
|
|
9
8
|
const remoteQuery = container.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
9
|
+
// Validate customer exists
|
|
10
10
|
const customerQuery = (0, utils_1.remoteQueryObjectFromString)({
|
|
11
11
|
entryPoint: "customer",
|
|
12
12
|
fields: ["id"],
|
|
13
|
-
|
|
14
|
-
filters: {
|
|
15
|
-
id: [input.customer_id],
|
|
16
|
-
},
|
|
17
|
-
},
|
|
13
|
+
filters: { id: [input.customer_id] },
|
|
18
14
|
});
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
// Validate product exists using remote query
|
|
15
|
+
const [customer] = await remoteQuery(customerQuery);
|
|
16
|
+
if (!customer)
|
|
17
|
+
throw new Error(`Customer ${input.customer_id} not found`);
|
|
18
|
+
// Validate product exists
|
|
25
19
|
const productQuery = (0, utils_1.remoteQueryObjectFromString)({
|
|
26
20
|
entryPoint: "product",
|
|
27
21
|
fields: ["id"],
|
|
28
|
-
|
|
29
|
-
filters: {
|
|
30
|
-
id: [input.product_id],
|
|
31
|
-
},
|
|
32
|
-
},
|
|
22
|
+
filters: { id: [input.product_id] },
|
|
33
23
|
});
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
throw new Error(`Product with id ${input.product_id} not found`);
|
|
38
|
-
}
|
|
24
|
+
const [product] = await remoteQuery(productQuery);
|
|
25
|
+
if (!product)
|
|
26
|
+
throw new Error(`Product ${input.product_id} not found`);
|
|
39
27
|
return new workflows_sdk_1.StepResponse({
|
|
40
28
|
customer_id: input.customer_id,
|
|
41
29
|
product_id: input.product_id,
|
|
@@ -49,9 +37,7 @@ const addToWishlistStep = (0, workflows_sdk_1.createStep)("add-to-wishlist", asy
|
|
|
49
37
|
exports.addToWishlistWorkflow = (0, workflows_sdk_1.createWorkflow)("add-to-wishlist", (input) => {
|
|
50
38
|
const validated = validateCustomerAndProductStep(input);
|
|
51
39
|
const wishlistItem = addToWishlistStep(validated);
|
|
52
|
-
return new workflows_sdk_1.WorkflowResponse({
|
|
53
|
-
wishlist_item: wishlistItem,
|
|
54
|
-
});
|
|
40
|
+
return new workflows_sdk_1.WorkflowResponse({ wishlist_item: wishlistItem });
|
|
55
41
|
});
|
|
56
42
|
exports.default = exports.addToWishlistWorkflow;
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXRvLXdpc2hsaXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9hZGQtdG8td2lzaGxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBR2tDO0FBRWxDLHFFQUswQztBQUMxQyxrREFBcUQ7QUFrQnJELE1BQU0sOEJBQThCLEdBQUcsSUFBQSwwQkFBVSxFQUMvQywrQkFBK0IsRUFDL0IsS0FBSyxFQUFFLEtBQXlCLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ2pELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQXNCLGlDQUF5QixDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRWxHLDJCQUEyQjtJQUMzQixNQUFNLGFBQWEsR0FBRyxJQUFBLG1DQUEyQixFQUFDO1FBQ2hELFVBQVUsRUFBRSxVQUFVO1FBQ3RCLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQztRQUNkLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRTtLQUNyQyxDQUFDLENBQUE7SUFFRixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDbkQsSUFBSSxDQUFDLFFBQVE7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxDQUFDLFdBQVcsWUFBWSxDQUFDLENBQUE7SUFFekUsMEJBQTBCO0lBQzFCLE1BQU0sWUFBWSxHQUFHLElBQUEsbUNBQTJCLEVBQUM7UUFDL0MsVUFBVSxFQUFFLFNBQVM7UUFDckIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ2QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0tBQ3BDLENBQUMsQ0FBQTtJQUVGLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUNqRCxJQUFJLENBQUMsT0FBTztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLENBQUMsVUFBVSxZQUFZLENBQUMsQ0FBQTtJQUV0RSxPQUFPLElBQUksNEJBQVksQ0FBQztRQUN0QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7UUFDOUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO0tBQzdCLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBO0FBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLDBCQUFVLEVBQ2xDLGlCQUFpQixFQUNqQixLQUFLLEVBQUUsS0FBa0QsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDMUUsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBd0IsMEJBQWUsQ0FBQyxDQUFBO0lBQ2pGLE1BQU0sWUFBWSxHQUFHLE1BQU0sZUFBZSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUU3RixPQUFPLElBQUksNEJBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQTtBQUN2QyxDQUFDLENBQ0YsQ0FBQTtBQUVZLFFBQUEscUJBQXFCLEdBQUcsSUFBQSw4QkFBYyxFQUNqRCxpQkFBaUIsRUFDakIsQ0FBQyxLQUF5QixFQUF5QyxFQUFFO0lBQ25FLE1BQU0sU0FBUyxHQUFHLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRWpELE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO0FBQzlELENBQUMsQ0FDRixDQUFBO0FBRUQsa0JBQWUsNkJBQXFCLENBQUEifQ==
|
|
@@ -8,71 +8,73 @@ const fetchWishlistItemsStep = (0, workflows_sdk_1.createStep)("fetch-wishlist-i
|
|
|
8
8
|
const wishlistService = container.resolve(wishlist_1.WISHLIST_MODULE);
|
|
9
9
|
const wishlist = await wishlistService.getWishlist(input.customer_id, input.options);
|
|
10
10
|
const includeDetails = input.options?.includeDetails ?? false;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
let formattedWishlist = [];
|
|
12
|
+
if (includeDetails && Array.isArray(wishlist)) {
|
|
13
|
+
// When includeDetails is true, wishlist should be array of objects with id, product_id, etc.
|
|
14
|
+
const wishlistItems = wishlist;
|
|
15
|
+
formattedWishlist = wishlistItems.map((item) => ({
|
|
15
16
|
id: item.id,
|
|
16
17
|
product_id: item.product_id,
|
|
17
|
-
created_at: item.created_at
|
|
18
|
+
created_at: item.created_at
|
|
18
19
|
}));
|
|
19
20
|
}
|
|
20
|
-
else {
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
else if (Array.isArray(wishlist)) {
|
|
22
|
+
// When includeDetails is false, wishlist should be array of product_id strings
|
|
23
|
+
const productIds = wishlist;
|
|
24
|
+
formattedWishlist = productIds
|
|
25
|
+
.filter((product_id) => typeof product_id === "string" && product_id.length > 0)
|
|
26
|
+
.map(product_id => ({
|
|
27
|
+
product_id: String(product_id)
|
|
23
28
|
}));
|
|
24
29
|
}
|
|
25
|
-
return new workflows_sdk_1.StepResponse({
|
|
26
|
-
wishlist: formattedWishlist,
|
|
27
|
-
includeDetails,
|
|
28
|
-
});
|
|
30
|
+
return new workflows_sdk_1.StepResponse({ wishlist: formattedWishlist, includeDetails });
|
|
29
31
|
});
|
|
30
32
|
const enrichWithProductDetailsStep = (0, workflows_sdk_1.createStep)("enrich-with-product-details", async (input, { container }) => {
|
|
31
33
|
if (!input.includeDetails || input.wishlist.length === 0) {
|
|
32
|
-
// Return as-is if no details needed or empty
|
|
33
34
|
return new workflows_sdk_1.StepResponse({ wishlist: input.wishlist });
|
|
34
35
|
}
|
|
35
|
-
//
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
"thumbnail",
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
36
|
+
// Validate and extract product IDs
|
|
37
|
+
const productIds = input.wishlist
|
|
38
|
+
.map(item => item.product_id)
|
|
39
|
+
.filter((id) => typeof id === "string" && id.length > 0);
|
|
40
|
+
if (productIds.length === 0) {
|
|
41
|
+
// No valid product IDs, return wishlist as-is
|
|
42
|
+
return new workflows_sdk_1.StepResponse({ wishlist: input.wishlist });
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const remoteQuery = container.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
46
|
+
const queryObject = (0, utils_1.remoteQueryObjectFromString)({
|
|
47
|
+
entryPoint: "product",
|
|
48
|
+
fields: ["id", "title", "handle", "description", "thumbnail", "status", "created_at", "updated_at"],
|
|
49
|
+
filters: { id: productIds },
|
|
50
|
+
});
|
|
51
|
+
const products = await remoteQuery(queryObject);
|
|
52
|
+
// Type-safe product mapping
|
|
53
|
+
const productMap = new Map();
|
|
54
|
+
if (Array.isArray(products)) {
|
|
55
|
+
for (const product of products) {
|
|
56
|
+
if (product && typeof product === "object" && "id" in product && typeof product.id === "string") {
|
|
57
|
+
productMap.set(product.id, product);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const enrichedWishlist = input.wishlist.map(item => ({
|
|
62
|
+
...item,
|
|
63
|
+
product: item.product_id ? (productMap.get(item.product_id) || null) : null
|
|
64
|
+
}));
|
|
65
|
+
return new workflows_sdk_1.StepResponse({ wishlist: enrichedWishlist });
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
// If product query fails, return wishlist without product details
|
|
69
|
+
// Log error but don't fail the workflow
|
|
70
|
+
console.warn("[getWishlistWorkflow] Failed to fetch product details:", error instanceof Error ? error.message : String(error));
|
|
71
|
+
return new workflows_sdk_1.StepResponse({ wishlist: input.wishlist });
|
|
72
|
+
}
|
|
69
73
|
});
|
|
70
74
|
exports.getWishlistWorkflow = (0, workflows_sdk_1.createWorkflow)("get-wishlist", (input) => {
|
|
71
75
|
const wishlistData = fetchWishlistItemsStep(input);
|
|
72
76
|
const enrichedWishlist = enrichWithProductDetailsStep(wishlistData);
|
|
73
|
-
return new workflows_sdk_1.WorkflowResponse({
|
|
74
|
-
wishlist: enrichedWishlist.wishlist,
|
|
75
|
-
});
|
|
77
|
+
return new workflows_sdk_1.WorkflowResponse({ wishlist: enrichedWishlist.wishlist });
|
|
76
78
|
});
|
|
77
79
|
exports.default = exports.getWishlistWorkflow;
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXdpc2hsaXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9nZXQtd2lzaGxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBQzFDLHFEQUdrQztBQUVsQyxrREFBcUQ7QUFPckQsTUFBTSxzQkFBc0IsR0FBRyxJQUFBLDBCQUFVLEVBQ3ZDLHNCQUFzQixFQUN0QixLQUFLLEVBQUUsS0FBdUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDL0MsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBd0IsMEJBQWUsQ0FBQyxDQUFBO0lBQ2pGLE1BQU0sUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwRixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLGNBQWMsSUFBSSxLQUFLLENBQUE7SUFFN0QsSUFBSSxpQkFBaUIsR0FBbUIsRUFBRSxDQUFBO0lBRTFDLElBQUksY0FBYyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM5Qyw2RkFBNkY7UUFDN0YsTUFBTSxhQUFhLEdBQUcsUUFBaUMsQ0FBQTtRQUN2RCxpQkFBaUIsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDNUIsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDO1NBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDbkMsK0VBQStFO1FBQy9FLE1BQU0sVUFBVSxHQUFHLFFB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
|
|
@@ -9,10 +9,7 @@ const validateWishlistItemExistsStep = (0, workflows_sdk_1.createStep)("validate
|
|
|
9
9
|
if (!exists) {
|
|
10
10
|
throw new Error(`Wishlist item not found for customer ${input.customer_id} and product ${input.product_id}`);
|
|
11
11
|
}
|
|
12
|
-
return new workflows_sdk_1.StepResponse(
|
|
13
|
-
customer_id: input.customer_id,
|
|
14
|
-
product_id: input.product_id,
|
|
15
|
-
});
|
|
12
|
+
return new workflows_sdk_1.StepResponse(input);
|
|
16
13
|
});
|
|
17
14
|
const removeFromWishlistStep = (0, workflows_sdk_1.createStep)("remove-from-wishlist", async (input, { container }) => {
|
|
18
15
|
const wishlistService = container.resolve(wishlist_1.WISHLIST_MODULE);
|
|
@@ -22,9 +19,7 @@ const removeFromWishlistStep = (0, workflows_sdk_1.createStep)("remove-from-wish
|
|
|
22
19
|
exports.removeFromWishlistWorkflow = (0, workflows_sdk_1.createWorkflow)("remove-from-wishlist", (input) => {
|
|
23
20
|
const validated = validateWishlistItemExistsStep(input);
|
|
24
21
|
const result = removeFromWishlistStep(validated);
|
|
25
|
-
return new workflows_sdk_1.WorkflowResponse({
|
|
26
|
-
success: result.success,
|
|
27
|
-
});
|
|
22
|
+
return new workflows_sdk_1.WorkflowResponse({ success: result.success });
|
|
28
23
|
});
|
|
29
24
|
exports.default = exports.removeFromWishlistWorkflow;
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlLWZyb20td2lzaGxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3JlbW92ZS1mcm9tLXdpc2hsaXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUswQztBQUMxQyxrREFBcUQ7QUFNckQsTUFBTSw4QkFBOEIsR0FBRyxJQUFBLDBCQUFVLEVBQy9DLCtCQUErQixFQUMvQixLQUFLLEVBQUUsS0FBOEIsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdEQsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBd0IsMEJBQWUsQ0FBQyxDQUFBO0lBQ2pGLE1BQU0sTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUV0RixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxLQUFLLENBQUMsV0FBVyxnQkFBZ0IsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7SUFDOUcsQ0FBQztJQUVELE9BQU8sSUFBSSw0QkFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ2hDLENBQUMsQ0FDRixDQUFBO0FBRUQsTUFBTSxzQkFBc0IsR0FBRyxJQUFBLDBCQUFVLEVBQ3ZDLHNCQUFzQixFQUN0QixLQUFLLEVBQUUsS0FBOEIsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdEQsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBd0IsMEJBQWUsQ0FBQyxDQUFBO0lBQ2pGLE1BQU0sZUFBZSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRTdFLE9BQU8sSUFBSSw0QkFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDNUMsQ0FBQyxDQUNGLENBQUE7QUFFWSxRQUFBLDBCQUEwQixHQUFHLElBQUEsOEJBQWMsRUFDdEQsc0JBQXNCLEVBQ3RCLENBQUMsS0FBOEIsRUFBOEMsRUFBRTtJQUM3RSxNQUFNLFNBQVMsR0FBRyw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN2RCxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUVoRCxPQUFPLElBQUksZ0NBQWdCLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDMUQsQ0FBQyxDQUNGLENBQUE7QUFFRCxrQkFBZSxrQ0FBMEIsQ0FBQSJ9
|