order-management 0.0.17 → 0.0.19
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 +644 -11
- package/.medusa/server/src/admin/index.mjs +644 -11
- package/.medusa/server/src/api/admin/swaps/[id]/approve/route.js +74 -0
- package/.medusa/server/src/api/admin/swaps/[id]/process-payment/route.js +152 -0
- package/.medusa/server/src/api/admin/swaps/[id]/reject/route.js +43 -0
- package/.medusa/server/src/api/admin/swaps/[id]/route.js +70 -0
- package/.medusa/server/src/api/admin/swaps/[id]/status/route.js +45 -0
- package/.medusa/server/src/api/admin/swaps/[id]/sync/route.js +148 -0
- package/.medusa/server/src/api/admin/swaps/route.js +51 -0
- package/.medusa/server/src/api/admin/swaps/validators.js +22 -0
- package/.medusa/server/src/api/store/guest-orders/[id]/invoice/route.js +17 -5
- package/.medusa/server/src/api/store/guest-orders/[id]/returns/route.js +17 -5
- package/.medusa/server/src/api/store/guest-orders/[id]/route.js +17 -5
- package/.medusa/server/src/api/store/guest-orders/route.js +17 -5
- package/.medusa/server/src/api/store/orders/[order_id]/swaps/route.js +107 -0
- package/.medusa/server/src/api/store/otp/request/route.js +12 -5
- package/.medusa/server/src/api/store/swaps/[id]/cancel/route.js +64 -0
- package/.medusa/server/src/api/store/swaps/[id]/route.js +112 -0
- package/.medusa/server/src/api/store/swaps/route.js +117 -0
- package/.medusa/server/src/helpers/index.js +18 -0
- package/.medusa/server/src/helpers/swaps.js +88 -0
- package/.medusa/server/src/modules/swap/index.js +13 -0
- package/.medusa/server/src/modules/swap/migrations/Migration20260121164326.js +49 -0
- package/.medusa/server/src/modules/swap/models/swap.js +21 -0
- package/.medusa/server/src/modules/swap/service.js +224 -0
- package/.medusa/server/src/services/otp-service.js +16 -5
- package/.medusa/server/src/subscribers/send-order-email.js +27 -8
- package/.medusa/server/src/workflows/index.js +8 -2
- package/.medusa/server/src/workflows/steps/swap/calculate-difference-step.js +56 -0
- package/.medusa/server/src/workflows/steps/swap/create-medusa-exchange-step.js +71 -0
- package/.medusa/server/src/workflows/steps/swap/create-medusa-return-step.js +79 -0
- package/.medusa/server/src/workflows/steps/swap/create-swap-step.js +29 -0
- package/.medusa/server/src/workflows/steps/swap/handle-payment-difference-step.js +102 -0
- package/.medusa/server/src/workflows/steps/swap/index.js +26 -0
- package/.medusa/server/src/workflows/steps/swap/retrieve-swap-step.js +26 -0
- package/.medusa/server/src/workflows/steps/swap/sync-medusa-status-step.js +132 -0
- package/.medusa/server/src/workflows/steps/swap/update-swap-status-step.js +25 -0
- package/.medusa/server/src/workflows/steps/swap/validate-eligibility-step.js +25 -0
- package/.medusa/server/src/workflows/steps/swap/validate-order-step.js +69 -0
- package/.medusa/server/src/workflows/steps/swap/validate-swap-items-step.js +41 -0
- package/.medusa/server/src/workflows/swaps/approve-swap-workflow.js +22 -0
- package/.medusa/server/src/workflows/swaps/create-swap-workflow.js +52 -0
- package/.medusa/server/src/workflows/swaps/execute-swap-workflow.js +36 -0
- package/.medusa/server/src/workflows/swaps/types.js +3 -0
- package/.medusa/server/src/workflows/swaps/update-swap-status-workflow.js +23 -0
- package/README.md +208 -0
- package/package.json +1 -1
- package/.medusa/server/src/utils/resolve-options.js +0 -101
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = exports.GET = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const create_swap_workflow_1 = require("../../../workflows/swaps/create-swap-workflow");
|
|
6
|
+
const swap_1 = require("../../../modules/swap");
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
const CreateSwapSchema = zod_1.z.object({
|
|
9
|
+
order_id: zod_1.z.string(),
|
|
10
|
+
return_items: zod_1.z.array(zod_1.z.object({
|
|
11
|
+
id: zod_1.z.string(),
|
|
12
|
+
quantity: zod_1.z.number().positive(),
|
|
13
|
+
reason: zod_1.z.string().optional(),
|
|
14
|
+
})),
|
|
15
|
+
new_items: zod_1.z.array(zod_1.z.object({
|
|
16
|
+
variant_id: zod_1.z.string(),
|
|
17
|
+
quantity: zod_1.z.number().positive(),
|
|
18
|
+
})),
|
|
19
|
+
reason: zod_1.z.string().optional(),
|
|
20
|
+
note: zod_1.z.string().optional(),
|
|
21
|
+
});
|
|
22
|
+
const GET = async (req, res) => {
|
|
23
|
+
// Type-safe access to auth_context
|
|
24
|
+
const authContext = req.auth_context;
|
|
25
|
+
const customerId = authContext?.actor_id;
|
|
26
|
+
if (!customerId || authContext?.actor_type !== "customer") {
|
|
27
|
+
res.status(401).json({
|
|
28
|
+
message: "Unauthorized: Customer authentication is required",
|
|
29
|
+
});
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const swapService = req.scope.resolve(swap_1.SWAP_MODULE);
|
|
34
|
+
// Get query parameters
|
|
35
|
+
const orderId = req.query.order_id;
|
|
36
|
+
const filters = {};
|
|
37
|
+
if (orderId) {
|
|
38
|
+
filters.order_id = orderId;
|
|
39
|
+
}
|
|
40
|
+
// Note: We'd need to add a method to filter by customer_id
|
|
41
|
+
// For now, we'll list all swaps and filter client-side
|
|
42
|
+
// In production, you'd want to add a proper filter method
|
|
43
|
+
const swaps = await swapService.listSwaps(filters, {
|
|
44
|
+
take: 100,
|
|
45
|
+
skip: 0,
|
|
46
|
+
});
|
|
47
|
+
// Filter by customer orders (would need order lookup)
|
|
48
|
+
// For now, return all swaps - filtering should be done via order_id
|
|
49
|
+
res.json({
|
|
50
|
+
swaps: Array.isArray(swaps) ? swaps : swaps ? [swaps] : [],
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
55
|
+
res.status(500).json({
|
|
56
|
+
message: "Failed to retrieve swaps",
|
|
57
|
+
error: errorMessage,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
exports.GET = GET;
|
|
62
|
+
const POST = async (req, res) => {
|
|
63
|
+
// Type-safe access to auth_context
|
|
64
|
+
const authContext = req.auth_context;
|
|
65
|
+
const customerId = authContext?.actor_id;
|
|
66
|
+
if (!customerId || authContext?.actor_type !== "customer") {
|
|
67
|
+
res.status(401).json({
|
|
68
|
+
message: "Unauthorized: Customer authentication is required",
|
|
69
|
+
});
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
// Validate request body
|
|
74
|
+
const body = CreateSwapSchema.parse(req.body);
|
|
75
|
+
const { result } = await (0, create_swap_workflow_1.createSwapWorkflow)(req.scope).run({
|
|
76
|
+
input: {
|
|
77
|
+
order_id: body.order_id,
|
|
78
|
+
return_items: body.return_items,
|
|
79
|
+
new_items: body.new_items,
|
|
80
|
+
reason: body.reason,
|
|
81
|
+
note: body.note,
|
|
82
|
+
customer_id: customerId,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
res.status(201).json(result);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error instanceof zod_1.z.ZodError) {
|
|
89
|
+
res.status(400).json({
|
|
90
|
+
message: "Invalid request data",
|
|
91
|
+
errors: error.errors,
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (error instanceof utils_1.MedusaError) {
|
|
96
|
+
const statusCode = error.type === utils_1.MedusaError.Types.NOT_FOUND
|
|
97
|
+
? 404
|
|
98
|
+
: error.type === utils_1.MedusaError.Types.NOT_ALLOWED
|
|
99
|
+
? 403
|
|
100
|
+
: error.type === utils_1.MedusaError.Types.UNAUTHORIZED
|
|
101
|
+
? 401
|
|
102
|
+
: 400;
|
|
103
|
+
res.status(statusCode).json({
|
|
104
|
+
message: error.message,
|
|
105
|
+
type: error.type,
|
|
106
|
+
});
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
110
|
+
res.status(500).json({
|
|
111
|
+
message: "Failed to create swap",
|
|
112
|
+
error: errorMessage,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
exports.POST = POST;
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3N3YXBzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUF1RDtBQUN2RCx3RkFBa0Y7QUFDbEYsZ0RBQW1EO0FBRW5ELDZCQUF1QjtBQUV2QixNQUFNLGdCQUFnQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEMsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDcEIsWUFBWSxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQ25CLE9BQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNkLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO1FBQy9CLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0tBQzlCLENBQUMsQ0FDSDtJQUNELFNBQVMsRUFBRSxPQUFDLENBQUMsS0FBSyxDQUNoQixPQUFDLENBQUMsTUFBTSxDQUFDO1FBQ1AsVUFBVSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDdEIsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7S0FDaEMsQ0FBQyxDQUNIO0lBQ0QsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDNUIsQ0FBQyxDQUFBO0FBRUssTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUFrQixFQUNsQixHQUFtQixFQUNKLEVBQUU7SUFDakIsbUNBQW1DO0lBQ25DLE1BQU0sV0FBVyxHQUFJLEdBRW5CLENBQUMsWUFBWSxDQUFBO0lBRWYsTUFBTSxVQUFVLEdBQUcsV0FBVyxFQUFFLFFBQVEsQ0FB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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./swaps"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMENBQXVCIn0=
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSwapRequest = createSwapRequest;
|
|
4
|
+
exports.getSwaps = getSwaps;
|
|
5
|
+
exports.getSwap = getSwap;
|
|
6
|
+
exports.cancelSwap = cancelSwap;
|
|
7
|
+
/**
|
|
8
|
+
* Create a swap request
|
|
9
|
+
*/
|
|
10
|
+
async function createSwapRequest(input, container) {
|
|
11
|
+
const { orderId, returnItems, newItems, reason, note } = input;
|
|
12
|
+
const response = await fetch(`/store/swaps`, {
|
|
13
|
+
method: "POST",
|
|
14
|
+
headers: {
|
|
15
|
+
"Content-Type": "application/json",
|
|
16
|
+
},
|
|
17
|
+
credentials: "include",
|
|
18
|
+
body: JSON.stringify({
|
|
19
|
+
order_id: orderId,
|
|
20
|
+
return_items: returnItems,
|
|
21
|
+
new_items: newItems,
|
|
22
|
+
reason,
|
|
23
|
+
note,
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
const error = await response.json();
|
|
28
|
+
throw new Error(error.message || "Failed to create swap request");
|
|
29
|
+
}
|
|
30
|
+
const data = (await response.json());
|
|
31
|
+
return data.swap;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get swaps for a customer (optionally filtered by order ID)
|
|
35
|
+
*/
|
|
36
|
+
async function getSwaps(orderId, container) {
|
|
37
|
+
const url = orderId ? `/store/orders/${orderId}/swaps` : `/store/swaps`;
|
|
38
|
+
const response = await fetch(url, {
|
|
39
|
+
method: "GET",
|
|
40
|
+
headers: {
|
|
41
|
+
"Content-Type": "application/json",
|
|
42
|
+
},
|
|
43
|
+
credentials: "include",
|
|
44
|
+
});
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
const error = await response.json();
|
|
47
|
+
throw new Error(error.message || "Failed to retrieve swaps");
|
|
48
|
+
}
|
|
49
|
+
const data = (await response.json());
|
|
50
|
+
return data.swaps || [];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get a specific swap by ID
|
|
54
|
+
*/
|
|
55
|
+
async function getSwap(swapId, container) {
|
|
56
|
+
const response = await fetch(`/store/swaps/${swapId}`, {
|
|
57
|
+
method: "GET",
|
|
58
|
+
headers: {
|
|
59
|
+
"Content-Type": "application/json",
|
|
60
|
+
},
|
|
61
|
+
credentials: "include",
|
|
62
|
+
});
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
const error = await response.json();
|
|
65
|
+
throw new Error(error.message || "Failed to retrieve swap");
|
|
66
|
+
}
|
|
67
|
+
const data = (await response.json());
|
|
68
|
+
return data.swap;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Cancel a swap request
|
|
72
|
+
*/
|
|
73
|
+
async function cancelSwap(swapId, container) {
|
|
74
|
+
const response = await fetch(`/store/swaps/${swapId}/cancel`, {
|
|
75
|
+
method: "POST",
|
|
76
|
+
headers: {
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
},
|
|
79
|
+
credentials: "include",
|
|
80
|
+
});
|
|
81
|
+
if (!response.ok) {
|
|
82
|
+
const error = await response.json();
|
|
83
|
+
throw new Error(error.message || "Failed to cancel swap");
|
|
84
|
+
}
|
|
85
|
+
const data = (await response.json());
|
|
86
|
+
return data.swap;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9zd2Fwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXVDQSw4Q0E0QkM7QUFLRCw0QkFxQkM7QUFLRCwwQkFtQkM7QUFLRCxnQ0FtQkM7QUF6R0Q7O0dBRUc7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLEtBQTZCLEVBQzdCLFNBQTBCO0lBRTFCLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRTlELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLGNBQWMsRUFBRTtRQUMzQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkM7UUFDRCxXQUFXLEVBQUUsU0FBUztRQUN0QixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQixRQUFRLEVBQUUsT0FBTztZQUNqQixZQUFZLEVBQUUsV0FBVztZQUN6QixTQUFTLEVBQUUsUUFBUTtZQUNuQixNQUFNO1lBQ04sSUFBSTtTQUNMLENBQUM7S0FDSCxDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSwrQkFBK0IsQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFtQixDQUFBO0lBQ3RELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtBQUNsQixDQUFDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsUUFBUSxDQUM1QixPQUFnQixFQUNoQixTQUEyQjtJQUUzQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFBO0lBRXZFLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNoQyxNQUFNLEVBQUUsS0FBSztRQUNiLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkM7UUFDRCxXQUFXLEVBQUUsU0FBUztLQUN2QixDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFzQixDQUFBO0lBQ3pELE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUE7QUFDekIsQ0FBQztBQUVEOztHQUVHO0FBQ0ksS0FBSyxVQUFVLE9BQU8sQ0FDM0IsTUFBYyxFQUNkLFNBQTJCO0lBRTNCLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLGdCQUFnQixNQUFNLEVBQUUsRUFBRTtRQUNyRCxNQUFNLEVBQUUsS0FBSztRQUNiLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkM7UUFDRCxXQUFXLEVBQUUsU0FBUztLQUN2QixDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSx5QkFBeUIsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFtQixDQUFBO0lBQ3RELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtBQUNsQixDQUFDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsVUFBVSxDQUM5QixNQUFjLEVBQ2QsU0FBMkI7SUFFM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxFQUFFO1FBQzVELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFO1lBQ1AsY0FBYyxFQUFFLGtCQUFrQjtTQUNuQztRQUNELFdBQVcsRUFBRSxTQUFTO0tBQ3ZCLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxLQUFLLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLHVCQUF1QixDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQW1CLENBQUE7SUFDdEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0FBQ2xCLENBQUMifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
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.SWAP_MODULE = void 0;
|
|
7
|
+
const service_1 = __importDefault(require("./service"));
|
|
8
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
+
exports.SWAP_MODULE = "swap";
|
|
10
|
+
exports.default = (0, utils_1.Module)(exports.SWAP_MODULE, {
|
|
11
|
+
service: service_1.default,
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9zd2FwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHdEQUFtQztBQUNuQyxxREFBa0Q7QUFFckMsUUFBQSxXQUFXLEdBQUcsTUFBTSxDQUFBO0FBRWpDLGtCQUFlLElBQUEsY0FBTSxFQUFDLG1CQUFXLEVBQUU7SUFDakMsT0FBTyxFQUFFLGlCQUFXO0NBQ3JCLENBQUMsQ0FBQSJ9
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260121164326 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20260121164326 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`
|
|
8
|
+
CREATE TABLE IF NOT EXISTS "swap" (
|
|
9
|
+
"id" text PRIMARY KEY,
|
|
10
|
+
"order_id" text NOT NULL,
|
|
11
|
+
"status" text NOT NULL DEFAULT 'requested',
|
|
12
|
+
"return_items" jsonb NULL,
|
|
13
|
+
"new_items" jsonb NULL,
|
|
14
|
+
"difference_due" numeric NOT NULL DEFAULT 0,
|
|
15
|
+
"payment_status" text NULL,
|
|
16
|
+
"fulfillment_status" text NULL,
|
|
17
|
+
"return_id" text NULL,
|
|
18
|
+
"exchange_id" text NULL,
|
|
19
|
+
"reason" text NULL,
|
|
20
|
+
"note" text NULL,
|
|
21
|
+
"metadata" jsonb NULL,
|
|
22
|
+
"created_at" timestamptz NOT NULL DEFAULT now(),
|
|
23
|
+
"updated_at" timestamptz NOT NULL DEFAULT now(),
|
|
24
|
+
"deleted_at" timestamptz NULL
|
|
25
|
+
);
|
|
26
|
+
`);
|
|
27
|
+
this.addSql(`
|
|
28
|
+
CREATE INDEX IF NOT EXISTS "IDX_swap_order_id"
|
|
29
|
+
ON "swap" ("order_id") WHERE "deleted_at" IS NULL;
|
|
30
|
+
`);
|
|
31
|
+
this.addSql(`
|
|
32
|
+
CREATE INDEX IF NOT EXISTS "IDX_swap_status"
|
|
33
|
+
ON "swap" ("status") WHERE "deleted_at" IS NULL;
|
|
34
|
+
`);
|
|
35
|
+
this.addSql(`
|
|
36
|
+
CREATE INDEX IF NOT EXISTS "IDX_swap_created_at"
|
|
37
|
+
ON "swap" ("created_at") WHERE "deleted_at" IS NULL;
|
|
38
|
+
`);
|
|
39
|
+
this.addSql(`
|
|
40
|
+
CREATE INDEX IF NOT EXISTS "IDX_swap_deleted_at"
|
|
41
|
+
ON "swap" ("deleted_at") WHERE "deleted_at" IS NULL;
|
|
42
|
+
`);
|
|
43
|
+
}
|
|
44
|
+
async down() {
|
|
45
|
+
this.addSql(`DROP TABLE IF EXISTS "swap";`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.Migration20260121164326 = Migration20260121164326;
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjAxMjExNjQzMjYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9zd2FwL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNjAxMjExNjQzMjYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQW9FO0FBRXBFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDcEQsS0FBSyxDQUFDLEVBQUU7UUFDTixJQUFJLENBQUMsTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBbUJYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0NBQ0Y7QUEvQ0QsMERBK0NDIn0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Swap = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
exports.Swap = utils_1.model.define("swap", {
|
|
6
|
+
id: utils_1.model.id().primaryKey(),
|
|
7
|
+
order_id: utils_1.model.text(),
|
|
8
|
+
status: utils_1.model.text().default("requested"), // requested, approved, rejected, return_started, return_shipped, return_received, new_items_shipped, completed, cancelled
|
|
9
|
+
return_items: utils_1.model.json().nullable(), // Array of { id: string, quantity: number, reason?: string }
|
|
10
|
+
new_items: utils_1.model.json().nullable(), // Array of { variant_id: string, quantity: number }
|
|
11
|
+
difference_due: utils_1.model.number().default(0), // Price difference (positive = customer owes, negative = refund)
|
|
12
|
+
payment_status: utils_1.model.text().nullable(), // pending, refunded, captured, cancelled
|
|
13
|
+
fulfillment_status: utils_1.model.text().nullable(), // not_fulfilled, fulfilled, shipped, delivered, cancelled
|
|
14
|
+
return_id: utils_1.model.text().nullable(), // Link to Medusa's return if created
|
|
15
|
+
exchange_id: utils_1.model.text().nullable(), // Link to Medusa's exchange if created
|
|
16
|
+
reason: utils_1.model.text().nullable(), // Reason for swap
|
|
17
|
+
note: utils_1.model.text().nullable(), // Customer note
|
|
18
|
+
metadata: utils_1.model.json().nullable(), // Status history, admin notes, etc.
|
|
19
|
+
});
|
|
20
|
+
exports.default = exports.Swap;
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3N3YXAvbW9kZWxzL3N3YXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWlEO0FBRXBDLFFBQUEsSUFBSSxHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO0lBQ3ZDLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3RCLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLDBIQUEwSDtJQUNySyxZQUFZLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLDZEQUE2RDtJQUNwRyxTQUFTLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLG9EQUFvRDtJQUN4RixjQUFjLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxpRUFBaUU7SUFDNUcsY0FBYyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSx5Q0FBeUM7SUFDbEYsa0JBQWtCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLDBEQUEwRDtJQUN2RyxTQUFTLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLHFDQUFxQztJQUN6RSxXQUFXLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLHVDQUF1QztJQUM3RSxNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLGtCQUFrQjtJQUNuRCxJQUFJLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLGdCQUFnQjtJQUMvQyxRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLG9DQUFvQztDQUN4RSxDQUFDLENBQUE7QUFFRixrQkFBZSxZQUFJLENBQUEifQ==
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const swap_1 = require("./models/swap");
|
|
5
|
+
class SwapService extends (0, utils_1.MedusaService)({ Swap: swap_1.Swap }) {
|
|
6
|
+
constructor(container) {
|
|
7
|
+
super(container);
|
|
8
|
+
this.manager_ = container.manager;
|
|
9
|
+
this.logger_ = container.logger;
|
|
10
|
+
}
|
|
11
|
+
async createSwap(input) {
|
|
12
|
+
const { order_id, return_items, new_items, reason, note } = input;
|
|
13
|
+
if (!return_items || return_items.length === 0) {
|
|
14
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Return items are required");
|
|
15
|
+
}
|
|
16
|
+
if (!new_items || new_items.length === 0) {
|
|
17
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "New items are required");
|
|
18
|
+
}
|
|
19
|
+
const swap = await this.createSwaps({
|
|
20
|
+
order_id,
|
|
21
|
+
status: "requested",
|
|
22
|
+
return_items: return_items,
|
|
23
|
+
new_items: new_items,
|
|
24
|
+
difference_due: 0, // Will be calculated later
|
|
25
|
+
reason: reason || null,
|
|
26
|
+
note: note || null,
|
|
27
|
+
metadata: {
|
|
28
|
+
created_at: new Date().toISOString(),
|
|
29
|
+
status_history: [
|
|
30
|
+
{
|
|
31
|
+
status: "requested",
|
|
32
|
+
timestamp: new Date().toISOString(),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
return Array.isArray(swap) ? swap[0] : swap;
|
|
38
|
+
}
|
|
39
|
+
async approveSwap(swapId, adminId) {
|
|
40
|
+
const swap = await this.retrieveSwap(swapId);
|
|
41
|
+
const swapData = swap;
|
|
42
|
+
if (swapData.status !== "requested") {
|
|
43
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Swap cannot be approved. Current status: ${swapData.status}`);
|
|
44
|
+
}
|
|
45
|
+
const metadata = swapData.metadata || {};
|
|
46
|
+
const statusHistory = metadata.status_history || [];
|
|
47
|
+
const medusaIntegration = metadata.medusa_integration || {};
|
|
48
|
+
const securityChecks = metadata.security_checks || {};
|
|
49
|
+
await this.updateSwaps({
|
|
50
|
+
selector: { id: swapId },
|
|
51
|
+
data: {
|
|
52
|
+
status: "approved",
|
|
53
|
+
metadata: {
|
|
54
|
+
...metadata,
|
|
55
|
+
approved_at: new Date().toISOString(),
|
|
56
|
+
approved_by: adminId,
|
|
57
|
+
status_history: [
|
|
58
|
+
...statusHistory,
|
|
59
|
+
{
|
|
60
|
+
status: "approved",
|
|
61
|
+
timestamp: new Date().toISOString(),
|
|
62
|
+
admin_id: adminId,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
medusa_integration: {
|
|
66
|
+
...medusaIntegration,
|
|
67
|
+
},
|
|
68
|
+
security_checks: {
|
|
69
|
+
...securityChecks,
|
|
70
|
+
admin_approved_by: adminId,
|
|
71
|
+
admin_approved_at: new Date().toISOString(),
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
return await this.retrieveSwap(swapId);
|
|
77
|
+
}
|
|
78
|
+
async rejectSwap(swapId, adminId, reason) {
|
|
79
|
+
const swap = await this.retrieveSwap(swapId);
|
|
80
|
+
const swapData = swap;
|
|
81
|
+
if (swapData.status !== "requested") {
|
|
82
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Swap cannot be rejected. Current status: ${swapData.status}`);
|
|
83
|
+
}
|
|
84
|
+
const metadata = swapData.metadata || {};
|
|
85
|
+
const statusHistory = metadata.status_history || [];
|
|
86
|
+
await this.updateSwaps({
|
|
87
|
+
selector: { id: swapId },
|
|
88
|
+
data: {
|
|
89
|
+
status: "rejected",
|
|
90
|
+
metadata: {
|
|
91
|
+
...metadata,
|
|
92
|
+
rejected_at: new Date().toISOString(),
|
|
93
|
+
rejected_by: adminId,
|
|
94
|
+
rejection_reason: reason || null,
|
|
95
|
+
status_history: [
|
|
96
|
+
...statusHistory,
|
|
97
|
+
{
|
|
98
|
+
status: "rejected",
|
|
99
|
+
timestamp: new Date().toISOString(),
|
|
100
|
+
admin_id: adminId,
|
|
101
|
+
reason: reason || null,
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
return await this.retrieveSwap(swapId);
|
|
108
|
+
}
|
|
109
|
+
async updateSwapStatus(input) {
|
|
110
|
+
const { swap_id, status, metadata: additionalMetadata } = input;
|
|
111
|
+
const swap = await this.retrieveSwap(swap_id);
|
|
112
|
+
const swapData = swap;
|
|
113
|
+
const currentStatus = swapData.status;
|
|
114
|
+
// Validate status transition
|
|
115
|
+
const validTransitions = {
|
|
116
|
+
requested: ["approved", "rejected", "cancelled"],
|
|
117
|
+
approved: ["return_started", "cancelled"],
|
|
118
|
+
return_started: ["return_shipped", "cancelled"],
|
|
119
|
+
return_shipped: ["return_received", "cancelled"],
|
|
120
|
+
return_received: ["new_items_shipped", "cancelled"],
|
|
121
|
+
new_items_shipped: ["completed", "cancelled"],
|
|
122
|
+
rejected: [], // Terminal state
|
|
123
|
+
completed: [], // Terminal state
|
|
124
|
+
cancelled: [], // Terminal state
|
|
125
|
+
};
|
|
126
|
+
const allowedTransitions = validTransitions[currentStatus] || [];
|
|
127
|
+
if (!allowedTransitions.includes(status)) {
|
|
128
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Invalid status transition from ${currentStatus} to ${status}. Allowed transitions: ${allowedTransitions.join(", ")}`);
|
|
129
|
+
}
|
|
130
|
+
const metadata = swapData.metadata || {};
|
|
131
|
+
const statusHistory = metadata.status_history || [];
|
|
132
|
+
await this.updateSwaps({
|
|
133
|
+
selector: { id: swap_id },
|
|
134
|
+
data: {
|
|
135
|
+
status,
|
|
136
|
+
metadata: {
|
|
137
|
+
...metadata,
|
|
138
|
+
...additionalMetadata,
|
|
139
|
+
status_history: [
|
|
140
|
+
...statusHistory,
|
|
141
|
+
{
|
|
142
|
+
status,
|
|
143
|
+
timestamp: new Date().toISOString(),
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
return await this.retrieveSwap(swap_id);
|
|
150
|
+
}
|
|
151
|
+
async calculateDifferenceDue(swapId) {
|
|
152
|
+
const swap = await this.retrieveSwap(swapId);
|
|
153
|
+
const swapData = swap;
|
|
154
|
+
// This is a placeholder - actual calculation would require:
|
|
155
|
+
// 1. Fetch order items and their prices
|
|
156
|
+
// 2. Calculate return items total
|
|
157
|
+
// 3. Calculate new items total
|
|
158
|
+
// 4. Return difference (new_items_total - return_items_total)
|
|
159
|
+
// For now, return stored value or 0 - this will be implemented in workflow step
|
|
160
|
+
return swapData.difference_due || 0;
|
|
161
|
+
}
|
|
162
|
+
async validateEligibility(orderId, returnItems) {
|
|
163
|
+
// Check for existing pending swaps for the same order
|
|
164
|
+
const existingSwaps = await this.listSwaps({
|
|
165
|
+
order_id: orderId,
|
|
166
|
+
status: ["requested", "approved", "return_started"],
|
|
167
|
+
}, {
|
|
168
|
+
take: 100,
|
|
169
|
+
});
|
|
170
|
+
const swapsArray = Array.isArray(existingSwaps) ? existingSwaps : existingSwaps ? [existingSwaps] : [];
|
|
171
|
+
// Check if any return items overlap with existing swaps
|
|
172
|
+
for (const existingSwap of swapsArray) {
|
|
173
|
+
const swapData = existingSwap;
|
|
174
|
+
const existingReturnItems = swapData.return_items;
|
|
175
|
+
if (existingReturnItems) {
|
|
176
|
+
for (const returnItem of returnItems) {
|
|
177
|
+
const hasOverlap = existingReturnItems.some((existing) => existing.id === returnItem.id && existing.quantity > 0);
|
|
178
|
+
if (hasOverlap) {
|
|
179
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Item ${returnItem.id} is already part of a pending swap for this order`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async checkRateLimit(customerId, orderId) {
|
|
186
|
+
// Check for existing swaps by this customer for this order
|
|
187
|
+
const existingSwaps = await this.listSwaps({
|
|
188
|
+
order_id: orderId,
|
|
189
|
+
}, {
|
|
190
|
+
take: 100,
|
|
191
|
+
});
|
|
192
|
+
const swapsArray = Array.isArray(existingSwaps) ? existingSwaps : existingSwaps ? [existingSwaps] : [];
|
|
193
|
+
const maxSwapsPerOrder = 5; // Configurable limit
|
|
194
|
+
if (swapsArray.length >= maxSwapsPerOrder) {
|
|
195
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Maximum ${maxSwapsPerOrder} swaps allowed per order`);
|
|
196
|
+
}
|
|
197
|
+
// Check customer's total swap count (across all orders)
|
|
198
|
+
const customerSwaps = await this.listSwaps({}, {
|
|
199
|
+
take: 1000,
|
|
200
|
+
});
|
|
201
|
+
const customerSwapsArray = Array.isArray(customerSwaps)
|
|
202
|
+
? customerSwaps
|
|
203
|
+
: customerSwaps
|
|
204
|
+
? [customerSwaps]
|
|
205
|
+
: [];
|
|
206
|
+
// Filter by customer (would need to join with order, simplified here)
|
|
207
|
+
// In a real implementation, you'd query orders with customer_id and then swaps
|
|
208
|
+
const maxSwapsPerCustomer = 20; // Configurable limit
|
|
209
|
+
const customerSwapCount = customerSwapsArray.length;
|
|
210
|
+
if (customerSwapCount >= maxSwapsPerCustomer) {
|
|
211
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Maximum ${maxSwapsPerCustomer} swaps allowed per customer`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async validateItemEligibility(itemId) {
|
|
215
|
+
// This would check item metadata for eligibility flags
|
|
216
|
+
// For now, return true - can be extended to check:
|
|
217
|
+
// - Item metadata.exchange_eligible flag
|
|
218
|
+
// - Product type restrictions
|
|
219
|
+
// - Final sale items
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
exports.default = SwapService;
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3N3YXAvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFzRTtBQUN0RSx3Q0FBb0M7QUFrQ3BDLE1BQXFCLFdBQVksU0FBUSxJQUFBLHFCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUosV0FBSSxFQUFFLENBQUM7SUFJOUQsWUFBWSxTQUErQjtRQUN6QyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFBO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQTtJQUNqQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFzQjtRQUNyQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQTtRQUVqRSxJQUFJLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsMkJBQTJCLENBQzVCLENBQUE7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHdCQUF3QixDQUN6QixDQUFBO1FBQ0gsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNsQyxRQUFRO1lBQ1IsTUFBTSxFQUFFLFdBQVc7WUFDbkIsWUFBWSxFQUFFLFlBQWtEO1lBQ2hFLFNBQVMsRUFBRSxT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
|
|
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.OtpService = void 0;
|
|
7
7
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
-
const resolve_options_1 = require("../utils/resolve-options");
|
|
9
8
|
// In-memory store for OTPs.
|
|
10
9
|
// NOTE: In a real production environment with multiple server instances,
|
|
11
10
|
// this should be replaced with Redis or a database table.
|
|
@@ -51,9 +50,21 @@ class OtpService {
|
|
|
51
50
|
if (!configModule) {
|
|
52
51
|
throw new Error("configModule is required for generateToken");
|
|
53
52
|
}
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
const plugins = configModule
|
|
54
|
+
?.projectConfig?.plugins ?? [];
|
|
55
|
+
let secret;
|
|
56
|
+
for (const plugin of plugins) {
|
|
57
|
+
if (typeof plugin === "object" && plugin !== null && plugin?.resolve === "order-management") {
|
|
58
|
+
const options = plugin?.options;
|
|
59
|
+
if (options?.jwtSecret) {
|
|
60
|
+
secret = options.jwtSecret;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (!secret) {
|
|
66
|
+
throw new Error("order-management: jwtSecret is required");
|
|
67
|
+
}
|
|
57
68
|
return jsonwebtoken_1.default.sign({
|
|
58
69
|
guest_identifier: identifier,
|
|
59
70
|
customer_id: customerId,
|
|
@@ -62,4 +73,4 @@ class OtpService {
|
|
|
62
73
|
}
|
|
63
74
|
}
|
|
64
75
|
exports.OtpService = OtpService;
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvb3RwLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQThCO0FBRTlCLDZCQUE2QjtBQUM3QiwwRUFBMEU7QUFDMUUsMERBQTBEO0FBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUE4QyxDQUFBO0FBRXRFLE1BQWEsVUFBVTtJQUNuQjs7O09BR0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQWtCO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUVsRSxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUNyQixHQUFHO1lBQ0gsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxhQUFhO1NBQ3hELENBQUMsQ0FBQTtRQUVGLE9BQU8sR0FBRyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBa0IsRUFBRSxJQUFZO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFckMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsT0FBTyxLQUFLLENBQUE7UUFDaEIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5QixRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzNCLE9BQU8sS0FBSyxDQUFBO1FBQ2hCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEIsT0FBTyxLQUFLLENBQUE7UUFDaEIsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzNCLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLFVBQWtCLEVBQUUsVUFBbUIsRUFBRSxZQUFzQjtRQUN6RSxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUksWUFBNEQ7WUFDM0UsRUFBRSxhQUFhLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUVoQyxJQUFJLE1BQTBCLENBQUE7UUFDOUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFLLE1BQStCLEVBQUUsT0FBTyxLQUFLLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3RILE1BQU0sT0FBTyxHQUFJLE1BQStDLEVBQUUsT0FBTyxDQUFBO2dCQUN6RSxJQUFJLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUE7b0JBQzFCLE1BQUs7Z0JBQ1AsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO1FBQzVELENBQUM7UUFFRCxPQUFPLHNCQUFHLENBQUMsSUFBSSxDQUNYO1lBQ0ksZ0JBQWdCLEVBQUUsVUFBVTtZQUM1QixXQUFXLEVBQUUsVUFBVTtZQUN2QixLQUFLLEVBQUUsY0FBYztTQUN4QixFQUNELE1BQU0sRUFDTixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FDdEIsQ0FBQTtJQUNMLENBQUM7Q0FDSjtBQTlFRCxnQ0E4RUMifQ==
|