order-management 0.0.21 → 0.0.22
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 +49 -23
- package/.medusa/server/src/admin/index.mjs +49 -23
- package/.medusa/server/src/api/admin/swaps/[id]/approve/route.js +69 -31
- package/.medusa/server/src/api/admin/swaps/health/route.js +150 -0
- package/.medusa/server/src/api/admin/swaps/route.js +6 -12
- package/.medusa/server/src/api/admin/swaps/validators.js +9 -13
- package/.medusa/server/src/api/store/orders/[order_id]/swaps/route.js +47 -2
- package/.medusa/server/src/api/store/swaps/[id]/cancel/route.js +8 -1
- package/.medusa/server/src/api/store/swaps/[id]/route.js +15 -4
- package/.medusa/server/src/api/store/swaps/route.js +53 -10
- package/.medusa/server/src/helpers/swaps.js +1 -1
- package/.medusa/server/src/modules/swap/migrations/Migration20260123144734.js +29 -0
- package/.medusa/server/src/modules/swap/migrations/Migration20260123162423.js +48 -0
- package/.medusa/server/src/modules/swap/migrations/Migration20260126114640.js +48 -0
- package/.medusa/server/src/modules/swap/models/swap.js +7 -2
- package/.medusa/server/src/modules/swap/service.js +259 -32
- package/.medusa/server/src/subscribers/exchange-created.js +171 -0
- package/.medusa/server/src/workflows/steps/swap/create-medusa-exchange-step.js +153 -19
- package/.medusa/server/src/workflows/steps/swap/create-medusa-return-step.js +62 -6
- package/.medusa/server/src/workflows/steps/swap/create-swap-step.js +7 -12
- package/.medusa/server/src/workflows/steps/swap/index.js +6 -4
- package/.medusa/server/src/workflows/steps/swap/rollback-return-step.js +70 -0
- package/.medusa/server/src/workflows/steps/swap/sync-medusa-status-step.js +49 -3
- package/.medusa/server/src/workflows/steps/swap/update-swap-exchange-details-step.js +27 -0
- package/.medusa/server/src/workflows/steps/swap/validate-eligibility-step.js +9 -4
- package/.medusa/server/src/workflows/steps/swap/validate-order-step.js +24 -1
- package/.medusa/server/src/workflows/swaps/approve-swap-workflow.js +19 -3
- package/.medusa/server/src/workflows/swaps/create-swap-workflow.js +3 -1
- package/.medusa/server/src/workflows/swaps/execute-swap-workflow.js +26 -4
- package/package.json +1 -1
- package/.medusa/server/src/api/admin/swaps/[id]/process-payment/route.js +0 -152
- package/.medusa/server/src/api/admin/swaps/[id]/status/route.js +0 -45
- package/.medusa/server/src/api/admin/swaps/[id]/sync/route.js +0 -148
- package/.medusa/server/src/workflows/steps/swap/handle-payment-difference-step.js +0 -102
|
@@ -775,17 +775,7 @@ const SwapDetailPage = () => {
|
|
|
775
775
|
const [error, setError] = react.useState(null);
|
|
776
776
|
const [updateError, setUpdateError] = react.useState(null);
|
|
777
777
|
const [updateSuccess, setUpdateSuccess] = react.useState(false);
|
|
778
|
-
const availableStatuses = [
|
|
779
|
-
"requested",
|
|
780
|
-
"approved",
|
|
781
|
-
"rejected",
|
|
782
|
-
"return_started",
|
|
783
|
-
"return_shipped",
|
|
784
|
-
"return_received",
|
|
785
|
-
"new_items_shipped",
|
|
786
|
-
"completed",
|
|
787
|
-
"cancelled"
|
|
788
|
-
];
|
|
778
|
+
const availableStatuses = ["requested", "approved", "rejected"];
|
|
789
779
|
react.useEffect(() => {
|
|
790
780
|
if (!id) {
|
|
791
781
|
navigate("/swaps");
|
|
@@ -877,12 +867,12 @@ const SwapDetailPage = () => {
|
|
|
877
867
|
const payload = await response.json();
|
|
878
868
|
setSwap(payload.swap);
|
|
879
869
|
setUpdateSuccess(true);
|
|
880
|
-
setTimeout(() => setUpdateSuccess(false),
|
|
870
|
+
setTimeout(() => setUpdateSuccess(false), 5e3);
|
|
881
871
|
const detailResponse = await fetch(`/admin/swaps/${id}`, {
|
|
882
872
|
credentials: "include"
|
|
883
873
|
});
|
|
884
874
|
if (detailResponse.ok) {
|
|
885
|
-
const detailPayload = await
|
|
875
|
+
const detailPayload = await detailResponse.json();
|
|
886
876
|
setSwap(detailPayload.swap);
|
|
887
877
|
setOrder(detailPayload.order || null);
|
|
888
878
|
}
|
|
@@ -994,7 +984,7 @@ const SwapDetailPage = () => {
|
|
|
994
984
|
}
|
|
995
985
|
)
|
|
996
986
|
] }),
|
|
997
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
987
|
+
swap.status === "requested" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
998
988
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Update Status" }),
|
|
999
989
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-end", children: [
|
|
1000
990
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1", children: [
|
|
@@ -1026,6 +1016,38 @@ const SwapDetailPage = () => {
|
|
|
1026
1016
|
updateError && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "mt-2 text-ui-fg-error", children: updateError }),
|
|
1027
1017
|
updateSuccess && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "mt-2 text-ui-fg-success", children: "Status updated successfully" })
|
|
1028
1018
|
] }),
|
|
1019
|
+
swap.status === "approved" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
1020
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Exchange Information" }),
|
|
1021
|
+
swap.exchange_id ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
1022
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1023
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Exchange ID" }),
|
|
1024
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.exchange_id })
|
|
1025
|
+
] }),
|
|
1026
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1027
|
+
ui.Button,
|
|
1028
|
+
{
|
|
1029
|
+
variant: "secondary",
|
|
1030
|
+
onClick: () => {
|
|
1031
|
+
window.open(`/app/orders/${swap.order_id}/exchanges/${swap.exchange_id}`, "_blank");
|
|
1032
|
+
},
|
|
1033
|
+
children: "View Exchange"
|
|
1034
|
+
}
|
|
1035
|
+
) })
|
|
1036
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
1037
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Swap approved. Please create the exchange using Medusa's exchange creation form." }),
|
|
1038
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1039
|
+
ui.Button,
|
|
1040
|
+
{
|
|
1041
|
+
variant: "primary",
|
|
1042
|
+
onClick: () => {
|
|
1043
|
+
window.open(`/app/orders/${swap.order_id}/exchanges`, "_blank");
|
|
1044
|
+
},
|
|
1045
|
+
children: "Create Exchange"
|
|
1046
|
+
}
|
|
1047
|
+
) }),
|
|
1048
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "The exchange will be automatically linked to this swap once created." })
|
|
1049
|
+
] })
|
|
1050
|
+
] }),
|
|
1029
1051
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [
|
|
1030
1052
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
1031
1053
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", className: "mb-4 text-lg", children: "Swap Information" }),
|
|
@@ -1057,6 +1079,10 @@ const SwapDetailPage = () => {
|
|
|
1057
1079
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1058
1080
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Last Updated" }),
|
|
1059
1081
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: new Date(swap.updated_at).toLocaleString() })
|
|
1082
|
+
] }),
|
|
1083
|
+
swap.exchange_id && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1084
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Exchange ID" }),
|
|
1085
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "font-medium", children: swap.exchange_id })
|
|
1060
1086
|
] })
|
|
1061
1087
|
] })
|
|
1062
1088
|
] }),
|
|
@@ -1168,12 +1194,6 @@ const routeModule = {
|
|
|
1168
1194
|
};
|
|
1169
1195
|
const menuItemModule = {
|
|
1170
1196
|
menuItems: [
|
|
1171
|
-
{
|
|
1172
|
-
label: config$2.label,
|
|
1173
|
-
icon: config$2.icon,
|
|
1174
|
-
path: "/swaps",
|
|
1175
|
-
nested: void 0
|
|
1176
|
-
},
|
|
1177
1197
|
{
|
|
1178
1198
|
label: config$3.label,
|
|
1179
1199
|
icon: config$3.icon,
|
|
@@ -1181,9 +1201,9 @@ const menuItemModule = {
|
|
|
1181
1201
|
nested: void 0
|
|
1182
1202
|
},
|
|
1183
1203
|
{
|
|
1184
|
-
label: config.label,
|
|
1185
|
-
icon: config.icon,
|
|
1186
|
-
path: "/swaps
|
|
1204
|
+
label: config$2.label,
|
|
1205
|
+
icon: config$2.icon,
|
|
1206
|
+
path: "/swaps",
|
|
1187
1207
|
nested: void 0
|
|
1188
1208
|
},
|
|
1189
1209
|
{
|
|
@@ -1191,6 +1211,12 @@ const menuItemModule = {
|
|
|
1191
1211
|
icon: config$1.icon,
|
|
1192
1212
|
path: "/returns/:id",
|
|
1193
1213
|
nested: void 0
|
|
1214
|
+
},
|
|
1215
|
+
{
|
|
1216
|
+
label: config.label,
|
|
1217
|
+
icon: config.icon,
|
|
1218
|
+
path: "/swaps/:id",
|
|
1219
|
+
nested: void 0
|
|
1194
1220
|
}
|
|
1195
1221
|
]
|
|
1196
1222
|
};
|
|
@@ -774,17 +774,7 @@ const SwapDetailPage = () => {
|
|
|
774
774
|
const [error, setError] = useState(null);
|
|
775
775
|
const [updateError, setUpdateError] = useState(null);
|
|
776
776
|
const [updateSuccess, setUpdateSuccess] = useState(false);
|
|
777
|
-
const availableStatuses = [
|
|
778
|
-
"requested",
|
|
779
|
-
"approved",
|
|
780
|
-
"rejected",
|
|
781
|
-
"return_started",
|
|
782
|
-
"return_shipped",
|
|
783
|
-
"return_received",
|
|
784
|
-
"new_items_shipped",
|
|
785
|
-
"completed",
|
|
786
|
-
"cancelled"
|
|
787
|
-
];
|
|
777
|
+
const availableStatuses = ["requested", "approved", "rejected"];
|
|
788
778
|
useEffect(() => {
|
|
789
779
|
if (!id) {
|
|
790
780
|
navigate("/swaps");
|
|
@@ -876,12 +866,12 @@ const SwapDetailPage = () => {
|
|
|
876
866
|
const payload = await response.json();
|
|
877
867
|
setSwap(payload.swap);
|
|
878
868
|
setUpdateSuccess(true);
|
|
879
|
-
setTimeout(() => setUpdateSuccess(false),
|
|
869
|
+
setTimeout(() => setUpdateSuccess(false), 5e3);
|
|
880
870
|
const detailResponse = await fetch(`/admin/swaps/${id}`, {
|
|
881
871
|
credentials: "include"
|
|
882
872
|
});
|
|
883
873
|
if (detailResponse.ok) {
|
|
884
|
-
const detailPayload = await
|
|
874
|
+
const detailPayload = await detailResponse.json();
|
|
885
875
|
setSwap(detailPayload.swap);
|
|
886
876
|
setOrder(detailPayload.order || null);
|
|
887
877
|
}
|
|
@@ -993,7 +983,7 @@ const SwapDetailPage = () => {
|
|
|
993
983
|
}
|
|
994
984
|
)
|
|
995
985
|
] }),
|
|
996
|
-
/* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
986
|
+
swap.status === "requested" && /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
997
987
|
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "mb-4 text-lg", children: "Update Status" }),
|
|
998
988
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 md:flex-row md:items-end", children: [
|
|
999
989
|
/* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
|
|
@@ -1025,6 +1015,38 @@ const SwapDetailPage = () => {
|
|
|
1025
1015
|
updateError && /* @__PURE__ */ jsx(Text, { size: "small", className: "mt-2 text-ui-fg-error", children: updateError }),
|
|
1026
1016
|
updateSuccess && /* @__PURE__ */ jsx(Text, { size: "small", className: "mt-2 text-ui-fg-success", children: "Status updated successfully" })
|
|
1027
1017
|
] }),
|
|
1018
|
+
swap.status === "approved" && /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
1019
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "mb-4 text-lg", children: "Exchange Information" }),
|
|
1020
|
+
swap.exchange_id ? /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
1021
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
1022
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: "Exchange ID" }),
|
|
1023
|
+
/* @__PURE__ */ jsx(Text, { className: "font-medium", children: swap.exchange_id })
|
|
1024
|
+
] }),
|
|
1025
|
+
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
|
|
1026
|
+
Button,
|
|
1027
|
+
{
|
|
1028
|
+
variant: "secondary",
|
|
1029
|
+
onClick: () => {
|
|
1030
|
+
window.open(`/app/orders/${swap.order_id}/exchanges/${swap.exchange_id}`, "_blank");
|
|
1031
|
+
},
|
|
1032
|
+
children: "View Exchange"
|
|
1033
|
+
}
|
|
1034
|
+
) })
|
|
1035
|
+
] }) : /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
1036
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: "Swap approved. Please create the exchange using Medusa's exchange creation form." }),
|
|
1037
|
+
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
|
|
1038
|
+
Button,
|
|
1039
|
+
{
|
|
1040
|
+
variant: "primary",
|
|
1041
|
+
onClick: () => {
|
|
1042
|
+
window.open(`/app/orders/${swap.order_id}/exchanges`, "_blank");
|
|
1043
|
+
},
|
|
1044
|
+
children: "Create Exchange"
|
|
1045
|
+
}
|
|
1046
|
+
) }),
|
|
1047
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: "The exchange will be automatically linked to this swap once created." })
|
|
1048
|
+
] })
|
|
1049
|
+
] }),
|
|
1028
1050
|
/* @__PURE__ */ jsxs("div", { className: "grid gap-6 md:grid-cols-2", children: [
|
|
1029
1051
|
/* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-ui-border-base bg-ui-bg-base p-6", children: [
|
|
1030
1052
|
/* @__PURE__ */ jsx(Heading, { level: "h2", className: "mb-4 text-lg", children: "Swap Information" }),
|
|
@@ -1056,6 +1078,10 @@ const SwapDetailPage = () => {
|
|
|
1056
1078
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1057
1079
|
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: "Last Updated" }),
|
|
1058
1080
|
/* @__PURE__ */ jsx(Text, { className: "font-medium", children: new Date(swap.updated_at).toLocaleString() })
|
|
1081
|
+
] }),
|
|
1082
|
+
swap.exchange_id && /* @__PURE__ */ jsxs("div", { children: [
|
|
1083
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: "Exchange ID" }),
|
|
1084
|
+
/* @__PURE__ */ jsx(Text, { className: "font-medium", children: swap.exchange_id })
|
|
1059
1085
|
] })
|
|
1060
1086
|
] })
|
|
1061
1087
|
] }),
|
|
@@ -1167,12 +1193,6 @@ const routeModule = {
|
|
|
1167
1193
|
};
|
|
1168
1194
|
const menuItemModule = {
|
|
1169
1195
|
menuItems: [
|
|
1170
|
-
{
|
|
1171
|
-
label: config$2.label,
|
|
1172
|
-
icon: config$2.icon,
|
|
1173
|
-
path: "/swaps",
|
|
1174
|
-
nested: void 0
|
|
1175
|
-
},
|
|
1176
1196
|
{
|
|
1177
1197
|
label: config$3.label,
|
|
1178
1198
|
icon: config$3.icon,
|
|
@@ -1180,9 +1200,9 @@ const menuItemModule = {
|
|
|
1180
1200
|
nested: void 0
|
|
1181
1201
|
},
|
|
1182
1202
|
{
|
|
1183
|
-
label: config.label,
|
|
1184
|
-
icon: config.icon,
|
|
1185
|
-
path: "/swaps
|
|
1203
|
+
label: config$2.label,
|
|
1204
|
+
icon: config$2.icon,
|
|
1205
|
+
path: "/swaps",
|
|
1186
1206
|
nested: void 0
|
|
1187
1207
|
},
|
|
1188
1208
|
{
|
|
@@ -1190,6 +1210,12 @@ const menuItemModule = {
|
|
|
1190
1210
|
icon: config$1.icon,
|
|
1191
1211
|
path: "/returns/:id",
|
|
1192
1212
|
nested: void 0
|
|
1213
|
+
},
|
|
1214
|
+
{
|
|
1215
|
+
label: config.label,
|
|
1216
|
+
icon: config.icon,
|
|
1217
|
+
path: "/swaps/:id",
|
|
1218
|
+
nested: void 0
|
|
1193
1219
|
}
|
|
1194
1220
|
]
|
|
1195
1221
|
};
|
|
@@ -3,7 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.POST = void 0;
|
|
4
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
5
5
|
const approve_swap_workflow_1 = require("../../../../../workflows/swaps/approve-swap-workflow");
|
|
6
|
-
const
|
|
6
|
+
const validators_1 = require("../../validators");
|
|
7
|
+
const zod_1 = require("zod");
|
|
7
8
|
const POST = async (req, res) => {
|
|
8
9
|
const { id } = req.params;
|
|
9
10
|
if (!id) {
|
|
@@ -14,43 +15,81 @@ const POST = async (req, res) => {
|
|
|
14
15
|
const authContext = req.auth_context;
|
|
15
16
|
const adminId = authContext?.actor_id || authContext?.user_id || "admin";
|
|
16
17
|
try {
|
|
17
|
-
//
|
|
18
|
+
// Parse and validate request body for exchange details
|
|
19
|
+
const exchangeDetails = validators_1.ApproveSwapSchema.parse(req.body || {});
|
|
20
|
+
// Approve the swap
|
|
21
|
+
// This updates the swap status from "requested" to "approved" and stores exchange details
|
|
22
|
+
// Admin should then create the exchange manually using Medusa's exchange creation form
|
|
18
23
|
const { result: approvalResult } = await (0, approve_swap_workflow_1.approveSwapWorkflow)(req.scope).run({
|
|
19
24
|
input: {
|
|
20
25
|
swap_id: id,
|
|
21
26
|
admin_id: adminId,
|
|
27
|
+
return_location_id: exchangeDetails.return_location_id,
|
|
28
|
+
return_shipping_method_id: exchangeDetails.return_shipping_method_id,
|
|
29
|
+
outbound_shipping_method_id: exchangeDetails.outbound_shipping_method_id,
|
|
30
|
+
send_notification: exchangeDetails.send_notification,
|
|
22
31
|
},
|
|
23
32
|
});
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
// Return success response
|
|
34
|
+
// Exchange will be created manually by admin and linked automatically via subscriber
|
|
35
|
+
res.json({
|
|
36
|
+
swap: approvalResult.swap,
|
|
37
|
+
message: "Swap approved successfully. Please create the exchange using Medusa's exchange creation form.",
|
|
38
|
+
note: "The exchange will be automatically linked to this swap once created.",
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
// Handle Zod validation errors
|
|
43
|
+
if (error instanceof zod_1.z.ZodError) {
|
|
44
|
+
res.status(400).json({
|
|
45
|
+
message: "Invalid request data",
|
|
46
|
+
errors: error.errors,
|
|
34
47
|
});
|
|
48
|
+
return;
|
|
35
49
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
type: executionError.type,
|
|
45
|
-
},
|
|
46
|
-
warning: "Swap was approved but Medusa exchange creation failed. Please retry execution.",
|
|
47
|
-
});
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
throw executionError;
|
|
50
|
+
// Extract error message - handle various error formats
|
|
51
|
+
let errorMessage = "Unknown error";
|
|
52
|
+
let errorStack;
|
|
53
|
+
let errorType;
|
|
54
|
+
if (error instanceof Error) {
|
|
55
|
+
errorMessage = error.message;
|
|
56
|
+
errorStack = error.stack;
|
|
57
|
+
errorType = error.type;
|
|
51
58
|
}
|
|
52
|
-
|
|
53
|
-
|
|
59
|
+
else if (error && typeof error === "object") {
|
|
60
|
+
const errorObj = error;
|
|
61
|
+
errorMessage = String(errorObj.message ||
|
|
62
|
+
errorObj.error ||
|
|
63
|
+
errorObj.reason ||
|
|
64
|
+
JSON.stringify(errorObj));
|
|
65
|
+
errorStack = errorObj.stack;
|
|
66
|
+
errorType = errorObj.type;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
errorMessage = String(error);
|
|
70
|
+
}
|
|
71
|
+
// Log full error details
|
|
72
|
+
let errorStringified = "Unable to stringify";
|
|
73
|
+
try {
|
|
74
|
+
errorStringified = JSON.stringify(error, (key, value) => {
|
|
75
|
+
if (key === "parent" || key === "children" || key === "container") {
|
|
76
|
+
return "[Circular]";
|
|
77
|
+
}
|
|
78
|
+
return value;
|
|
79
|
+
}, 2);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
errorStringified = `Stringify failed`;
|
|
83
|
+
}
|
|
84
|
+
console.error("[Approve Swap] Error:", {
|
|
85
|
+
swap_id: id,
|
|
86
|
+
error_message: errorMessage,
|
|
87
|
+
error_type: errorType,
|
|
88
|
+
error_stack: errorStack,
|
|
89
|
+
error_stringified: errorStringified,
|
|
90
|
+
error_constructor: error?.constructor?.name,
|
|
91
|
+
error_keys: error && typeof error === "object" ? Object.keys(error) : [],
|
|
92
|
+
});
|
|
54
93
|
if (error instanceof utils_1.MedusaError) {
|
|
55
94
|
const statusCode = error.type === utils_1.MedusaError.Types.NOT_FOUND
|
|
56
95
|
? 404
|
|
@@ -63,7 +102,6 @@ const POST = async (req, res) => {
|
|
|
63
102
|
});
|
|
64
103
|
return;
|
|
65
104
|
}
|
|
66
|
-
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
67
105
|
res.status(500).json({
|
|
68
106
|
message: "Failed to approve swap",
|
|
69
107
|
error: errorMessage,
|
|
@@ -71,4 +109,4 @@ const POST = async (req, res) => {
|
|
|
71
109
|
}
|
|
72
110
|
};
|
|
73
111
|
exports.POST = POST;
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N3YXBzL1tpZF0vYXBwcm92ZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBdUQ7QUFDdkQsZ0dBQTBGO0FBQzFGLGlEQUFvRDtBQUNwRCw2QkFBdUI7QUFFaEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUN2QixHQUFrQixFQUNsQixHQUFtQixFQUNKLEVBQUU7SUFDakIsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7SUFFekIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELE9BQU07SUFDUixDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLE1BQU0sV0FBVyxHQUFJLEdBRW5CLENBQUMsWUFBWSxDQUFBO0lBRWYsTUFBTSxPQUFPLEdBQUcsV0FBVyxFQUFFLFFBQVEsSUFBSSxXQUFXLEVBQUUsT0FBTyxJQUFJLE9BQU8sQ0FBQTtJQUV4RSxJQUFJLENBQUM7UUFDSCx1REFBdUQ7UUFDdkQsTUFBTSxlQUFlLEdBQUcsOEJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUE7UUFFL0QsbUJBQW1CO1FBQ25CLDBGQUEwRjtRQUMxRix1RkFBdUY7UUFDdkYsTUFBTSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLElBQUEsMkNBQW1CLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMxRSxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLGtCQUFrQixFQUFFLGVB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
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const swap_1 = require("../../../../modules/swap");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
/**
|
|
7
|
+
* Health check endpoint for swap/exchange system
|
|
8
|
+
* Returns status of subscribers, database, and Medusa integration
|
|
9
|
+
*/
|
|
10
|
+
const GET = async (req, res) => {
|
|
11
|
+
const health = {
|
|
12
|
+
status: "healthy",
|
|
13
|
+
timestamp: new Date().toISOString(),
|
|
14
|
+
checks: {},
|
|
15
|
+
};
|
|
16
|
+
try {
|
|
17
|
+
// Check 1: Database connectivity
|
|
18
|
+
try {
|
|
19
|
+
const swapService = req.scope.resolve(swap_1.SWAP_MODULE);
|
|
20
|
+
await swapService.listSwaps({}, { take: 1 });
|
|
21
|
+
health.checks.database = {
|
|
22
|
+
status: "ok",
|
|
23
|
+
message: "Database connection successful",
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
health.status = "unhealthy";
|
|
28
|
+
health.checks.database = {
|
|
29
|
+
status: "error",
|
|
30
|
+
message: "Database connection failed",
|
|
31
|
+
details: error instanceof Error ? error.message : String(error),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Check 2: Medusa RemoteQuery connectivity
|
|
35
|
+
try {
|
|
36
|
+
const remoteQuery = req.scope.resolve(utils_1.ContainerRegistrationKeys.REMOTE_QUERY);
|
|
37
|
+
// Test query - try to query a simple entity
|
|
38
|
+
const queryObject = (0, utils_1.remoteQueryObjectFromString)({
|
|
39
|
+
entryPoint: "product",
|
|
40
|
+
fields: ["id"],
|
|
41
|
+
});
|
|
42
|
+
await remoteQuery(queryObject);
|
|
43
|
+
health.checks.medusa_integration = {
|
|
44
|
+
status: "ok",
|
|
45
|
+
message: "Medusa RemoteQuery connection successful",
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
health.status = health.status === "unhealthy" ? "unhealthy" : "degraded";
|
|
50
|
+
health.checks.medusa_integration = {
|
|
51
|
+
status: "warning",
|
|
52
|
+
message: "Medusa RemoteQuery connection failed",
|
|
53
|
+
details: error instanceof Error ? error.message : String(error),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// Check 3: Check for swaps with sync failures
|
|
57
|
+
try {
|
|
58
|
+
const swapService = req.scope.resolve(swap_1.SWAP_MODULE);
|
|
59
|
+
const swaps = await swapService.listSwaps({}, { take: 100 });
|
|
60
|
+
const swapsArray = Array.isArray(swaps) ? swaps : swaps ? [swaps] : [];
|
|
61
|
+
const swapsWithSyncFailures = swapsArray.filter((swap) => {
|
|
62
|
+
const swapData = swap;
|
|
63
|
+
const metadata = swapData.metadata || {};
|
|
64
|
+
const syncFailures = metadata.sync_failures;
|
|
65
|
+
return syncFailures && syncFailures.length > 0;
|
|
66
|
+
});
|
|
67
|
+
const swapsWithExecutionFailures = swapsArray.filter((swap) => {
|
|
68
|
+
const swapData = swap;
|
|
69
|
+
const metadata = swapData.metadata || {};
|
|
70
|
+
const executionFailures = metadata.execution_failures;
|
|
71
|
+
return executionFailures && executionFailures.length > 0;
|
|
72
|
+
});
|
|
73
|
+
if (swapsWithSyncFailures.length > 0 || swapsWithExecutionFailures.length > 0) {
|
|
74
|
+
health.status = health.status === "unhealthy" ? "unhealthy" : "degraded";
|
|
75
|
+
health.checks.swap_failures = {
|
|
76
|
+
status: "warning",
|
|
77
|
+
message: `Found ${swapsWithSyncFailures.length} swaps with sync failures and ${swapsWithExecutionFailures.length} with execution failures`,
|
|
78
|
+
details: {
|
|
79
|
+
sync_failures_count: swapsWithSyncFailures.length,
|
|
80
|
+
execution_failures_count: swapsWithExecutionFailures.length,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
health.checks.swap_failures = {
|
|
86
|
+
status: "ok",
|
|
87
|
+
message: "No swaps with failures found",
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
health.status = health.status === "unhealthy" ? "unhealthy" : "degraded";
|
|
93
|
+
health.checks.swap_failures = {
|
|
94
|
+
status: "warning",
|
|
95
|
+
message: "Failed to check swap failures",
|
|
96
|
+
details: error instanceof Error ? error.message : String(error),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Check 4: Check for orphaned swaps (have return_id but no exchange_id)
|
|
100
|
+
try {
|
|
101
|
+
const swapService = req.scope.resolve(swap_1.SWAP_MODULE);
|
|
102
|
+
const swaps = await swapService.listSwaps({}, { take: 100 });
|
|
103
|
+
const swapsArray = Array.isArray(swaps) ? swaps : swaps ? [swaps] : [];
|
|
104
|
+
const orphanedSwaps = swapsArray.filter((swap) => {
|
|
105
|
+
const swapData = swap;
|
|
106
|
+
return (swapData.return_id &&
|
|
107
|
+
!swapData.exchange_id &&
|
|
108
|
+
swapData.status === "approved");
|
|
109
|
+
});
|
|
110
|
+
if (orphanedSwaps.length > 0) {
|
|
111
|
+
health.status = health.status === "unhealthy" ? "unhealthy" : "degraded";
|
|
112
|
+
health.checks.orphaned_swaps = {
|
|
113
|
+
status: "warning",
|
|
114
|
+
message: `Found ${orphanedSwaps.length} orphaned swaps (have return_id but no exchange_id)`,
|
|
115
|
+
details: {
|
|
116
|
+
count: orphanedSwaps.length,
|
|
117
|
+
swap_ids: orphanedSwaps.map((s) => s.id).filter(Boolean),
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
health.checks.orphaned_swaps = {
|
|
123
|
+
status: "ok",
|
|
124
|
+
message: "No orphaned swaps found",
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
health.status = health.status === "unhealthy" ? "unhealthy" : "degraded";
|
|
130
|
+
health.checks.orphaned_swaps = {
|
|
131
|
+
status: "warning",
|
|
132
|
+
message: "Failed to check orphaned swaps",
|
|
133
|
+
details: error instanceof Error ? error.message : String(error),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const statusCode = health.status === "unhealthy" ? 503 : health.status === "degraded" ? 200 : 200;
|
|
137
|
+
res.status(statusCode).json(health);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
141
|
+
res.status(503).json({
|
|
142
|
+
status: "unhealthy",
|
|
143
|
+
timestamp: new Date().toISOString(),
|
|
144
|
+
error: errorMessage,
|
|
145
|
+
checks: health.checks,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
exports.GET = GET;
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N3YXBzL2hlYWx0aC9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxtREFBc0Q7QUFFdEQscURBQWtHO0FBR2xHOzs7R0FHRztBQUNJLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDSixFQUFFO0lBQ2pCLE1BQU0sTUFBTSxHQVFSO1FBQ0YsTUFBTSxFQUFFLFNBQVM7UUFDakIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1FBQ25DLE1BQU0sRUFBRSxFQUFFO0tBQ1gsQ0FBQTtJQUVELElBQUksQ0FBQztRQUNILGlDQUFpQztRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBYyxrQkFBVyxDQUFDLENBQUE7WUFDL0QsTUFBTSxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHO2dCQUN2QixNQUFNLEVBQUUsSUFBSTtnQkFDWixPQUFPLEVBQUUsZ0NBQWdDO2FBQzFDLENBQUE7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFBO1lBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHO2dCQUN2QixNQUFNLEVBQUUsT0FBTztnQkFDZixPQUFPLEVBQUUsNEJBQTRCO2dCQUNyQyxPQUFPLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNoRSxDQUFBO1FBQ0gs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
|
|
@@ -18,23 +18,17 @@ const GET = async (req, res) => {
|
|
|
18
18
|
if (orderId) {
|
|
19
19
|
filters.order_id = orderId;
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
if (customerId) {
|
|
22
|
+
filters.customer_id = customerId;
|
|
23
|
+
}
|
|
23
24
|
const swaps = await swapService.listSwaps(filters, {
|
|
24
25
|
take: limit,
|
|
25
26
|
skip: offset,
|
|
26
27
|
});
|
|
27
28
|
const swapArray = Array.isArray(swaps) ? swaps : swaps ? [swaps] : [];
|
|
28
|
-
// Filter by customer_id if provided (would need order lookup in production)
|
|
29
|
-
let filteredSwaps = swapArray;
|
|
30
|
-
if (customerId) {
|
|
31
|
-
// In production, you'd want to join with orders table
|
|
32
|
-
// For now, we'll return all swaps
|
|
33
|
-
filteredSwaps = swapArray;
|
|
34
|
-
}
|
|
35
29
|
res.json({
|
|
36
|
-
swaps:
|
|
37
|
-
count:
|
|
30
|
+
swaps: swapArray,
|
|
31
|
+
count: swapArray.length,
|
|
38
32
|
limit,
|
|
39
33
|
offset,
|
|
40
34
|
});
|
|
@@ -48,4 +42,4 @@ const GET = async (req, res) => {
|
|
|
48
42
|
}
|
|
49
43
|
};
|
|
50
44
|
exports.GET = GET;
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3N3YXBzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLGdEQUFtRDtBQUc1QyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ0osRUFBRTtJQUNqQixJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBYyxrQkFBVyxDQUFDLENBQUE7UUFFL0QsdUJBQXVCO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBNEIsQ0FBQTtRQUNyRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQThCLENBQUE7UUFDeEQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFpQyxDQUFBO1FBQzlELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUM1RSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRTlFLE1BQU0sT0FBTyxHQUE0QixFQUFFLENBQUE7UUFDM0MsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3pCLENBQUM7UUFDRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUE7UUFDNUIsQ0FBQztRQUNELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQTtRQUNsQyxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtZQUNqRCxJQUFJLEVBQUUsS0FBSztZQUNYLElBQUksRUFBRSxNQUFNO1NBQ2IsQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVyRSxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ1AsS0FBSyxFQUFFLFNBQVM7WUFDaEIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNO1lBQ3ZCLEtBQUs7WUFDTCxNQUFNO1NBQ1AsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUE7UUFDN0UsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLDBCQUEwQjtZQUNuQyxLQUFLLEVBQUUsWUFBWTtTQUNwQixDQUFDLENBQUE7SUFDSixDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBN0NZLFFBQUEsR0FBRyxPQTZDZiJ9
|
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RejectSwapSchema = exports.UpdateSwapStatusSchema = void 0;
|
|
3
|
+
exports.ApproveSwapSchema = exports.RejectSwapSchema = exports.UpdateSwapStatusSchema = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
exports.UpdateSwapStatusSchema = zod_1.z.object({
|
|
6
|
-
status: zod_1.z.enum([
|
|
7
|
-
"requested",
|
|
8
|
-
"approved",
|
|
9
|
-
"rejected",
|
|
10
|
-
"return_started",
|
|
11
|
-
"return_shipped",
|
|
12
|
-
"return_received",
|
|
13
|
-
"new_items_shipped",
|
|
14
|
-
"completed",
|
|
15
|
-
"cancelled",
|
|
16
|
-
]),
|
|
6
|
+
status: zod_1.z.enum(["requested", "approved", "rejected"]),
|
|
17
7
|
metadata: zod_1.z.record(zod_1.z.unknown()).optional(),
|
|
18
8
|
});
|
|
19
9
|
exports.RejectSwapSchema = zod_1.z.object({
|
|
20
10
|
reason: zod_1.z.string().optional(),
|
|
21
11
|
});
|
|
22
|
-
|
|
12
|
+
exports.ApproveSwapSchema = zod_1.z.object({
|
|
13
|
+
return_location_id: zod_1.z.string().optional(),
|
|
14
|
+
return_shipping_method_id: zod_1.z.string().optional(),
|
|
15
|
+
outbound_shipping_method_id: zod_1.z.string().optional(),
|
|
16
|
+
send_notification: zod_1.z.boolean().optional().default(false),
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvYWRtaW4vc3dhcHMvdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBdUI7QUFFVixRQUFBLHNCQUFzQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDN0MsTUFBTSxFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JELFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDLE9BQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtDQUMzQyxDQUFDLENBQUE7QUFFVyxRQUFBLGdCQUFnQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDdkMsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDOUIsQ0FBQyxDQUFBO0FBRVcsUUFBQSxpQkFBaUIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3hDLGtCQUFrQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDekMseUJBQXlCLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNoRCwyQkFBMkIsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2xELGlCQUFpQixFQUFFLE9BQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0NBQ3pELENBQUMsQ0FBQSJ9
|