order-management 0.0.2 → 0.0.3
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 +4 -639
- package/.medusa/server/src/admin/index.mjs +4 -639
- package/.medusa/server/src/api/store/orders/reorder/[order_id]/route.js +52 -0
- package/.medusa/server/src/workflows/index.js +4 -9
- package/.medusa/server/src/workflows/{types.js → reorder/types.js} +1 -1
- package/.medusa/server/src/workflows/reorder-workflow.js +27 -0
- package/.medusa/server/src/workflows/steps/create-cart-from-order-step.js +26 -0
- package/.medusa/server/src/workflows/steps/index.js +10 -0
- package/.medusa/server/src/workflows/steps/retrieve-order-step.js +52 -0
- package/.medusa/server/src/workflows/steps/transform-order-to-cart-step.js +53 -0
- package/README.md +59 -73
- package/package.json +1 -1
- package/.medusa/server/src/api/admin/returns/[id]/retry-refund/route.js +0 -84
- package/.medusa/server/src/api/admin/returns/failed-refunds/route.js +0 -137
- package/.medusa/server/src/api/store/returns/[id]/payment-details/route.js +0 -326
- package/.medusa/server/src/config/plugin-options.js +0 -61
- package/.medusa/server/src/providers/refund-payment/base-refund-provider.js +0 -80
- package/.medusa/server/src/providers/refund-payment/index.js +0 -38
- package/.medusa/server/src/providers/refund-payment/razorpay-provider.js +0 -96
- package/.medusa/server/src/providers/refund-payment/stripe-provider.js +0 -82
- package/.medusa/server/src/subscribers/return-received.js +0 -103
- package/.medusa/server/src/types/plugin-options.js +0 -3
- package/.medusa/server/src/types/refund-payment.js +0 -3
- package/.medusa/server/src/workflows/process-cod-refund-workflow.js +0 -99
- package/.medusa/server/src/workflows/steps/calculate-refund-amount-step.js +0 -51
- package/.medusa/server/src/workflows/steps/create-refund-record-step.js +0 -243
- package/.medusa/server/src/workflows/steps/process-refund-payment-step.js +0 -86
- package/.medusa/server/src/workflows/steps/retrieve-order-and-payment-step.js +0 -44
- package/.medusa/server/src/workflows/steps/retrieve-return-payment-details-step.js +0 -56
- package/.medusa/server/src/workflows/steps/select-payment-method-step.js +0 -61
- package/.medusa/server/src/workflows/steps/update-payment-status-step.js +0 -45
- package/.medusa/server/src/workflows/steps/validate-payment-details-step.js +0 -90
- package/.medusa/server/src/workflows/steps/verify-cod-order-step.js +0 -39
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const reorder_workflow_1 = require("../../../../../workflows/reorder-workflow");
|
|
6
|
+
const POST = async (req, res) => {
|
|
7
|
+
const { order_id } = req.params;
|
|
8
|
+
if (!order_id) {
|
|
9
|
+
res.status(400).json({
|
|
10
|
+
message: "order_id is required in path parameter",
|
|
11
|
+
});
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// Type-safe access to auth_context
|
|
15
|
+
const authContext = req.auth_context;
|
|
16
|
+
const customerId = authContext?.actor_id;
|
|
17
|
+
if (!customerId || authContext?.actor_type !== "customer") {
|
|
18
|
+
res.status(401).json({
|
|
19
|
+
message: "Unauthorized: Customer authentication is required",
|
|
20
|
+
});
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const { result } = await (0, reorder_workflow_1.reorderWorkflow)(req.scope).run({
|
|
25
|
+
input: {
|
|
26
|
+
order_id,
|
|
27
|
+
customer_id: customerId,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
res.json(result);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
// Log error for debugging
|
|
34
|
+
console.error("Reorder workflow error:", error);
|
|
35
|
+
if (error instanceof utils_1.MedusaError) {
|
|
36
|
+
res.status(error.type === utils_1.MedusaError.Types.NOT_FOUND ? 404 : 400).json({
|
|
37
|
+
message: error.message,
|
|
38
|
+
type: error.type,
|
|
39
|
+
});
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Return detailed error information
|
|
43
|
+
const errorMessage = error instanceof Error ? error.message : "An error occurred";
|
|
44
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
45
|
+
res.status(500).json({
|
|
46
|
+
message: errorMessage,
|
|
47
|
+
...(process.env.NODE_ENV === "development" && { stack: errorStack }),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
exports.POST = POST;
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL29yZGVycy9yZW9yZGVyL1tvcmRlcl9pZF0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQXVEO0FBQ3ZELGdGQUEyRTtBQUVwRSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtJQUUvQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixPQUFPLEVBQUUsd0NBQXdDO1NBQ2xELENBQUMsQ0FBQTtRQUNGLE9BQU07SUFDUixDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLE1BQU0sV0FBVyxHQUFJLEdBRW5CLENBQUMsWUFBWSxDQUFBO0lBRWYsTUFBTSxVQUFVLEdBQUcsV0FBVyxFQUFFLFFBQVEsQ0FBQTtJQUV4QyxJQUFJLENBQUMsVUFBVSxJQUFJLFdBQVcsRUFBRSxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDMUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLG1EQUFtRDtTQUM3RCxDQUFDLENBQUE7UUFDRixPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsa0NBQWUsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3RELEtBQUssRUFBRTtnQkFDTCxRQUFRO2dCQUNSLFdBQVcsRUFBRSxVQUFVO2FBQ3hCO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLDBCQUEwQjtRQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRS9DLElBQUksS0FBSyxZQUFZLG1CQUFXLEVBQUUsQ0FBQztZQUNqQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDdEUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7YUFDakIsQ0FBQyxDQUFBO1lBQ0YsT0FBTTtRQUNSLENBQUM7UUFFRCxvQ0FBb0M7UUFDcEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUE7UUFDakYsTUFBTSxVQUFVLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBRW5FLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxhQUFhLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUM7U0FDckUsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUMsQ0FBQTtBQXpEWSxRQUFBLElBQUksUUF5RGhCIn0=
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
var
|
|
8
|
-
Object.defineProperty(exports, "
|
|
9
|
-
|
|
10
|
-
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(process_cod_refund_workflow_2).default; } });
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZFQUF3RTtBQUEvRCx1SUFBQSx3QkFBd0IsT0FBQTtBQUNqQyw2RUFBdUQ7QUFBOUMsdUlBQUEsT0FBTyxPQUFBIn0=
|
|
3
|
+
exports.reorderWorkflow = void 0;
|
|
4
|
+
var reorder_workflow_1 = require("./reorder-workflow");
|
|
5
|
+
Object.defineProperty(exports, "reorderWorkflow", { enumerable: true, get: function () { return reorder_workflow_1.reorderWorkflow; } });
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUFvRDtBQUEzQyxtSEFBQSxlQUFlLE9BQUEifQ==
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3Jlb3JkZXIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reorderWorkflow = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const steps_1 = require("./steps");
|
|
6
|
+
exports.reorderWorkflow = (0, workflows_sdk_1.createWorkflow)("reorder", (input) => {
|
|
7
|
+
const { order_id, customer_id } = input;
|
|
8
|
+
// Step 1: Retrieve and validate order
|
|
9
|
+
const { order } = (0, steps_1.retrieveOrderStep)({
|
|
10
|
+
order_id,
|
|
11
|
+
customer_id,
|
|
12
|
+
});
|
|
13
|
+
// Step 2: Transform order to cart input
|
|
14
|
+
const { cartInput } = (0, steps_1.transformOrderToCartStep)({
|
|
15
|
+
order,
|
|
16
|
+
});
|
|
17
|
+
// Step 3: Create cart from order
|
|
18
|
+
const { cart } = (0, steps_1.createCartFromOrderStep)({
|
|
19
|
+
cartInput,
|
|
20
|
+
});
|
|
21
|
+
// Return only cart ID (no order creation)
|
|
22
|
+
return new workflows_sdk_1.WorkflowResponse({
|
|
23
|
+
cart_id: cart.id,
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
exports.default = exports.reorderWorkflow;
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVvcmRlci13b3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvcmVvcmRlci13b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFHMEM7QUFDMUMsbUNBSWdCO0FBTUgsUUFBQSxlQUFlLEdBQUcsSUFBQSw4QkFBYyxFQUMzQyxTQUFTLEVBQ1QsQ0FDRSxLQUEyQixFQUNjLEVBQUU7SUFDM0MsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUE7SUFFdkMsc0NBQXNDO0lBQ3RDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFBLHlCQUFpQixFQUFDO1FBQ2xDLFFBQVE7UUFDUixXQUFXO0tBQ1osQ0FBQyxDQUFBO0lBRUYsd0NBQXdDO0lBQ3hDLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFBLGdDQUF3QixFQUFDO1FBQzdDLEtBQUs7S0FDTixDQUFDLENBQUE7SUFFRixpQ0FBaUM7SUFDakMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUEsK0JBQXVCLEVBQUM7UUFDdkMsU0FBUztLQUNWLENBQUMsQ0FBQTtJQUVGLDBDQUEwQztJQUMxQyxPQUFPLElBQUksZ0NBQWdCLENBQUM7UUFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFO0tBQ2pCLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBO0FBRUQsa0JBQWUsdUJBQWUsQ0FBQSJ9
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCartFromOrderStep = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
7
|
+
exports.createCartFromOrderStep = (0, workflows_sdk_1.createStep)("create-cart-from-order", async (input, { container }) => {
|
|
8
|
+
const { cartInput } = input;
|
|
9
|
+
if (!cartInput.region_id) {
|
|
10
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "region_id is required to create a cart");
|
|
11
|
+
}
|
|
12
|
+
const { result: cart } = await (0, core_flows_1.createCartWorkflow)(container).run({
|
|
13
|
+
input: cartInput,
|
|
14
|
+
});
|
|
15
|
+
if (!cart) {
|
|
16
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Failed to create cart");
|
|
17
|
+
}
|
|
18
|
+
// Trust the cart object returned by createCartWorkflow
|
|
19
|
+
// Investigation showed that the raw cart object is clean (no payment collection)
|
|
20
|
+
// The remote query was incorrectly returning a different cart, causing false positives
|
|
21
|
+
// Payment collection will be created fresh in create-order-conditionally-step when needed
|
|
22
|
+
return new workflows_sdk_1.StepResponse({
|
|
23
|
+
cart: cart,
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWNhcnQtZnJvbS1vcmRlci1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9zdGVwcy9jcmVhdGUtY2FydC1mcm9tLW9yZGVyLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXVEO0FBQ3ZELHFFQUE0RTtBQUM1RSw0REFBZ0U7QUFjbkQsUUFBQSx1QkFBdUIsR0FBRyxJQUFBLDBCQUFVLEVBQy9DLHdCQUF3QixFQUN4QixLQUFLLEVBQ0gsS0FBbUMsRUFDbkMsRUFBRSxTQUFTLEVBQUUsRUFDeUMsRUFBRTtJQUN4RCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRTNCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsd0NBQXdDLENBQ3pDLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUEsK0JBQWtCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQy9ELEtBQUssRUFBRSxTQUFTO0tBQ2pCLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsdUJBQXVCLENBQ3hCLENBQUE7SUFDSCxDQUFDO0lBRUQsdURBQXVEO0lBQ3ZELGlGQUFpRjtJQUNqRix1RkFBdUY7SUFDdkYsMEZBQTBGO0lBRTFGLE9BQU8sSUFBSSw0QkFBWSxDQUFnQztRQUNyRCxJQUFJLEVBQUUsSUFBd0Q7S0FDL0QsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUEifQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCartFromOrderStep = exports.transformOrderToCartStep = exports.retrieveOrderStep = void 0;
|
|
4
|
+
var retrieve_order_step_1 = require("./retrieve-order-step");
|
|
5
|
+
Object.defineProperty(exports, "retrieveOrderStep", { enumerable: true, get: function () { return retrieve_order_step_1.retrieveOrderStep; } });
|
|
6
|
+
var transform_order_to_cart_step_1 = require("./transform-order-to-cart-step");
|
|
7
|
+
Object.defineProperty(exports, "transformOrderToCartStep", { enumerable: true, get: function () { return transform_order_to_cart_step_1.transformOrderToCartStep; } });
|
|
8
|
+
var create_cart_from_order_step_1 = require("./create-cart-from-order-step");
|
|
9
|
+
Object.defineProperty(exports, "createCartFromOrderStep", { enumerable: true, get: function () { return create_cart_from_order_step_1.createCartFromOrderStep; } });
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZEQUF5RDtBQUFoRCx3SEFBQSxpQkFBaUIsT0FBQTtBQUMxQiwrRUFBeUU7QUFBaEUsd0lBQUEsd0JBQXdCLE9BQUE7QUFDakMsNkVBQXVFO0FBQTlELHNJQUFBLHVCQUF1QixPQUFBIn0=
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retrieveOrderStep = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const utils_2 = require("@medusajs/framework/utils");
|
|
7
|
+
exports.retrieveOrderStep = (0, workflows_sdk_1.createStep)("retrieve-order", async (input, { container }) => {
|
|
8
|
+
const { order_id, customer_id } = input;
|
|
9
|
+
if (!order_id) {
|
|
10
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "order_id is required");
|
|
11
|
+
}
|
|
12
|
+
if (!customer_id) {
|
|
13
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Customer authentication is required");
|
|
14
|
+
}
|
|
15
|
+
const remoteQuery = container.resolve(utils_2.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
16
|
+
let orders;
|
|
17
|
+
try {
|
|
18
|
+
const queryObject = (0, utils_2.remoteQueryObjectFromString)({
|
|
19
|
+
entryPoint: "order",
|
|
20
|
+
fields: [
|
|
21
|
+
"id",
|
|
22
|
+
"items.*",
|
|
23
|
+
"shipping_address.*",
|
|
24
|
+
"billing_address.*",
|
|
25
|
+
"region_id",
|
|
26
|
+
"sales_channel_id",
|
|
27
|
+
"customer_id",
|
|
28
|
+
"email",
|
|
29
|
+
],
|
|
30
|
+
filters: {
|
|
31
|
+
id: order_id,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
orders = await remoteQuery(queryObject);
|
|
35
|
+
}
|
|
36
|
+
catch (queryError) {
|
|
37
|
+
console.error("Remote query error:", queryError);
|
|
38
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to retrieve order: ${queryError instanceof Error ? queryError.message : "Unknown error"}`);
|
|
39
|
+
}
|
|
40
|
+
const order = Array.isArray(orders) ? orders[0] : orders;
|
|
41
|
+
if (!order) {
|
|
42
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Order with id ${order_id} not found`);
|
|
43
|
+
}
|
|
44
|
+
// Validate customer ownership
|
|
45
|
+
if (order.customer_id !== customer_id) {
|
|
46
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "You can only reorder your own orders");
|
|
47
|
+
}
|
|
48
|
+
return new workflows_sdk_1.StepResponse({
|
|
49
|
+
order: order,
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cmlldmUtb3JkZXItc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvcmV0cmlldmUtb3JkZXItc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFDdkQscUVBQTRFO0FBQzVFLHFEQUFrRztBQWtEckYsUUFBQSxpQkFBaUIsR0FBRyxJQUFBLDBCQUFVLEVBQ3pDLGdCQUFnQixFQUNoQixLQUFLLEVBQ0gsS0FBNkIsRUFDN0IsRUFBRSxTQUFTLEVBQUUsRUFDbUMsRUFBRTtJQUNsRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUV2QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixzQkFBc0IsQ0FDdkIsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIscUNBQXFDLENBQ3RDLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDbkMsaUNBQXlCLENBQUMsWUFBWSxDQUN2QyxDQUFBO0lBRUQsSUFBSSxNQUFNLENBQUE7SUFDVixJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFBLG1DQUEyQixFQUFDO1lBQzlDLFVBQVUsRUFBRSxPQUFPO1lBQ25CLE1BQU0sRUFBRTtnQkFDTixJQUFJO2dCQUNKLFNBQVM7Z0JBQ1Qsb0JBQW9CO2dCQUNwQixtQkFBbUI7Z0JBQ25CLFdBQVc7Z0JBQ1gsa0JBQWtCO2dCQUNsQixhQUFhO2dCQUNiLE9BQU87YUFDUjtZQUNELE9BQU8sRUFBRTtnQkFDUCxFQUFFLEVBQUUsUUFBUTthQUNiO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFBQyxPQUFPLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDaEQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyw2QkFBNkIsVUFBVSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQ2xHLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7SUFFeEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0IsaUJBQWlCLFFBQVEsWUFBWSxDQUN0QyxDQUFBO0lBQ0gsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFDN0Isc0NBQXNDLENBQ3ZDLENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQTBCO1FBQy9DLEtBQUssRUFBRSxLQUF5QztLQUNqRCxDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQSJ9
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transformOrderToCartStep = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
exports.transformOrderToCartStep = (0, workflows_sdk_1.createStep)("transform-order-to-cart", async (input) => {
|
|
6
|
+
const { order } = input;
|
|
7
|
+
// Map order items to cart items
|
|
8
|
+
const items = (order.items || []).map((item) => ({
|
|
9
|
+
variant_id: item.variant_id,
|
|
10
|
+
quantity: item.quantity,
|
|
11
|
+
}));
|
|
12
|
+
// Extract billing address
|
|
13
|
+
const billingAddress = order.billing_address
|
|
14
|
+
? {
|
|
15
|
+
first_name: order.billing_address.first_name,
|
|
16
|
+
last_name: order.billing_address.last_name,
|
|
17
|
+
address_1: order.billing_address.address_1,
|
|
18
|
+
address_2: order.billing_address.address_2,
|
|
19
|
+
city: order.billing_address.city,
|
|
20
|
+
country_code: order.billing_address.country_code,
|
|
21
|
+
province: order.billing_address.province,
|
|
22
|
+
postal_code: order.billing_address.postal_code,
|
|
23
|
+
phone: order.billing_address.phone,
|
|
24
|
+
}
|
|
25
|
+
: undefined;
|
|
26
|
+
// Extract shipping address
|
|
27
|
+
const shippingAddress = order.shipping_address
|
|
28
|
+
? {
|
|
29
|
+
first_name: order.shipping_address.first_name,
|
|
30
|
+
last_name: order.shipping_address.last_name,
|
|
31
|
+
address_1: order.shipping_address.address_1,
|
|
32
|
+
address_2: order.shipping_address.address_2,
|
|
33
|
+
city: order.shipping_address.city,
|
|
34
|
+
country_code: order.shipping_address.country_code,
|
|
35
|
+
province: order.shipping_address.province,
|
|
36
|
+
postal_code: order.shipping_address.postal_code,
|
|
37
|
+
phone: order.shipping_address.phone,
|
|
38
|
+
}
|
|
39
|
+
: undefined;
|
|
40
|
+
const cartInput = {
|
|
41
|
+
region_id: order.region_id,
|
|
42
|
+
sales_channel_id: order.sales_channel_id,
|
|
43
|
+
customer_id: order.customer_id,
|
|
44
|
+
email: order.email,
|
|
45
|
+
billing_address: billingAddress,
|
|
46
|
+
shipping_address: shippingAddress,
|
|
47
|
+
items,
|
|
48
|
+
};
|
|
49
|
+
return new workflows_sdk_1.StepResponse({
|
|
50
|
+
cartInput,
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLW9yZGVyLXRvLWNhcnQtc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvdHJhbnNmb3JtLW9yZGVyLXRvLWNhcnQtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNEU7QUEwQy9ELFFBQUEsd0JBQXdCLEdBQUcsSUFBQSwwQkFBVSxFQUNoRCx5QkFBeUIsRUFDekIsS0FBSyxFQUNILEtBQW9DLEVBQ21CLEVBQUU7SUFDekQsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQTtJQUV2QixnQ0FBZ0M7SUFDaEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7UUFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO0tBQ3hCLENBQUMsQ0FBQyxDQUFBO0lBRUgsMEJBQTBCO0lBQzFCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxlQUFlO1FBQzFDLENBQUMsQ0FBQztZQUNFLFVBQVUsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQVU7WUFDNUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUztZQUMxQyxTQUFTLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxTQUFTO1lBQzFDLFNBQVMsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVM7WUFDMUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSTtZQUNoQyxZQUFZLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUFZO1lBQ2hELFFBQVEsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQVE7WUFDeEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsV0FBVztZQUM5QyxLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLO1NBQ25DO1FBQ0gsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUViLDJCQUEyQjtJQUMzQixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsZ0JBQWdCO1FBQzVDLENBQUMsQ0FBQztZQUNFLFVBQVUsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVTtZQUM3QyxTQUFTLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQVM7WUFDM0MsU0FBUyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTO1lBQzNDLFNBQVMsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUztZQUMzQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUk7WUFDakMsWUFBWSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZO1lBQ2pELFFBQVEsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUTtZQUN6QyxXQUFXLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFdBQVc7WUFDL0MsS0FBSyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLO1NBQ3BDO1FBQ0gsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUViLE1BQU0sU0FBUyxHQUFnRDtRQUM3RCxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDMUIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtRQUN4QyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7UUFDOUIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1FBQ2xCLGVBQWUsRUFBRSxjQUFjO1FBQy9CLGdCQUFnQixFQUFFLGVBQWU7UUFDakMsS0FBSztLQUNOLENBQUE7SUFFRCxPQUFPLElBQUksNEJBQVksQ0FBaUM7UUFDdEQsU0FBUztLQUNWLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FDRixDQUFBIn0=
|
package/README.md
CHANGED
|
@@ -1,78 +1,64 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
refundProviders: {
|
|
35
|
-
enabled: ["razorpay", "stripe"],
|
|
36
|
-
credentials: {
|
|
37
|
-
razorpay: {
|
|
38
|
-
keyId: process.env.RAZORPAY_KEY_ID,
|
|
39
|
-
keySecret: process.env.RAZORPAY_KEY_SECRET,
|
|
40
|
-
},
|
|
41
|
-
stripe: {
|
|
42
|
-
apiKey: process.env.STRIPE_API_KEY,
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
],
|
|
49
|
-
})
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## Documentation
|
|
53
|
-
|
|
54
|
-
For complete implementation guide including:
|
|
55
|
-
- Backend setup and configuration
|
|
56
|
-
- Frontend integration examples
|
|
57
|
-
- API reference
|
|
58
|
-
- Complete code examples
|
|
59
|
-
|
|
60
|
-
See **[IMPLEMENTATION_GUIDE.md](./IMPLEMENTATION_GUIDE.md)**
|
|
61
|
-
|
|
62
|
-
## How It Works
|
|
63
|
-
|
|
64
|
-
1. Customer creates return request and provides payment details
|
|
65
|
-
2. Admin marks return as "received" in Medusa admin
|
|
66
|
-
3. Plugin automatically:
|
|
67
|
-
- Detects COD order
|
|
68
|
-
- Processes refund via payment gateway
|
|
69
|
-
- Transfers money to customer
|
|
70
|
-
- Creates/updates refund record
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://www.medusajs.com">
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/59018053/229103275-b5e482bb-4601-46e6-8142-244f531cebdb.svg">
|
|
5
|
+
<source media="(prefers-color-scheme: light)" srcset="https://user-images.githubusercontent.com/59018053/229103726-e5b529a3-9b3f-4970-8a1f-c6af37f087bf.svg">
|
|
6
|
+
<img alt="Medusa logo" src="https://user-images.githubusercontent.com/59018053/229103726-e5b529a3-9b3f-4970-8a1f-c6af37f087bf.svg">
|
|
7
|
+
</picture>
|
|
8
|
+
</a>
|
|
9
|
+
</p>
|
|
10
|
+
<h1 align="center">
|
|
11
|
+
Medusa Plugin Starter
|
|
12
|
+
</h1>
|
|
13
|
+
|
|
14
|
+
<h4 align="center">
|
|
15
|
+
<a href="https://docs.medusajs.com">Documentation</a> |
|
|
16
|
+
<a href="https://www.medusajs.com">Website</a>
|
|
17
|
+
</h4>
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
Building blocks for digital commerce
|
|
21
|
+
</p>
|
|
22
|
+
<p align="center">
|
|
23
|
+
<a href="https://github.com/medusajs/medusa/blob/master/CONTRIBUTING.md">
|
|
24
|
+
<img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat" alt="PRs welcome!" />
|
|
25
|
+
</a>
|
|
26
|
+
<a href="https://www.producthunt.com/posts/medusa"><img src="https://img.shields.io/badge/Product%20Hunt-%231%20Product%20of%20the%20Day-%23DA552E" alt="Product Hunt"></a>
|
|
27
|
+
<a href="https://discord.gg/xpCwq3Kfn8">
|
|
28
|
+
<img src="https://img.shields.io/badge/chat-on%20discord-7289DA.svg" alt="Discord Chat" />
|
|
29
|
+
</a>
|
|
30
|
+
<a href="https://twitter.com/intent/follow?screen_name=medusajs">
|
|
31
|
+
<img src="https://img.shields.io/twitter/follow/medusajs.svg?label=Follow%20@medusajs" alt="Follow @medusajs" />
|
|
32
|
+
</a>
|
|
33
|
+
</p>
|
|
71
34
|
|
|
72
35
|
## Compatibility
|
|
73
36
|
|
|
74
|
-
|
|
37
|
+
This starter is compatible with versions >= 2.4.0 of `@medusajs/medusa`.
|
|
75
38
|
|
|
76
|
-
##
|
|
39
|
+
## Getting Started
|
|
77
40
|
|
|
78
|
-
|
|
41
|
+
Visit the [Quickstart Guide](https://docs.medusajs.com/learn/installation) to set up a server.
|
|
42
|
+
|
|
43
|
+
Visit the [Plugins documentation](https://docs.medusajs.com/learn/fundamentals/plugins) to learn more about plugins and how to create them.
|
|
44
|
+
|
|
45
|
+
Visit the [Docs](https://docs.medusajs.com/learn/installation#get-started) to learn more about our system requirements.
|
|
46
|
+
|
|
47
|
+
## What is Medusa
|
|
48
|
+
|
|
49
|
+
Medusa is a set of commerce modules and tools that allow you to build rich, reliable, and performant commerce applications without reinventing core commerce logic. The modules can be customized and used to build advanced ecommerce stores, marketplaces, or any product that needs foundational commerce primitives. All modules are open-source and freely available on npm.
|
|
50
|
+
|
|
51
|
+
Learn more about [Medusa’s architecture](https://docs.medusajs.com/learn/introduction/architecture) and [commerce modules](https://docs.medusajs.com/learn/fundamentals/modules/commerce-modules) in the Docs.
|
|
52
|
+
|
|
53
|
+
## Community & Contributions
|
|
54
|
+
|
|
55
|
+
The community and core team are available in [GitHub Discussions](https://github.com/medusajs/medusa/discussions), where you can ask for support, discuss roadmap, and share ideas.
|
|
56
|
+
|
|
57
|
+
Join our [Discord server](https://discord.com/invite/medusajs) to meet other community members.
|
|
58
|
+
|
|
59
|
+
## Other channels
|
|
60
|
+
|
|
61
|
+
- [GitHub Issues](https://github.com/medusajs/medusa/issues)
|
|
62
|
+
- [Twitter](https://twitter.com/medusajs)
|
|
63
|
+
- [LinkedIn](https://www.linkedin.com/company/medusajs)
|
|
64
|
+
- [Medusa Blog](https://medusajs.com/blog/)
|
package/package.json
CHANGED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.POST = void 0;
|
|
7
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
-
const utils_2 = require("@medusajs/framework/utils");
|
|
9
|
-
const process_cod_refund_workflow_1 = __importDefault(require("../../../../../workflows/process-cod-refund-workflow"));
|
|
10
|
-
/**
|
|
11
|
-
* Helper function to find return by ID
|
|
12
|
-
* Reused from payment-details route - consider extracting to shared utility
|
|
13
|
-
*/
|
|
14
|
-
async function findReturnById(orderService, returnId) {
|
|
15
|
-
try {
|
|
16
|
-
const orders = await orderService.listOrders({});
|
|
17
|
-
for (const order of orders) {
|
|
18
|
-
const orderWithReturns = order;
|
|
19
|
-
const returns = orderWithReturns.returns || [];
|
|
20
|
-
const returnRecord = returns.find((ret) => ret.id === returnId);
|
|
21
|
-
if (returnRecord) {
|
|
22
|
-
return returnRecord;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
catch (error) {
|
|
27
|
-
console.error("Error finding return:", error);
|
|
28
|
-
}
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Admin API endpoint to retry a failed refund
|
|
33
|
-
*
|
|
34
|
-
* POST /admin/returns/[id]/retry-refund
|
|
35
|
-
*
|
|
36
|
-
* Retries processing a refund for a return that previously failed.
|
|
37
|
-
* Increments retry_count and attempts payment processing again.
|
|
38
|
-
*/
|
|
39
|
-
const POST = async (req, res) => {
|
|
40
|
-
const { id: return_id } = req.params;
|
|
41
|
-
if (!return_id) {
|
|
42
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Return ID is required");
|
|
43
|
-
}
|
|
44
|
-
const orderService = req.scope.resolve(utils_2.Modules.ORDER);
|
|
45
|
-
// Find return to get order_id
|
|
46
|
-
const returnRecord = await findReturnById(orderService, return_id);
|
|
47
|
-
if (!returnRecord) {
|
|
48
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Return with ID ${return_id} not found`);
|
|
49
|
-
}
|
|
50
|
-
const orderId = returnRecord.order_id;
|
|
51
|
-
if (!orderId) {
|
|
52
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Return ${return_id} does not have an associated order_id`);
|
|
53
|
-
}
|
|
54
|
-
// Execute refund workflow (will handle retry logic internally)
|
|
55
|
-
try {
|
|
56
|
-
const { result } = await (0, process_cod_refund_workflow_1.default)(req.scope).run({
|
|
57
|
-
input: {
|
|
58
|
-
return_id,
|
|
59
|
-
order_id: orderId,
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
return res.json({
|
|
63
|
-
success: true,
|
|
64
|
-
message: "Refund retry initiated successfully",
|
|
65
|
-
refund_id: result.refund_id,
|
|
66
|
-
amount: result.amount,
|
|
67
|
-
currency_code: result.currency_code,
|
|
68
|
-
order_id: result.order_id,
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
73
|
-
// Return error response instead of throwing to provide better API response
|
|
74
|
-
return res.status(500).json({
|
|
75
|
-
success: false,
|
|
76
|
-
message: "Refund retry failed",
|
|
77
|
-
error: errorMessage,
|
|
78
|
-
return_id,
|
|
79
|
-
order_id: orderId,
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
exports.POST = POST;
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3JldHVybnMvW2lkXS9yZXRyeS1yZWZ1bmQvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EscURBQXVEO0FBQ3ZELHFEQUFtRDtBQUVuRCx1SEFBMkY7QUFFM0Y7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLGNBQWMsQ0FDM0IsWUFBaUMsRUFDakMsUUFBZ0I7SUFFaEIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRWhELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxLQUEyQyxDQUFBO1lBQ3BFLE1BQU0sT0FBTyxHQUFJLGdCQUFnQixDQUFDLE9BQXFCLElBQUksRUFBRSxDQUFBO1lBQzdELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQy9CLENBQUMsR0FBbUIsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQzdDLENBQUE7WUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixPQUFPLFlBQVksQ0FBQTtZQUNyQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNJLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtJQUVwQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix1QkFBdUIsQ0FDeEIsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBc0IsZUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTFFLDhCQUE4QjtJQUM5QixNQUFNLFlBQVksR0FBRyxNQUFNLGNBQWMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFFbEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLGtCQUFrQixTQUFTLFlBQVksQ0FDeEMsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBSSxZQUFxQyxDQUFDLFFBQVEsQ0FBQTtJQUUvRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixVQUFVLFNBQVMsdUNBQXVDLENBQzNELENBQUE7SUFDSCxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEscUNBQXdCLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMvRCxLQUFLLEVBQUU7Z0JBQ0wsU0FBUztnQkFDVCxRQUFRLEVBQUUsT0FBTzthQUNsQjtTQUNGLENBQUMsQ0FBQTtRQUVGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztZQUNkLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLHFDQUFxQztZQUM5QyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtZQUNuQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7U0FDMUIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLFlBQVksR0FDaEIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFBO1FBRTFELDJFQUEyRTtRQUMzRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLHFCQUFxQjtZQUM5QixLQUFLLEVBQUUsWUFBWTtZQUNuQixTQUFTO1lBQ1QsUUFBUSxFQUFFLE9BQU87U0FDbEIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUMsQ0FBQTtBQWhFWSxRQUFBLElBQUksUUFnRWhCIn0=
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GET = void 0;
|
|
4
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
-
const utils_2 = require("@medusajs/framework/utils");
|
|
6
|
-
/**
|
|
7
|
-
* Admin API endpoint to list failed refunds
|
|
8
|
-
*
|
|
9
|
-
* GET /admin/returns/failed-refunds
|
|
10
|
-
*
|
|
11
|
-
* Returns a list of all refunds with "failed" status.
|
|
12
|
-
* Useful for admin dashboard to see refunds that need attention.
|
|
13
|
-
*/
|
|
14
|
-
const GET = async (req, res) => {
|
|
15
|
-
const paymentService = req.scope.resolve(utils_2.Modules.PAYMENT);
|
|
16
|
-
try {
|
|
17
|
-
// Get query parameters for pagination/filtering
|
|
18
|
-
const limit = req.query.limit
|
|
19
|
-
? parseInt(req.query.limit, 10)
|
|
20
|
-
: 50;
|
|
21
|
-
const offset = req.query.offset
|
|
22
|
-
? parseInt(req.query.offset, 10)
|
|
23
|
-
: 0;
|
|
24
|
-
const currencyCodeFilter = req.query.currency_code;
|
|
25
|
-
const errorCodeFilter = req.query.error_code;
|
|
26
|
-
const returnIdFilter = req.query.return_id;
|
|
27
|
-
const orderIdFilter = req.query.order_id;
|
|
28
|
-
// List all payment collections
|
|
29
|
-
// Note: This is a simplified approach. In production, you might want
|
|
30
|
-
// to use a more efficient query method or create a custom service
|
|
31
|
-
// We fetch more than needed to allow filtering before pagination
|
|
32
|
-
const paymentCollections = await paymentService.listPaymentCollections?.({ limit: 1000, offset: 0 });
|
|
33
|
-
const failedRefunds = [];
|
|
34
|
-
if (paymentCollections && Array.isArray(paymentCollections)) {
|
|
35
|
-
for (const collection of paymentCollections) {
|
|
36
|
-
const collectionWithRefunds = collection;
|
|
37
|
-
// Check refunds in collection
|
|
38
|
-
const refunds = collectionWithRefunds.refunds || [];
|
|
39
|
-
for (const refund of refunds) {
|
|
40
|
-
const refundData = refund;
|
|
41
|
-
const metadata = refundData.metadata || {};
|
|
42
|
-
// Check if refund has failed status
|
|
43
|
-
if (metadata.refund_status === "failed") {
|
|
44
|
-
const refundRecord = {
|
|
45
|
-
refund_id: refundData.id,
|
|
46
|
-
amount: refundData.amount,
|
|
47
|
-
currency_code: refundData.currency_code,
|
|
48
|
-
payment_error: metadata.payment_error,
|
|
49
|
-
payment_error_code: metadata.payment_error_code,
|
|
50
|
-
failed_at: metadata.failed_at,
|
|
51
|
-
retry_count: metadata.retry_count || 0,
|
|
52
|
-
last_retry_at: metadata.last_retry_at,
|
|
53
|
-
return_id: metadata.return_id,
|
|
54
|
-
order_id: metadata.order_id,
|
|
55
|
-
created_at: refundData.created_at,
|
|
56
|
-
};
|
|
57
|
-
// Apply filters
|
|
58
|
-
if (currencyCodeFilter &&
|
|
59
|
-
refundRecord.currency_code !== currencyCodeFilter) {
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
if (errorCodeFilter &&
|
|
63
|
-
refundRecord.payment_error_code !== errorCodeFilter) {
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
if (returnIdFilter &&
|
|
67
|
-
refundRecord.return_id !== returnIdFilter) {
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
if (orderIdFilter &&
|
|
71
|
-
refundRecord.order_id !== orderIdFilter) {
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
failedRefunds.push(refundRecord);
|
|
75
|
-
}
|
|
76
|
-
// Also check payment collection metadata for fallback refunds
|
|
77
|
-
const collectionMetadata = collectionWithRefunds.metadata || {};
|
|
78
|
-
const refundsInMetadata = collectionMetadata.refunds || [];
|
|
79
|
-
for (const metaRefund of refundsInMetadata) {
|
|
80
|
-
const metaRefundData = metaRefund;
|
|
81
|
-
if (metaRefundData.refund_status === "failed" &&
|
|
82
|
-
!failedRefunds.find((r) => r.refund_id ===
|
|
83
|
-
metaRefundData.id)) {
|
|
84
|
-
const refundRecord = {
|
|
85
|
-
refund_id: metaRefundData.id,
|
|
86
|
-
payment_error: metaRefundData.payment_error,
|
|
87
|
-
payment_error_code: metaRefundData.payment_error_code,
|
|
88
|
-
refund_status: "failed",
|
|
89
|
-
return_id: metaRefundData.return_id,
|
|
90
|
-
order_id: metaRefundData.order_id,
|
|
91
|
-
};
|
|
92
|
-
// Apply filters
|
|
93
|
-
if (returnIdFilter &&
|
|
94
|
-
refundRecord.return_id !== returnIdFilter) {
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
if (orderIdFilter &&
|
|
98
|
-
refundRecord.order_id !== orderIdFilter) {
|
|
99
|
-
continue;
|
|
100
|
-
}
|
|
101
|
-
failedRefunds.push(refundRecord);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// Sort by failed_at (most recent first) or created_at
|
|
108
|
-
failedRefunds.sort((a, b) => {
|
|
109
|
-
const dateA = a.failed_at
|
|
110
|
-
? new Date(a.failed_at).getTime()
|
|
111
|
-
: a.created_at
|
|
112
|
-
? new Date(a.created_at).getTime()
|
|
113
|
-
: 0;
|
|
114
|
-
const dateB = b.failed_at
|
|
115
|
-
? new Date(b.failed_at).getTime()
|
|
116
|
-
: b.created_at
|
|
117
|
-
? new Date(b.created_at).getTime()
|
|
118
|
-
: 0;
|
|
119
|
-
return dateB - dateA; // Descending order
|
|
120
|
-
});
|
|
121
|
-
const totalCount = failedRefunds.length;
|
|
122
|
-
// Apply pagination
|
|
123
|
-
const paginatedRefunds = failedRefunds.slice(offset, offset + limit);
|
|
124
|
-
return res.json({
|
|
125
|
-
failed_refunds: paginatedRefunds,
|
|
126
|
-
count: totalCount,
|
|
127
|
-
limit,
|
|
128
|
-
offset,
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
133
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to retrieve failed refunds: ${errorMessage}`);
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
exports.GET = GET;
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3JldHVybnMvZmFpbGVkLXJlZnVuZHMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQXVEO0FBQ3ZELHFEQUFtRDtBQUduRDs7Ozs7OztHQU9HO0FBQ0ksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUFrQixFQUNsQixHQUFtQixFQUNuQixFQUFFO0lBQ0YsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ3RDLGVBQU8sQ0FBQyxPQUFPLENBQ2hCLENBQUE7SUFFRCxJQUFJLENBQUM7UUFDSCxnREFBZ0Q7UUFDaEQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLO1lBQzNCLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDTixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07WUFDN0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQWdCLEVBQUUsRUFBRSxDQUFDO1lBQzFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDTCxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBbUMsQ0FBQTtRQUN4RSxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQWdDLENBQUE7UUFDbEUsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUErQixDQUFBO1FBQ2hFLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBOEIsQ0FBQTtRQUU5RCwrQkFBK0I7UUFDL0IscUVBQXFFO1FBQ3JFLGtFQUFrRTtRQUNsRSxpRUFBaUU7UUFD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
|