order-management 0.0.93 → 0.0.94
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/api/store/guest-orders/[id]/cancel/route.js +15 -26
- package/.medusa/server/src/api/store/orders/cancel/[order_id]/route.js +11 -17
- package/.medusa/server/src/config.js +6 -1
- package/.medusa/server/src/utils/fulfilled-quantity.js +52 -0
- package/.medusa/server/src/utils/unwrap-workflow-error.js +108 -0
- package/.medusa/server/src/workflows/steps/cancel-order-step.js +75 -29
- package/README.md +4 -0
- package/package.json +1 -1
|
@@ -10,6 +10,7 @@ const config_1 = require("../../../../../config");
|
|
|
10
10
|
const cancel_order_workflow_1 = require("../../../../../workflows/cancel-order-workflow");
|
|
11
11
|
const get_guest_token_1 = require("../../get-guest-token");
|
|
12
12
|
const cancel_order_reason_1 = require("../../../../../modules/cancel-order-reason");
|
|
13
|
+
const unwrap_workflow_error_1 = require("../../../../../utils/unwrap-workflow-error");
|
|
13
14
|
async function POST(req, res) {
|
|
14
15
|
const token = (0, get_guest_token_1.getGuestToken)(req);
|
|
15
16
|
const { id } = req.params;
|
|
@@ -21,17 +22,16 @@ async function POST(req, res) {
|
|
|
21
22
|
res.status(400).json({ message: "Order ID is required" });
|
|
22
23
|
return;
|
|
23
24
|
}
|
|
24
|
-
// Resolve plugin configuration
|
|
25
25
|
let config;
|
|
26
26
|
try {
|
|
27
27
|
const configModule = req.scope.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
28
28
|
config = (0, config_1.resolveOrderManagementOptions)(configModule);
|
|
29
29
|
}
|
|
30
30
|
catch (error) {
|
|
31
|
-
const
|
|
31
|
+
const unwrapped = (0, unwrap_workflow_error_1.unwrapWorkflowError)(error);
|
|
32
32
|
res.status(500).json({
|
|
33
33
|
message: "Failed to resolve plugin configuration",
|
|
34
|
-
error:
|
|
34
|
+
error: unwrapped.message,
|
|
35
35
|
});
|
|
36
36
|
return;
|
|
37
37
|
}
|
|
@@ -43,27 +43,24 @@ async function POST(req, res) {
|
|
|
43
43
|
}
|
|
44
44
|
const guest_identifier = decoded.guest_identifier;
|
|
45
45
|
const actorId = decoded.actor_id ?? decoded.customer_id;
|
|
46
|
-
// Resolve Query to fetch order and verify ownership
|
|
47
46
|
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
48
|
-
// Fetch the specific order and include customer info
|
|
49
47
|
const { data: orders } = await query.graph({
|
|
50
48
|
entity: "order",
|
|
51
49
|
fields: ["id", "customer_id", "email"],
|
|
52
50
|
filters: {
|
|
53
51
|
id: id,
|
|
54
|
-
email: guest_identifier
|
|
55
|
-
}
|
|
52
|
+
email: guest_identifier,
|
|
53
|
+
},
|
|
56
54
|
});
|
|
57
55
|
const order = orders[0];
|
|
58
56
|
if (!order) {
|
|
59
57
|
res.status(404).json({ message: "Order not found or access denied" });
|
|
60
58
|
return;
|
|
61
59
|
}
|
|
62
|
-
// Use the customer_id from the order if available, otherwise from token (actor_id)
|
|
63
60
|
const orderCustomerId = order.customer_id || actorId;
|
|
64
61
|
if (!orderCustomerId) {
|
|
65
62
|
res.status(400).json({
|
|
66
|
-
message: "Cannot cancel order: customer ID not found"
|
|
63
|
+
message: "Cannot cancel order: customer ID not found",
|
|
67
64
|
});
|
|
68
65
|
return;
|
|
69
66
|
}
|
|
@@ -71,7 +68,6 @@ async function POST(req, res) {
|
|
|
71
68
|
const cancelReasonService = req.scope.resolve(cancel_order_reason_1.CANCEL_ORDER_REASON_MODULE);
|
|
72
69
|
const orderModuleService = req.scope.resolve(utils_1.Modules.ORDER);
|
|
73
70
|
await cancelReasonService.assertReasonExists(orderModuleService, reason_id);
|
|
74
|
-
// Execute cancel order workflow
|
|
75
71
|
const { result } = await (0, cancel_order_workflow_1.cancelOrderWorkflow)(req.scope).run({
|
|
76
72
|
input: {
|
|
77
73
|
order_id: id,
|
|
@@ -82,26 +78,19 @@ async function POST(req, res) {
|
|
|
82
78
|
res.status(200).json(result);
|
|
83
79
|
}
|
|
84
80
|
catch (error) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
:
|
|
89
|
-
|
|
90
|
-
: error.type === utils_1.MedusaError.Types.UNAUTHORIZED
|
|
91
|
-
? 401
|
|
92
|
-
: 400;
|
|
93
|
-
res.status(statusCode).json({
|
|
94
|
-
message: error.message,
|
|
95
|
-
type: error.type,
|
|
81
|
+
const unwrapped = (0, unwrap_workflow_error_1.unwrapWorkflowError)(error);
|
|
82
|
+
if (error instanceof utils_1.MedusaError || unwrapped.isMedusaError) {
|
|
83
|
+
res.status((0, unwrap_workflow_error_1.statusCodeForMedusaErrorType)(unwrapped.type)).json({
|
|
84
|
+
message: unwrapped.message,
|
|
85
|
+
type: unwrapped.type,
|
|
96
86
|
});
|
|
97
87
|
return;
|
|
98
88
|
}
|
|
99
|
-
const errorMessage = error instanceof Error ? error.message : "An error occurred";
|
|
100
|
-
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
101
89
|
res.status(500).json({
|
|
102
|
-
message:
|
|
103
|
-
...(
|
|
90
|
+
message: unwrapped.message,
|
|
91
|
+
...(config_1.runtimeConfig.isDevelopment &&
|
|
92
|
+
error instanceof Error && { stack: error.stack }),
|
|
104
93
|
});
|
|
105
94
|
}
|
|
106
95
|
}
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2d1ZXN0LW9yZGVycy9baWRdL2NhbmNlbC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWdCQSxvQkF5R0M7QUF2SEQscURBQTJGO0FBQzNGLGdFQUE4QztBQUM5QyxrREFBb0Y7QUFFcEYsMEZBQW9GO0FBQ3BGLDJEQUFxRDtBQUNyRCxvRkFBdUY7QUFHdkYsc0ZBR21EO0FBRTVDLEtBQUssVUFBVSxJQUFJLENBQ3hCLEdBQXdDLEVBQ3hDLEdBQW1CO0lBRW5CLE1BQU0sS0FBSyxHQUFHLElBQUEsK0JBQWEsRUFBQyxHQUFHLENBQUMsQ0FBQTtJQUNoQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtJQUV6QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSwyREFBMkQsRUFBRSxDQUFDLENBQUE7UUFDOUYsT0FBTTtJQUNSLENBQUM7SUFFRCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDUixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxDQUFDLENBQUE7UUFDekQsT0FBTTtJQUNSLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQTtJQUNWLElBQUksQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUNwQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQ3hDLENBQUE7UUFDRCxNQUFNLEdBQUcsSUFBQSxzQ0FBNkIsRUFBQyxZQUFZLENBQUMsQ0FBQTtJQUN0RCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sU0FB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
|
|
@@ -4,6 +4,8 @@ exports.POST = void 0;
|
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
5
|
const cancel_order_workflow_1 = require("../../../../../workflows/cancel-order-workflow");
|
|
6
6
|
const cancel_order_reason_1 = require("../../../../../modules/cancel-order-reason");
|
|
7
|
+
const config_1 = require("../../../../../config");
|
|
8
|
+
const unwrap_workflow_error_1 = require("../../../../../utils/unwrap-workflow-error");
|
|
7
9
|
const POST = async (req, res) => {
|
|
8
10
|
const { order_id } = req.params;
|
|
9
11
|
if (!order_id) {
|
|
@@ -38,28 +40,20 @@ const POST = async (req, res) => {
|
|
|
38
40
|
res.json(result);
|
|
39
41
|
}
|
|
40
42
|
catch (error) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
:
|
|
45
|
-
|
|
46
|
-
: error.type === utils_1.MedusaError.Types.UNAUTHORIZED
|
|
47
|
-
? 401
|
|
48
|
-
: 400;
|
|
49
|
-
res.status(statusCode).json({
|
|
50
|
-
message: error.message,
|
|
51
|
-
type: error.type,
|
|
43
|
+
const unwrapped = (0, unwrap_workflow_error_1.unwrapWorkflowError)(error);
|
|
44
|
+
if (error instanceof utils_1.MedusaError || unwrapped.isMedusaError) {
|
|
45
|
+
res.status((0, unwrap_workflow_error_1.statusCodeForMedusaErrorType)(unwrapped.type)).json({
|
|
46
|
+
message: unwrapped.message,
|
|
47
|
+
type: unwrapped.type,
|
|
52
48
|
});
|
|
53
49
|
return;
|
|
54
50
|
}
|
|
55
|
-
// Return detailed error information
|
|
56
|
-
const errorMessage = error instanceof Error ? error.message : "An error occurred";
|
|
57
|
-
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
58
51
|
res.status(500).json({
|
|
59
|
-
message:
|
|
60
|
-
...(
|
|
52
|
+
message: unwrapped.message,
|
|
53
|
+
...(config_1.runtimeConfig.isDevelopment &&
|
|
54
|
+
error instanceof Error && { stack: error.stack }),
|
|
61
55
|
});
|
|
62
56
|
}
|
|
63
57
|
};
|
|
64
58
|
exports.POST = POST;
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL29yZGVycy9jYW5jZWwvW29yZGVyX2lkXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxxREFBZ0U7QUFDaEUsMEZBQW9GO0FBQ3BGLG9GQUF1RjtBQUd2RixrREFBcUQ7QUFDckQsc0ZBR21EO0FBRTVDLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBd0MsRUFDeEMsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO0lBRS9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSx3Q0FBd0M7U0FDbEQsQ0FBQyxDQUFBO1FBQ0YsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQTtJQUV2QyxtQ0FBbUM7SUFDbkMsTUFBTSxXQUFXLEdBQUksR0FFbkIsQ0FBQyxZQUFZLENBQUE7SUFFZixNQUFNLE9BQU8sR0FBRyxXQUFXLEVBQUUsUUFBUSxDQUFBO0lBQ3JDLE1BQU0sU0FBUyxHQUFHLFdBQVcsRUFBRSxVQUFVLENBQUE7SUFDekMsTUFBTSxVQUFVLEdBQUcsU0FBUyxLQUFLLFVBQVUsQ0FBQTtJQUUzQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLG1EQUFtRDtTQUM3RCxDQUFDLENBQUE7UUFDRixPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQzNDLGdEQUEwQixDQUMzQixDQUFBO0lBQ0QsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBc0IsZUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWhGLElBQUksQ0FBQztRQUNILE1BQU0sbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFFM0UsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSwyQ0FBbUIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzFELEtBQUssRUFBRTtnQkFDTCxRQUFRO2dCQUNSLFdBQVcsRUFBRSxPQUFPO2FBQ3JCO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFFdEUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sU0FBUyxHQUFHLElBQUEsMkNBQW1CLEVBQUMsS0FBSyxDQUFDLENBQUE7UUFFNUMsSUFBSSxLQUFLLFlBQVksbUJBQVcsSUFBSSxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDNUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFBLG9EQUE0QixFQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDNUQsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO2dCQUMxQixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7YUFDckIsQ0FBQyxDQUFBO1lBQ0YsT0FBTTtRQUNSLENBQUM7UUFFRCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87WUFDMUIsR0FBRyxDQUFDLHNCQUFhLENBQUMsYUFBYTtnQkFDN0IsS0FBSyxZQUFZLEtBQUssSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDcEQsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUMsQ0FBQTtBQWxFWSxRQUFBLElBQUksUUFrRWhCIn0=
|
|
@@ -4,9 +4,14 @@
|
|
|
4
4
|
* Configuration is now passed through plugin options in medusa-config.ts
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.runtimeConfig = void 0;
|
|
7
8
|
exports.normalizeOrderManagementOptions = normalizeOrderManagementOptions;
|
|
8
9
|
exports.resolveOrderManagementOptions = resolveOrderManagementOptions;
|
|
9
10
|
const utils_1 = require("@medusajs/framework/utils");
|
|
11
|
+
/** Runtime flags read once from the environment (do not use process.env elsewhere). */
|
|
12
|
+
exports.runtimeConfig = {
|
|
13
|
+
isDevelopment: process.env.NODE_ENV === "development",
|
|
14
|
+
};
|
|
10
15
|
const PLUGIN_NAME = "order-management";
|
|
11
16
|
function normalizeOrderManagementOptions(input) {
|
|
12
17
|
if (!input) {
|
|
@@ -64,4 +69,4 @@ function resolveOrderManagementOptions(configModule) {
|
|
|
64
69
|
}
|
|
65
70
|
throw new Error("order-management: Plugin not found in configuration. Please add the plugin to medusa-config.ts");
|
|
66
71
|
}
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUEwQ0gsMEVBb0RDO0FBRUQsc0VBd0JDO0FBdEhELHFEQUFvRDtBQU1wRCx1RkFBdUY7QUFDMUUsUUFBQSxhQUFhLEdBQUc7SUFDM0IsYUFBYSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLGFBQWE7Q0FDN0MsQ0FBQTtBQWtCVixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQTtBQWF0QyxTQUFnQiwrQkFBK0IsQ0FDN0MsS0FBMkM7SUFFM0MsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FDYixnR0FBZ0csQ0FDakcsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0RBQStELENBQ2hFLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUE7SUFDOUUsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQ3JCLE9BQU8sS0FBSyxDQUFDLGlCQUFpQixLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQztRQUN4RSxDQUFDLENBQUMsS0FBSyxDQUFDLGlCQUFpQjtRQUN6QixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRVAsTUFBTSxtQkFBbUIsR0FDdkIsT0FBTyxLQUFLLENBQUMsbUJBQW1CLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CO1FBQzNCLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFUCxPQUFPO1FBQ0wsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1FBQ2xDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztRQUMxQixLQUFLLEVBQUU7WUFDTCxvQkFBb0IsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLG9CQUFvQixJQUFJLElBQUk7WUFDL0QsV0FBVyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxJQUFJLElBQUk7U0FDOUM7UUFDRCxJQUFJLEVBQUU7WUFDSixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLElBQUksS0FBSztZQUNyQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJO1lBQ3RCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUk7WUFDdEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLElBQUk7WUFDbEMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSTtZQUN0QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJO1NBQ3ZCO1FBQ0QsYUFBYSxFQUFFO1lBQ2IsT0FBTyxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsT0FBTyxJQUFJLEtBQUs7WUFDOUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsWUFBWSxJQUFJLEVBQUU7U0FDdEQ7UUFDRCw0QkFBNEIsRUFBRSxLQUFLLENBQUMsNEJBQTRCLElBQUksSUFBSTtRQUN4RSxpQkFBaUI7UUFDakIsbUJBQW1CO0tBQ3BCLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsNkJBQTZCLENBQzNDLFlBQWdDO0lBRWhDLE1BQU0sT0FBTyxHQUFHLFlBQVksRUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO0lBRTNDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxJQUFBLGdCQUFRLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyQixJQUFJLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDM0Isd0VBQXdFO2dCQUN4RSxNQUFNLElBQUksS0FBSyxDQUNiLDZGQUE2RixDQUM5RixDQUFBO1lBQ0gsQ0FBQztZQUNELFNBQVE7UUFDVixDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sK0JBQStCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3hELENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FDYixnR0FBZ0csQ0FDakcsQ0FBQTtBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseFulfilledQuantity = parseFulfilledQuantity;
|
|
4
|
+
exports.getItemFulfilledQuantity = getItemFulfilledQuantity;
|
|
5
|
+
/**
|
|
6
|
+
* Parse Medusa BigNumber / detail fulfilled quantity fields into a non-negative integer.
|
|
7
|
+
* Returns 0 when the value is missing or unparsable (never throws).
|
|
8
|
+
*/
|
|
9
|
+
function parseFulfilledQuantity(value) {
|
|
10
|
+
if (value == null) {
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
13
|
+
if (typeof value === "number") {
|
|
14
|
+
return Number.isFinite(value) && value > 0 ? Math.floor(value) : 0;
|
|
15
|
+
}
|
|
16
|
+
if (typeof value === "string") {
|
|
17
|
+
const trimmed = value.trim();
|
|
18
|
+
if (!trimmed) {
|
|
19
|
+
return 0;
|
|
20
|
+
}
|
|
21
|
+
const parsed = Number(trimmed);
|
|
22
|
+
return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : 0;
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === "object") {
|
|
25
|
+
const record = value;
|
|
26
|
+
if ("value" in record) {
|
|
27
|
+
return parseFulfilledQuantity(record.value);
|
|
28
|
+
}
|
|
29
|
+
if ("numeric" in record) {
|
|
30
|
+
return parseFulfilledQuantity(record.numeric);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
function getItemFulfilledQuantity(item) {
|
|
36
|
+
const detail = item.detail != null && typeof item.detail === "object"
|
|
37
|
+
? item.detail
|
|
38
|
+
: undefined;
|
|
39
|
+
const candidates = [
|
|
40
|
+
item.fulfilled_quantity,
|
|
41
|
+
detail?.fulfilled_quantity,
|
|
42
|
+
detail?.raw_fulfilled_quantity,
|
|
43
|
+
];
|
|
44
|
+
for (const candidate of candidates) {
|
|
45
|
+
const qty = parseFulfilledQuantity(candidate);
|
|
46
|
+
if (qty > 0) {
|
|
47
|
+
return qty;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsZmlsbGVkLXF1YW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL2Z1bGZpbGxlZC1xdWFudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLHdEQTZCQztBQUVELDREQXVCQztBQTFERDs7O0dBR0c7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxLQUFjO0lBQ25ELElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2xCLE9BQU8sQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNwRSxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDNUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLENBQUE7UUFDVixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzlCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsS0FBZ0MsQ0FBQTtRQUMvQyxJQUFJLE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN0QixPQUFPLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM3QyxDQUFDO1FBQ0QsSUFBSSxTQUFTLElBQUksTUFBTSxFQUFFLENBQUM7WUFDeEIsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBQTtBQUNWLENBQUM7QUFFRCxTQUFnQix3QkFBd0IsQ0FBQyxJQUd4QztJQUNDLE1BQU0sTUFBTSxHQUNWLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRO1FBQ3BELENBQUMsQ0FBRSxJQUFJLENBQUMsTUFBa0M7UUFDMUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUVmLE1BQU0sVUFBVSxHQUFjO1FBQzVCLElBQUksQ0FBQyxrQkFBa0I7UUFDdkIsTUFBTSxFQUFFLGtCQUFrQjtRQUMxQixNQUFNLEVBQUUsc0JBQXNCO0tBQy9CLENBQUE7SUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzdDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTyxHQUFHLENBQUE7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFBO0FBQ1YsQ0FBQyJ9
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unwrapWorkflowError = unwrapWorkflowError;
|
|
4
|
+
exports.statusCodeForMedusaErrorType = statusCodeForMedusaErrorType;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
function isRecord(value) {
|
|
7
|
+
return typeof value === "object" && value !== null;
|
|
8
|
+
}
|
|
9
|
+
function readString(value) {
|
|
10
|
+
return typeof value === "string" && value.trim() !== "" ? value.trim() : undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Medusa workflow `.run()` often wraps the real failure in nested objects
|
|
14
|
+
* (`error`, `cause`, `errors[]`) that are not `instanceof Error` / `MedusaError`.
|
|
15
|
+
* Dig until we find a usable message and Medusa-like type.
|
|
16
|
+
*/
|
|
17
|
+
function unwrapWorkflowError(error) {
|
|
18
|
+
const visited = new Set();
|
|
19
|
+
const queue = [error];
|
|
20
|
+
let bestMessage;
|
|
21
|
+
let bestType;
|
|
22
|
+
let sawMedusa = false;
|
|
23
|
+
while (queue.length > 0) {
|
|
24
|
+
const current = queue.shift();
|
|
25
|
+
if (current == null || visited.has(current)) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
visited.add(current);
|
|
29
|
+
if (typeof current === "string") {
|
|
30
|
+
if (!bestMessage) {
|
|
31
|
+
bestMessage = current;
|
|
32
|
+
}
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (current instanceof utils_1.MedusaError) {
|
|
36
|
+
sawMedusa = true;
|
|
37
|
+
bestMessage = current.message || bestMessage;
|
|
38
|
+
bestType = current.type || bestType;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (current instanceof Error) {
|
|
42
|
+
// Prefer nested Error messages (often the real provider failure).
|
|
43
|
+
if (current.message) {
|
|
44
|
+
bestMessage = current.message;
|
|
45
|
+
}
|
|
46
|
+
const maybeType = current.type;
|
|
47
|
+
if (typeof maybeType === "string") {
|
|
48
|
+
bestType = maybeType;
|
|
49
|
+
}
|
|
50
|
+
if (current.__isMedusaError === true) {
|
|
51
|
+
sawMedusa = true;
|
|
52
|
+
}
|
|
53
|
+
const cause = current.cause;
|
|
54
|
+
if (cause != null) {
|
|
55
|
+
queue.push(cause);
|
|
56
|
+
}
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (!isRecord(current)) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const like = current;
|
|
63
|
+
if (like.__isMedusaError === true || like.name === "MedusaError") {
|
|
64
|
+
sawMedusa = true;
|
|
65
|
+
}
|
|
66
|
+
const message = readString(like.message) ||
|
|
67
|
+
readString(current["msg"]) ||
|
|
68
|
+
readString(current["detail"]);
|
|
69
|
+
if (message && !bestMessage) {
|
|
70
|
+
bestMessage = message;
|
|
71
|
+
}
|
|
72
|
+
if (typeof like.type === "string" && !bestType) {
|
|
73
|
+
bestType = like.type;
|
|
74
|
+
}
|
|
75
|
+
if (like.error != null) {
|
|
76
|
+
queue.push(like.error);
|
|
77
|
+
}
|
|
78
|
+
if (like.cause != null) {
|
|
79
|
+
queue.push(like.cause);
|
|
80
|
+
}
|
|
81
|
+
if (Array.isArray(like.errors)) {
|
|
82
|
+
for (const nested of like.errors) {
|
|
83
|
+
queue.push(nested);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
message: bestMessage || "An error occurred",
|
|
89
|
+
type: bestType,
|
|
90
|
+
isMedusaError: sawMedusa || Boolean(bestType),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function statusCodeForMedusaErrorType(type) {
|
|
94
|
+
switch (type) {
|
|
95
|
+
case utils_1.MedusaError.Types.NOT_FOUND:
|
|
96
|
+
return 404;
|
|
97
|
+
case utils_1.MedusaError.Types.NOT_ALLOWED:
|
|
98
|
+
return 403;
|
|
99
|
+
case utils_1.MedusaError.Types.UNAUTHORIZED:
|
|
100
|
+
return 401;
|
|
101
|
+
case utils_1.MedusaError.Types.INVALID_DATA:
|
|
102
|
+
case utils_1.MedusaError.Types.INVALID_ARGUMENT:
|
|
103
|
+
return 400;
|
|
104
|
+
default:
|
|
105
|
+
return 400;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW53cmFwLXdvcmtmbG93LWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Vud3JhcC13b3JrZmxvdy1lcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWdDQSxrREFzRkM7QUFFRCxvRUFjQztBQXRJRCxxREFBdUQ7QUFtQnZELFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQTtBQUNwRCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYztJQUNoQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtBQUNwRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLEtBQWM7SUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVcsQ0FBQTtJQUNsQyxNQUFNLEtBQUssR0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWhDLElBQUksV0FBK0IsQ0FBQTtJQUNuQyxJQUFJLFFBQTRCLENBQUE7SUFDaEMsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFBO0lBRXJCLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDN0IsSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxTQUFRO1FBQ1YsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFcEIsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLFdBQVcsR0FBRyxPQUFPLENBQUE7WUFDdkIsQ0FBQztZQUNELFNBQVE7UUFDVixDQUFDO1FBRUQsSUFBSSxPQUFPLFlBQVksbUJBQVcsRUFBRSxDQUFDO1lBQ25DLFNBQVMsR0FBRyxJQUFJLENBQUE7WUFDaEIsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFBO1lBQzVDLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQTtZQUNuQyxTQUFRO1FBQ1YsQ0FBQztRQUVELElBQUksT0FBTyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQzdCLGtFQUFrRTtZQUNsRSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUE7WUFDL0IsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFJLE9BQTJCLENBQUMsSUFBSSxDQUFBO1lBQ25ELElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2xDLFFBQVEsR0FBRyxTQUFTLENBQUE7WUFDdEIsQ0FBQztZQUNELElBQUssT0FBMkIsQ0FBQyxlQUFlLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzFELFNBQVMsR0FBRyxJQUFJLENBQUE7WUFDbEIsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFJLE9BQStCLENBQUMsS0FBSyxDQUFBO1lBQ3BELElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ25CLENBQUM7WUFDRCxTQUFRO1FBQ1YsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN2QixTQUFRO1FBQ1YsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLE9BQTBCLENBQUE7UUFDdkMsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ2pFLFNBQVMsR0FBRyxJQUFJLENBQUE7UUFDbEIsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUNYLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3hCLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQy9CLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUIsV0FBVyxHQUFHLE9BQU8sQ0FBQTtRQUN2QixDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDL0MsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7UUFDdEIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hCLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDcEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sRUFBRSxXQUFXLElBQUksbUJBQW1CO1FBQzNDLElBQUksRUFBRSxRQUFRO1FBQ2QsYUFBYSxFQUFFLFNBQVMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDO0tBQzlDLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsNEJBQTRCLENBQUMsSUFBd0I7SUFDbkUsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUztZQUM5QixPQUFPLEdBQUcsQ0FBQTtRQUNaLEtBQUssbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVztZQUNoQyxPQUFPLEdBQUcsQ0FBQTtRQUNaLEtBQUssbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWTtZQUNqQyxPQUFPLEdBQUcsQ0FBQTtRQUNaLEtBQUssbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3BDLEtBQUssbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO1lBQ3JDLE9BQU8sR0FBRyxDQUFBO1FBQ1o7WUFDRSxPQUFPLEdBQUcsQ0FBQTtJQUNkLENBQUM7QUFDSCxDQUFDIn0=
|
|
@@ -1,59 +1,105 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.cancelOrderStep = void 0;
|
|
4
|
+
exports.cancelOpenUnshippedFulfillments = cancelOpenUnshippedFulfillments;
|
|
5
|
+
exports.executeCancelOrder = executeCancelOrder;
|
|
4
6
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
7
|
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
8
|
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
7
|
-
|
|
9
|
+
const fulfilled_quantity_1 = require("../../utils/fulfilled-quantity");
|
|
10
|
+
const unwrap_workflow_error_1 = require("../../utils/unwrap-workflow-error");
|
|
11
|
+
/**
|
|
12
|
+
* Cancel unshipped open fulfillments so Medusa core cancelOrderWorkflow can proceed.
|
|
13
|
+
* Shipped fulfillments cannot be canceled — those block order cancel intentionally.
|
|
14
|
+
*/
|
|
15
|
+
async function cancelOpenUnshippedFulfillments(container, orderId, cancelFulfillment) {
|
|
16
|
+
let query;
|
|
17
|
+
try {
|
|
18
|
+
query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const { data } = await query.graph({
|
|
24
|
+
entity: "order",
|
|
25
|
+
fields: ["id", "fulfillments.id", "fulfillments.canceled_at", "fulfillments.shipped_at"],
|
|
26
|
+
filters: { id: orderId },
|
|
27
|
+
});
|
|
28
|
+
const orderRow = data?.[0];
|
|
29
|
+
const fulfillments = (orderRow?.fulfillments ?? []);
|
|
30
|
+
const open = fulfillments.filter((f) => f?.id && !f.canceled_at);
|
|
31
|
+
if (open.length === 0) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const shipped = open.filter((f) => Boolean(f.shipped_at));
|
|
35
|
+
if (shipped.length > 0) {
|
|
36
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Cannot cancel order: Some items have already been fulfilled or shipped");
|
|
37
|
+
}
|
|
38
|
+
for (const fulfillment of open) {
|
|
39
|
+
await cancelFulfillment({
|
|
40
|
+
order_id: orderId,
|
|
41
|
+
fulfillment_id: fulfillment.id,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function executeCancelOrder(input, container, deps) {
|
|
8
46
|
const { order } = input;
|
|
9
47
|
if (!order || !order.id) {
|
|
10
48
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Order is required to cancel");
|
|
11
49
|
}
|
|
12
|
-
// Check if order has fulfilled items
|
|
13
|
-
// Check order items' fulfilled_quantity directly from the order data
|
|
14
50
|
const orderItems = order.items || [];
|
|
15
|
-
const hasFulfilledItems = orderItems.some((item) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
// Check fulfilled_quantity from detail.raw_fulfilled_quantity or direct field
|
|
20
|
-
const fulfilledQty = detail?.raw_fulfilled_quantity?.value
|
|
21
|
-
? parseInt(detail.raw_fulfilled_quantity.value, 10)
|
|
22
|
-
: fulfilledQuantity || 0;
|
|
23
|
-
return fulfilledQty > 0;
|
|
24
|
-
});
|
|
51
|
+
const hasFulfilledItems = orderItems.some((item) => (0, fulfilled_quantity_1.getItemFulfilledQuantity)({
|
|
52
|
+
fulfilled_quantity: item.fulfilled_quantity,
|
|
53
|
+
detail: item.detail,
|
|
54
|
+
}) > 0);
|
|
25
55
|
if (hasFulfilledItems) {
|
|
26
56
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Cannot cancel order: Some items have already been fulfilled");
|
|
27
57
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
58
|
+
const cancelFulfillment = deps?.cancelFulfillment ??
|
|
59
|
+
(async (fulfillmentInput) => {
|
|
60
|
+
await (0, core_flows_1.cancelOrderFulfillmentWorkflow)(container).run({
|
|
61
|
+
input: fulfillmentInput,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
const cancelOrder = deps?.cancelOrder ??
|
|
65
|
+
(async (cancelInput) => {
|
|
66
|
+
const { result } = await (0, core_flows_1.cancelOrderWorkflow)(container).run({
|
|
67
|
+
input: cancelInput,
|
|
68
|
+
});
|
|
69
|
+
return result;
|
|
34
70
|
});
|
|
35
|
-
|
|
71
|
+
try {
|
|
72
|
+
await cancelOpenUnshippedFulfillments(container, order.id, cancelFulfillment);
|
|
73
|
+
const result = await cancelOrder({ order_id: order.id });
|
|
36
74
|
const workflowResult = result;
|
|
37
|
-
// Extract order ID and status from result (may be nested or direct)
|
|
38
75
|
const canceledOrderId = workflowResult?.order?.id || workflowResult?.id || order.id;
|
|
39
76
|
const canceledStatus = workflowResult?.order?.status || workflowResult?.status || "canceled";
|
|
40
|
-
return
|
|
77
|
+
return {
|
|
41
78
|
order_id: canceledOrderId,
|
|
42
79
|
status: canceledStatus,
|
|
43
80
|
message: "Order canceled successfully",
|
|
44
|
-
}
|
|
81
|
+
};
|
|
45
82
|
}
|
|
46
83
|
catch (error) {
|
|
47
|
-
// Handle cancellation errors
|
|
48
84
|
if (error instanceof utils_1.MedusaError) {
|
|
49
85
|
throw error;
|
|
50
86
|
}
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
if (errorMessage.includes("fulfilled") ||
|
|
87
|
+
const unwrapped = (0, unwrap_workflow_error_1.unwrapWorkflowError)(error);
|
|
88
|
+
const errorMessage = unwrapped.message;
|
|
89
|
+
if (errorMessage.includes("fulfilled") ||
|
|
90
|
+
errorMessage.includes("shipped") ||
|
|
91
|
+
errorMessage.includes("fulfillment")) {
|
|
54
92
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Cannot cancel order: Some items have already been fulfilled or shipped");
|
|
55
93
|
}
|
|
56
|
-
|
|
94
|
+
const knownTypes = new Set(Object.values(utils_1.MedusaError.Types));
|
|
95
|
+
const errorType = unwrapped.type && knownTypes.has(unwrapped.type)
|
|
96
|
+
? unwrapped.type
|
|
97
|
+
: utils_1.MedusaError.Types.UNEXPECTED_STATE;
|
|
98
|
+
throw new utils_1.MedusaError(errorType, `Failed to cancel order: ${errorMessage}`);
|
|
57
99
|
}
|
|
100
|
+
}
|
|
101
|
+
exports.cancelOrderStep = (0, workflows_sdk_1.createStep)("cancel-order-step", async (input, { container }) => {
|
|
102
|
+
const output = await executeCancelOrder(input, container);
|
|
103
|
+
return new workflows_sdk_1.StepResponse(output);
|
|
58
104
|
});
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLW9yZGVyLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2NhbmNlbC1vcmRlci1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNEQSwwRUF3Q0M7QUFFRCxnREEwR0M7QUExTUQscURBR2tDO0FBQ2xDLHFFQUE0RTtBQUM1RSw0REFHb0M7QUFHcEMsdUVBQXlFO0FBQ3pFLDZFQUF1RTtBQXNDdkU7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLCtCQUErQixDQUNuRCxTQUFtQyxFQUNuQyxPQUFlLEVBQ2YsaUJBQXVEO0lBRXZELElBQUksS0FBbUIsQ0FBQTtJQUN2QixJQUFJLENBQUM7UUFDSCxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBZSxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ2pDLE1BQU0sRUFBRSxPQUFPO1FBQ2YsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixDQUFDO1FBQ3hGLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7S0FDekIsQ0FBQyxDQUFBO0lBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDMUIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxRQUFRLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBeUIsQ0FBQTtJQUMzRSxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRWhFLElBQUks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
|
package/README.md
CHANGED
|
@@ -270,6 +270,8 @@ curl "http://localhost:9000/admin/orders/order_123/refund-context" \
|
|
|
270
270
|
|---|---|---|
|
|
271
271
|
| OTP request fails with template/config message | Missing `email.otpTemplate` or unresolved plugin options | Configure plugin options in `medusa-config.ts`; verify template path exists. |
|
|
272
272
|
| Guest JWT endpoints return unauthorized | Invalid/expired token or `jwtSecret` mismatch | Re-run OTP verify and ensure same `jwtSecret` is used in runtime config. |
|
|
273
|
+
| Store cancel returns generic `An error occurred` | Workflow failure was wrapped and not unwrapped by the cancel route | Upgrade this plugin. Nested Medusa/workflow errors are now unwrapped into a real `message`. Check payment refund/void logs if cancel still fails. |
|
|
274
|
+
| Cancel blocked by open fulfillments on a “not fulfilled” order | Core cancel requires all fulfillments to have `canceled_at` | Upgrade this plugin. Unshipped open fulfillments are canceled automatically before core cancel. |
|
|
273
275
|
| Return/exchange blocked with `RETURN_WINDOW_EXPIRED` | Delivery date outside configured window | Increase `returnValidInDays`/`exchangeValidInDays` or update storefront UX for expiry handling. |
|
|
274
276
|
| Refund mapping routes fail | `refund-payment-mapping` module not registered/migrated | Register module and run migrations. |
|
|
275
277
|
| Guest return shows no payment method in Admin | Guest COD returns previously stored `payment_id=null` and guests could not create/link payment details | Upgrade this plugin. Pass `refund_payment` / `refund_payment_id` on guest return create, or use `POST /store/guest-orders/:id/payment-details` + `PUT .../returns/:return_id/refund-payment`. |
|
|
@@ -318,6 +320,8 @@ This plugin is compatible with Medusa v2 (e.g. `@medusajs/framework` and `@medus
|
|
|
318
320
|
## Features
|
|
319
321
|
|
|
320
322
|
- **Order Management**: Cancel and reorder for both authenticated customers and guest orders
|
|
323
|
+
- **Cancel error surfacing**: Customer/guest cancel routes unwrap nested Medusa workflow errors so the storefront shows the real failure (not a bare `An error occurred`)
|
|
324
|
+
- **Cancel pre-clears unshipped fulfillments**: Before calling Medusa core cancel, open unshipped fulfillments are canceled so pending orders are not blocked by fulfillment rows
|
|
321
325
|
- **Authenticated Customer APIs**: Store endpoints for logged-in customers to cancel orders (`/store/orders/cancel/:order_id`), reorder (`/store/orders/reorder/:order_id`), manage returns (`/store/returns`), and manage exchanges (`/store/swaps`)
|
|
322
326
|
- **Guest Order Portal**: OTP-based look-up for guest users with full order management (view orders, initiate returns, cancel, reorder)
|
|
323
327
|
- **Guest Order Actions**: Secure JWT-protected endpoints for guest users to view orders, initiate returns (via Medusa workflow), cancel orders, reorder (all under `/store/guest-orders/:id/...`)
|