@zaamx/netme-pos 0.0.16 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +6 -6
- package/.medusa/server/src/admin/index.mjs +6 -6
- package/.medusa/server/src/api/middlewares.js +168 -1
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/convert-to-order/route.js +37 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/edit/confirm/route.js +20 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/edit/items/[action_id]/route.js +74 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/edit/items/item/[item_id]/route.js +41 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/edit/items/route.js +31 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/edit/promotions/route.js +31 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/edit/request/route.js +16 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/edit/route.js +32 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/edit/shipping-methods/[action_id]/route.js +32 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/edit/shipping-methods/method/[method_id]/route.js +30 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/edit/shipping-methods/route.js +19 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/[id]/route.js +63 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/guards.js +77 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/helpers.js +19 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/pricing.js +136 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/query-config.js +60 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/route.js +140 -0
- package/.medusa/server/src/api/store/netme-pos/draft-orders/validators.js +217 -0
- package/.medusa/server/src/api/store/netme-pos/fulfillment-validators.js +74 -0
- package/.medusa/server/src/api/store/netme-pos/payment-collections/[id]/mark-as-paid/route.js +34 -0
- package/.medusa/server/src/api/store/netme-pos/payment-collections/[id]/payment-sessions/route.js +28 -0
- package/.medusa/server/src/api/store/netme-pos/payment-collections/guards.js +27 -0
- package/.medusa/server/src/api/store/netme-pos/products/[id]/route.js +10 -0
- package/.medusa/server/src/api/store/netme-pos/products/route.js +14 -0
- package/.medusa/server/src/api/store/netme-pos/scope.js +106 -0
- package/.medusa/server/src/api/store/netme-pos/shipping-options/route.js +100 -0
- package/.medusa/server/src/api/store/netme-pos/stock-locations/route.js +45 -0
- package/.medusa/server/src/links/agent-draft-order.js +31 -0
- package/.medusa/server/src/workflows/ensure-agent-can-act-for/index.js +36 -0
- package/package.json +1 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
exports.POST = POST;
|
|
5
|
+
exports.DELETE = DELETE;
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
8
|
+
/**
|
|
9
|
+
* `/store/netme-pos/draft-orders/:id` (spec §7.3–§7.5). Ownership is enforced
|
|
10
|
+
* upstream by the `ensureDraftOrderAgent` middleware.
|
|
11
|
+
*/
|
|
12
|
+
async function GET(req, res) {
|
|
13
|
+
const workflow = (0, core_flows_1.getOrderDetailWorkflow)(req.scope);
|
|
14
|
+
const { result } = await workflow.run({
|
|
15
|
+
input: {
|
|
16
|
+
fields: req.queryConfig.fields,
|
|
17
|
+
order_id: req.params.id,
|
|
18
|
+
version: req.validatedQuery?.version,
|
|
19
|
+
filters: {
|
|
20
|
+
is_draft_order: true,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
res.status(200).json({ draft_order: result });
|
|
25
|
+
}
|
|
26
|
+
async function POST(req, res) {
|
|
27
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
28
|
+
await (0, core_flows_1.updateDraftOrderWorkflow)(req.scope).run({
|
|
29
|
+
input: {
|
|
30
|
+
...req.validatedBody,
|
|
31
|
+
user_id: req.auth_context.actor_id,
|
|
32
|
+
id: req.params.id,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
const result = await query.graph({
|
|
36
|
+
entity: "order",
|
|
37
|
+
filters: { id: req.params.id },
|
|
38
|
+
fields: req.queryConfig.fields,
|
|
39
|
+
});
|
|
40
|
+
res.status(200).json({ draft_order: result.data[0] });
|
|
41
|
+
}
|
|
42
|
+
async function DELETE(req, res) {
|
|
43
|
+
const { id } = req.params;
|
|
44
|
+
await (0, core_flows_1.deleteDraftOrdersWorkflow)(req.scope).run({
|
|
45
|
+
input: {
|
|
46
|
+
order_ids: [id],
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
// Hygiene: drop the attribution row for this agent ↔ draft pair.
|
|
50
|
+
const link = req.scope.resolve(utils_1.ContainerRegistrationKeys.LINK);
|
|
51
|
+
await link
|
|
52
|
+
.dismiss({
|
|
53
|
+
[utils_1.Modules.CUSTOMER]: { customer_id: req.auth_context.actor_id },
|
|
54
|
+
[utils_1.Modules.ORDER]: { order_id: id },
|
|
55
|
+
})
|
|
56
|
+
.catch(() => void 0);
|
|
57
|
+
res.status(200).json({
|
|
58
|
+
id,
|
|
59
|
+
object: "draft-order",
|
|
60
|
+
deleted: true,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL25ldG1lLXBvcy9kcmFmdC1vcmRlcnMvW2lkXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW9CQSxrQkFpQkM7QUFFRCxvQkFxQkM7QUFFRCx3QkEwQkM7QUFwRkQscURBR2tDO0FBQ2xDLDREQUlvQztBQUdwQzs7O0dBR0c7QUFFSSxLQUFLLFVBQVUsR0FBRyxDQUN2QixHQUErQixFQUMvQixHQUFtQjtJQUVuQixNQUFNLFFBQVEsR0FBRyxJQUFBLG1DQUFzQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQ3BDLEtBQUssRUFBRTtZQUNMLE1BQU0sRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU07WUFDOUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QixPQUFPLEVBQUcsR0FBRyxDQUFDLGNBQXNCLEVBQUUsT0FBTztZQUM3QyxPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGLENBQUMsQ0FBQTtJQUVGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7QUFDL0MsQ0FBQztBQUVNLEtBQUssVUFBVSxJQUFJLENBQ3hCLEdBQTBELEVBQzFELEdBQW1CO0lBRW5CLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWhFLE1BQU0sSUFBQSxxQ0FBd0IsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzVDLEtBQUssRUFBRTtZQUNMLEdBQUcsR0FBRyxDQUFDLGFBQWE7WUFDcEIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUTtZQUNsQyxFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1NBQ1g7S0FDVCxDQUFDLENBQUE7SUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDL0IsTUFBTSxFQUFFLE9BQU87UUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTTtLQUMvQixDQUFDLENBQUE7SUFFRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUN2RCxDQUFDO0FBRU0sS0FBSyxVQUFVLE1BQU0sQ0FDMUIsR0FBK0IsRUFDL0IsR0FBbUI7SUFFbkIsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7SUFFekIsTUFBTSxJQUFBLHNDQUF5QixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDN0MsS0FBSyxFQUFFO1lBQ0wsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQ2hCO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsaUVBQWlFO0lBQ2pFLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzlELE1BQU0sSUFBSTtTQUNQLE9BQU8sQ0FBQztRQUNQLENBQUMsZUFBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO1FBQzlELENBQUMsZUFBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtLQUNsQyxDQUFDO1NBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFFdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkIsRUFBRTtRQUNGLE1BQU0sRUFBRSxhQUFhO1FBQ3JCLE9BQU8sRUFBRSxJQUFJO0tBQ2QsQ0FBQyxDQUFBO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,77 @@
|
|
|
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.findAgentDraftOrder = findAgentDraftOrder;
|
|
7
|
+
exports.assertAgentDraftOrder = assertAgentDraftOrder;
|
|
8
|
+
exports.ensureDraftOrderAgent = ensureDraftOrderAgent;
|
|
9
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
10
|
+
const agent_draft_order_1 = __importDefault(require("../../../../links/agent-draft-order"));
|
|
11
|
+
/**
|
|
12
|
+
* Ownership guard (spec §3.3): every `/store/netme-pos/draft-orders/:id*`
|
|
13
|
+
* request must come from the AGENT that created the draft (link table
|
|
14
|
+
* `mlm_agent_draft_order`), and the order must still be a draft.
|
|
15
|
+
*
|
|
16
|
+
* Failure is always a 404 (never 403) so existence isn't leaked.
|
|
17
|
+
*/
|
|
18
|
+
const DRAFT_ORDER_ID_REGEX = /\/store\/netme-pos\/draft-orders\/([^/?#]+)/;
|
|
19
|
+
const VERIFIED_KEY = "__netmePosVerifiedDraftOrderId";
|
|
20
|
+
const notFound = (orderId) => new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Draft order with id ${orderId} was not found`);
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the draft order `orderId` ONLY if it belongs to agent `actorId`
|
|
23
|
+
* (link row exists) and is still a draft. Returns `null` otherwise.
|
|
24
|
+
*/
|
|
25
|
+
async function findAgentDraftOrder(scope, actorId, orderId) {
|
|
26
|
+
const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
27
|
+
const [{ data: links }, { data: orders }] = await Promise.all([
|
|
28
|
+
query.graph({
|
|
29
|
+
entity: agent_draft_order_1.default.entryPoint,
|
|
30
|
+
filters: { customer_id: actorId, order_id: orderId },
|
|
31
|
+
fields: ["order_id"],
|
|
32
|
+
}),
|
|
33
|
+
query.graph({
|
|
34
|
+
entity: "order",
|
|
35
|
+
filters: { id: orderId },
|
|
36
|
+
fields: ["id", "customer_id", "region_id", "is_draft_order"],
|
|
37
|
+
}),
|
|
38
|
+
]);
|
|
39
|
+
const order = orders?.[0];
|
|
40
|
+
if (!links?.length || !order?.is_draft_order) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return order;
|
|
44
|
+
}
|
|
45
|
+
/** Same as `findAgentDraftOrder` but throws the standard 404. */
|
|
46
|
+
async function assertAgentDraftOrder(scope, actorId, orderId) {
|
|
47
|
+
const order = await findAgentDraftOrder(scope, actorId, orderId);
|
|
48
|
+
if (!order) {
|
|
49
|
+
throw notFound(orderId);
|
|
50
|
+
}
|
|
51
|
+
return order;
|
|
52
|
+
}
|
|
53
|
+
async function ensureDraftOrderAgent(req, _res, next) {
|
|
54
|
+
try {
|
|
55
|
+
const orderId = req.originalUrl.match(DRAFT_ORDER_ID_REGEX)?.[1];
|
|
56
|
+
if (!orderId) {
|
|
57
|
+
// List / create — no :id to guard here.
|
|
58
|
+
return next();
|
|
59
|
+
}
|
|
60
|
+
const actorId = req.auth_context?.actor_id;
|
|
61
|
+
if (!actorId) {
|
|
62
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Customer authentication required");
|
|
63
|
+
}
|
|
64
|
+
const decodedId = decodeURIComponent(orderId);
|
|
65
|
+
// The guard may be mounted more than once on nested matchers — dedupe.
|
|
66
|
+
if (req[VERIFIED_KEY] === decodedId) {
|
|
67
|
+
return next();
|
|
68
|
+
}
|
|
69
|
+
await assertAgentDraftOrder(req.scope, actorId, decodedId);
|
|
70
|
+
req[VERIFIED_KEY] = decodedId;
|
|
71
|
+
return next();
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
return next(e);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhcmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9zdG9yZS9uZXRtZS1wb3MvZHJhZnQtb3JkZXJzL2d1YXJkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXlDQSxrREEwQkM7QUFHRCxzREFVQztBQUVELHNEQWtDQztBQTlHRCxxREFHa0M7QUFDbEMsNEZBQXFFO0FBRXJFOzs7Ozs7R0FNRztBQUVILE1BQU0sb0JBQW9CLEdBQUcsNkNBQTZDLENBQUE7QUFFMUUsTUFBTSxZQUFZLEdBQUcsZ0NBQWdDLENBQUE7QUFTckQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUNuQyxJQUFJLG1CQUFXLENBQ2IsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQix1QkFBdUIsT0FBTyxnQkFBZ0IsQ0FDL0MsQ0FBQTtBQUVIOzs7R0FHRztBQUNJLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsS0FBc0IsRUFDdEIsT0FBZSxFQUNmLE9BQWU7SUFFZixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTVELE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUM1RCxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ1YsTUFBTSxFQUFFLDJCQUFtQixDQUFDLFVBQVU7WUFDdEMsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO1lBQ3BELE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQztTQUNyQixDQUFDO1FBQ0YsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNWLE1BQU0sRUFBRSxPQUFPO1lBQ2YsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRTtZQUN4QixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQztTQUM3RCxDQUFDO0tBQ0gsQ0FBQyxDQUFBO0lBRUYsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFnQyxDQUFBO0lBQ3hELElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVELGlFQUFpRTtBQUMxRCxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLEtBQXNCLEVBQ3RCLE9BQWUsRUFDZixPQUFlO0lBRWYsTUFBTSxLQUFLLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2hFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFTSxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLEdBQStCLEVBQy9CLElBQW9CLEVBQ3BCLElBQXdCO0lBRXhCLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNoRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYix3Q0FBd0M7WUFDeEMsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUNmLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQTtRQUMxQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixrQ0FBa0MsQ0FDbkMsQ0FBQTtRQUNILENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUU3Qyx1RUFBdUU7UUFDdkUsSUFBSyxHQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0MsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUNmLENBQUM7UUFFRCxNQUFNLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUN6RDtRQUFDLEdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxTQUFTLENBQUE7UUFFdkMsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNmLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDaEIsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.refetchOrder = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
/**
|
|
6
|
+
* Port of the admin draft-orders `refetchOrder` helper: reload the (draft)
|
|
7
|
+
* order with the request's resolved `fields` after a mutation.
|
|
8
|
+
*/
|
|
9
|
+
const refetchOrder = async (orderId, scope, fields) => {
|
|
10
|
+
const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
11
|
+
const { data: orders } = await query.graph({
|
|
12
|
+
entity: "order",
|
|
13
|
+
filters: { id: orderId },
|
|
14
|
+
fields,
|
|
15
|
+
});
|
|
16
|
+
return orders[0];
|
|
17
|
+
};
|
|
18
|
+
exports.refetchOrder = refetchOrder;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvbmV0bWUtcG9zL2RyYWZ0LW9yZGVycy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFxRTtBQUVyRTs7O0dBR0c7QUFDSSxNQUFNLFlBQVksR0FBRyxLQUFLLEVBQy9CLE9BQWUsRUFDZixLQUFzQixFQUN0QixNQUFnQixFQUNoQixFQUFFO0lBQ0YsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUU1RCxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QyxNQUFNLEVBQUUsT0FBTztRQUNmLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDeEIsTUFBTTtLQUNQLENBQUMsQ0FBQTtJQUVGLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2xCLENBQUMsQ0FBQTtBQWRZLFFBQUEsWUFBWSxnQkFjeEIifQ==
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveGroupPricingContext = resolveGroupPricingContext;
|
|
4
|
+
exports.buildResolvedLineItems = buildResolvedLineItems;
|
|
5
|
+
const http_1 = require("@medusajs/framework/http");
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
/**
|
|
8
|
+
* Build the pricing context for the TARGET customer of the draft order
|
|
9
|
+
* (port of `setPricingContextFromCustomer`, minus the middleware plumbing):
|
|
10
|
+
* region → currency, customer → customer-group ids (price lists per group).
|
|
11
|
+
*/
|
|
12
|
+
async function resolveGroupPricingContext(scope, { customerId, regionId }) {
|
|
13
|
+
const region = await (0, http_1.refetchEntity)({
|
|
14
|
+
entity: "region",
|
|
15
|
+
idOrFilter: regionId,
|
|
16
|
+
scope,
|
|
17
|
+
fields: ["id", "currency_code"],
|
|
18
|
+
options: { cache: { enable: true } },
|
|
19
|
+
});
|
|
20
|
+
if (!region) {
|
|
21
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Region with id ${regionId} not found when populating the pricing context`);
|
|
22
|
+
}
|
|
23
|
+
const pricingContext = {
|
|
24
|
+
region_id: region.id,
|
|
25
|
+
currency_code: region.currency_code,
|
|
26
|
+
};
|
|
27
|
+
if (customerId) {
|
|
28
|
+
const { data: customerGroups } = await (0, http_1.refetchEntities)({
|
|
29
|
+
entity: "customer_group",
|
|
30
|
+
idOrFilter: { customers: { id: customerId } },
|
|
31
|
+
scope,
|
|
32
|
+
fields: ["id"],
|
|
33
|
+
});
|
|
34
|
+
pricingContext.customer = {
|
|
35
|
+
groups: customerGroups.map((cg) => ({ id: cg.id })),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return pricingContext;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolve `calculated_price` for a set of variants under a pricing context.
|
|
42
|
+
* Returns a map `variant_id -> calculated_price` (may miss variants that
|
|
43
|
+
* don't exist / have no price).
|
|
44
|
+
*/
|
|
45
|
+
async function resolveVariantPrices(scope, variantIds, pricingContext) {
|
|
46
|
+
const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
47
|
+
const { data: products } = await query.graph({
|
|
48
|
+
entity: "product",
|
|
49
|
+
fields: ["id", "variants.id", "variants.calculated_price.*"],
|
|
50
|
+
filters: { variants: { id: variantIds } },
|
|
51
|
+
context: {
|
|
52
|
+
variants: { calculated_price: (0, utils_1.QueryContext)(pricingContext) },
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
const priceByVariantId = new Map();
|
|
56
|
+
for (const product of products) {
|
|
57
|
+
for (const variant of product.variants ?? []) {
|
|
58
|
+
if (variant?.id) {
|
|
59
|
+
priceByVariantId.set(variant.id, variant.calculated_price ?? null);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return priceByVariantId;
|
|
64
|
+
}
|
|
65
|
+
/** The `variantOverridePrice` rule: price-list price or nothing. */
|
|
66
|
+
const priceListUnitPrice = (calculatedPrice) => {
|
|
67
|
+
if (calculatedPrice?.is_calculated_price_price_list === true) {
|
|
68
|
+
return calculatedPrice.calculated_amount;
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Build line items ready for `addDraftOrderItemsWorkflow` /
|
|
74
|
+
* `createOrderWorkflow` from the client's structural declaration (§5):
|
|
75
|
+
*
|
|
76
|
+
* - normal line: `unit_price` = group price if price-list, else omitted.
|
|
77
|
+
* - bundle parent: same price rule + bundle metadata (`bundle_id`,
|
|
78
|
+
* `bundle_type: "parent"`, `bundle_meta`, `bundle_sticks_price`).
|
|
79
|
+
* - bundle child: `unit_price` = 0 ALWAYS + `bundled_by` / `bundle_type: "child"`.
|
|
80
|
+
*
|
|
81
|
+
* Client metadata is merged but can never override the bundle keys.
|
|
82
|
+
*/
|
|
83
|
+
async function buildResolvedLineItems(scope, { customerId, regionId, items, }) {
|
|
84
|
+
const variantIds = [...new Set(items.map((i) => i.variant_id))];
|
|
85
|
+
const pricingContext = await resolveGroupPricingContext(scope, {
|
|
86
|
+
customerId,
|
|
87
|
+
regionId,
|
|
88
|
+
});
|
|
89
|
+
const priceByVariantId = await resolveVariantPrices(scope, variantIds, pricingContext);
|
|
90
|
+
const missing = variantIds.filter((id) => !priceByVariantId.has(id));
|
|
91
|
+
if (missing.length) {
|
|
92
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Variants not found: ${missing.join(", ")}`);
|
|
93
|
+
}
|
|
94
|
+
return items.map((item) => {
|
|
95
|
+
const calculatedPrice = priceByVariantId.get(item.variant_id);
|
|
96
|
+
const resolved = {
|
|
97
|
+
variant_id: item.variant_id,
|
|
98
|
+
quantity: item.quantity,
|
|
99
|
+
};
|
|
100
|
+
if (item.allow_backorder !== undefined) {
|
|
101
|
+
resolved.allow_backorder = item.allow_backorder;
|
|
102
|
+
}
|
|
103
|
+
// Client metadata first: bundle keys below always win.
|
|
104
|
+
const metadata = { ...(item.metadata ?? {}) };
|
|
105
|
+
delete metadata.bundle_id;
|
|
106
|
+
delete metadata.bundled_by;
|
|
107
|
+
delete metadata.bundle_type;
|
|
108
|
+
if (item.bundle?.role === "child") {
|
|
109
|
+
// Children are ALWAYS free; the parent carries the package price.
|
|
110
|
+
resolved.unit_price = 0;
|
|
111
|
+
metadata.bundled_by = item.bundle.bundle_id;
|
|
112
|
+
metadata.bundle_type = "child";
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const unitPrice = priceListUnitPrice(calculatedPrice);
|
|
116
|
+
if (unitPrice !== undefined) {
|
|
117
|
+
resolved.unit_price = unitPrice;
|
|
118
|
+
}
|
|
119
|
+
if (item.bundle?.role === "parent") {
|
|
120
|
+
metadata.bundle_id = item.bundle.bundle_id;
|
|
121
|
+
metadata.bundle_type = "parent";
|
|
122
|
+
if (item.bundle.bundle_meta !== undefined) {
|
|
123
|
+
metadata.bundle_meta = item.bundle.bundle_meta;
|
|
124
|
+
}
|
|
125
|
+
if (item.bundle.bundle_sticks_price !== undefined) {
|
|
126
|
+
metadata.bundle_sticks_price = item.bundle.bundle_sticks_price;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (Object.keys(metadata).length) {
|
|
131
|
+
resolved.metadata = metadata;
|
|
132
|
+
}
|
|
133
|
+
return resolved;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpY2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvc3RvcmUvbmV0bWUtcG9zL2RyYWZ0LW9yZGVycy9wcmljaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0RBLGdFQXNDQztBQXNERCx3REFnRkM7QUE1TkQsbURBQXlFO0FBRXpFLHFEQUlrQztBQXFDbEM7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSwwQkFBMEIsQ0FDOUMsS0FBc0IsRUFDdEIsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUE0QztJQUVsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsb0JBQWEsRUFBQztRQUNqQyxNQUFNLEVBQUUsUUFBUTtRQUNoQixVQUFVLEVBQUUsUUFBUTtRQUNwQixLQUFLO1FBQ0wsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQztRQUMvQixPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7S0FDckMsQ0FBQyxDQUFBO0lBRUYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsa0JBQWtCLFFBQVEsZ0RBQWdELENBQzNFLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQW1CO1FBQ3JDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRTtRQUNwQixhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7S0FDcEMsQ0FBQTtJQUVELElBQUksVUFBVSxFQUFFLENBQUM7UUFDZixNQUFNLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sSUFBQSxzQkFBZSxFQUFDO1lBQ3JELE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQzdD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
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Mirror of the admin draft-orders query config (2.14.2). Same entity
|
|
4
|
+
* (`order`), same default fields — the responses are meant to be identical to
|
|
5
|
+
* the admin set so the POS front can reuse its parsing.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.listTransformQueryConfig = exports.retrieveTransformQueryConfig = exports.defaultStoreDraftOrderFields = exports.defaultStoreDraftOrderListFields = void 0;
|
|
9
|
+
exports.defaultStoreDraftOrderListFields = [
|
|
10
|
+
"id",
|
|
11
|
+
"display_id",
|
|
12
|
+
"custom_display_id",
|
|
13
|
+
"status",
|
|
14
|
+
"version",
|
|
15
|
+
"email",
|
|
16
|
+
"region_id",
|
|
17
|
+
"customer_id",
|
|
18
|
+
"*items",
|
|
19
|
+
"summary",
|
|
20
|
+
"total",
|
|
21
|
+
"metadata",
|
|
22
|
+
"created_at",
|
|
23
|
+
"updated_at",
|
|
24
|
+
];
|
|
25
|
+
exports.defaultStoreDraftOrderFields = [
|
|
26
|
+
"id",
|
|
27
|
+
"display_id",
|
|
28
|
+
"custom_display_id",
|
|
29
|
+
"status",
|
|
30
|
+
"version",
|
|
31
|
+
"email",
|
|
32
|
+
"region_id",
|
|
33
|
+
"customer_id",
|
|
34
|
+
"*items",
|
|
35
|
+
"*items.tax_lines",
|
|
36
|
+
"*items.adjustments",
|
|
37
|
+
"*items.detail",
|
|
38
|
+
"*items.variant",
|
|
39
|
+
"*items.variant.product",
|
|
40
|
+
"*shipping_address",
|
|
41
|
+
"*billing_address",
|
|
42
|
+
"*shipping_methods",
|
|
43
|
+
"*shipping_methods.tax_lines",
|
|
44
|
+
"*shipping_methods.adjustments",
|
|
45
|
+
"summary",
|
|
46
|
+
"total",
|
|
47
|
+
"metadata",
|
|
48
|
+
"created_at",
|
|
49
|
+
"updated_at",
|
|
50
|
+
];
|
|
51
|
+
exports.retrieveTransformQueryConfig = {
|
|
52
|
+
defaults: exports.defaultStoreDraftOrderFields,
|
|
53
|
+
isList: false,
|
|
54
|
+
};
|
|
55
|
+
exports.listTransformQueryConfig = {
|
|
56
|
+
defaults: exports.defaultStoreDraftOrderListFields,
|
|
57
|
+
defaultLimit: 20,
|
|
58
|
+
isList: true,
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9zdG9yZS9uZXRtZS1wb3MvZHJhZnQtb3JkZXJzL3F1ZXJ5LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRVUsUUFBQSxnQ0FBZ0MsR0FBRztJQUM5QyxJQUFJO0lBQ0osWUFBWTtJQUNaLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxXQUFXO0lBQ1gsYUFBYTtJQUNiLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixZQUFZO0lBQ1osWUFBWTtDQUNiLENBQUE7QUFFWSxRQUFBLDRCQUE0QixHQUFHO0lBQzFDLElBQUk7SUFDSixZQUFZO0lBQ1osbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFdBQVc7SUFDWCxhQUFhO0lBQ2IsUUFBUTtJQUNSLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQix3QkFBd0I7SUFDeEIsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsNkJBQTZCO0lBQzdCLCtCQUErQjtJQUMvQixTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixZQUFZO0lBQ1osWUFBWTtDQUNiLENBQUE7QUFFWSxRQUFBLDRCQUE0QixHQUFHO0lBQzFDLFFBQVEsRUFBRSxvQ0FBNEI7SUFDdEMsTUFBTSxFQUFFLEtBQUs7Q0FDZCxDQUFBO0FBRVksUUFBQSx3QkFBd0IsR0FBRztJQUN0QyxRQUFRLEVBQUUsd0NBQWdDO0lBQzFDLFlBQVksRUFBRSxFQUFFO0lBQ2hCLE1BQU0sRUFBRSxJQUFJO0NBQ2IsQ0FBQSJ9
|
|
@@ -0,0 +1,140 @@
|
|
|
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.GET = GET;
|
|
7
|
+
exports.POST = POST;
|
|
8
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
10
|
+
const agent_draft_order_1 = __importDefault(require("../../../../links/agent-draft-order"));
|
|
11
|
+
const ensure_agent_can_act_for_1 = require("../../../../workflows/ensure-agent-can-act-for");
|
|
12
|
+
const helpers_1 = require("./helpers");
|
|
13
|
+
/**
|
|
14
|
+
* `/store/netme-pos/draft-orders` — store mirror of `GET/POST /admin/draft-orders`
|
|
15
|
+
* (spec §7.1–§7.2). Same core-flows workflows; auth is the AGENT customer and
|
|
16
|
+
* every listing is scoped to the agent's own drafts via `mlm_agent_draft_order`.
|
|
17
|
+
*/
|
|
18
|
+
async function GET(req, res) {
|
|
19
|
+
const actorId = req.auth_context.actor_id;
|
|
20
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
21
|
+
const pagination = req.queryConfig.pagination;
|
|
22
|
+
// Agent scoping (never list without it — spec §7.2): resolve the agent's
|
|
23
|
+
// order ids from the link table and intersect with any client `id` filter.
|
|
24
|
+
const { data: linkRows } = await query.graph({
|
|
25
|
+
entity: agent_draft_order_1.default.entryPoint,
|
|
26
|
+
filters: { customer_id: actorId },
|
|
27
|
+
fields: ["order_id"],
|
|
28
|
+
});
|
|
29
|
+
let orderIds = [
|
|
30
|
+
...new Set(linkRows.map((row) => row.order_id).filter(Boolean)),
|
|
31
|
+
];
|
|
32
|
+
const requestedId = req.filterableFields.id;
|
|
33
|
+
if ((0, utils_1.isPresent)(requestedId)) {
|
|
34
|
+
const requested = Array.isArray(requestedId) ? requestedId : [requestedId];
|
|
35
|
+
orderIds = orderIds.filter((id) => requested.includes(id));
|
|
36
|
+
}
|
|
37
|
+
if (!orderIds.length) {
|
|
38
|
+
res.json({
|
|
39
|
+
draft_orders: [],
|
|
40
|
+
count: 0,
|
|
41
|
+
offset: pagination.skip ?? 0,
|
|
42
|
+
limit: pagination.take ?? 20,
|
|
43
|
+
});
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const variables = {
|
|
47
|
+
filters: {
|
|
48
|
+
...req.filterableFields,
|
|
49
|
+
id: orderIds,
|
|
50
|
+
is_draft_order: true,
|
|
51
|
+
},
|
|
52
|
+
...req.queryConfig.pagination,
|
|
53
|
+
};
|
|
54
|
+
const workflow = (0, core_flows_1.getOrdersListWorkflow)(req.scope);
|
|
55
|
+
const { result } = await workflow.run({
|
|
56
|
+
input: {
|
|
57
|
+
fields: req.queryConfig.fields,
|
|
58
|
+
variables,
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
const { rows, metadata } = result;
|
|
62
|
+
res.json({
|
|
63
|
+
draft_orders: rows,
|
|
64
|
+
count: metadata.count,
|
|
65
|
+
offset: metadata.skip,
|
|
66
|
+
limit: metadata.take,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async function POST(req, res) {
|
|
70
|
+
const actorId = req.auth_context.actor_id;
|
|
71
|
+
const input = req.validatedBody;
|
|
72
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
73
|
+
// MLM policy (§3.2) — also resolves the target's email for the order.
|
|
74
|
+
const { result: policy } = await (0, ensure_agent_can_act_for_1.ensureAgentCanActForWorkflow)(req.scope).run({
|
|
75
|
+
input: {
|
|
76
|
+
agent_customer_id: actorId,
|
|
77
|
+
target_customer_id: input.customer_id,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
// Currency from the region (same fallback the admin route performs).
|
|
81
|
+
const { data: regions } = await query.graph({
|
|
82
|
+
entity: "region",
|
|
83
|
+
filters: { id: input.region_id },
|
|
84
|
+
fields: ["id", "currency_code"],
|
|
85
|
+
});
|
|
86
|
+
const region = regions[0];
|
|
87
|
+
if (!region) {
|
|
88
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Region with id ${input.region_id} was not found`);
|
|
89
|
+
}
|
|
90
|
+
// Sales channel comes from the publishable key (never from the client);
|
|
91
|
+
// fall back to the store default when the key isn't channel-scoped.
|
|
92
|
+
let salesChannelId = req.publishable_key_context?.sales_channel_ids?.[0];
|
|
93
|
+
if (!salesChannelId) {
|
|
94
|
+
const { data: stores } = await query.graph({
|
|
95
|
+
entity: "store",
|
|
96
|
+
fields: ["id", "default_sales_channel_id"],
|
|
97
|
+
});
|
|
98
|
+
salesChannelId = stores[0]?.default_sales_channel_id ?? undefined;
|
|
99
|
+
}
|
|
100
|
+
const workflowInput = {
|
|
101
|
+
...input,
|
|
102
|
+
email: policy.target.email,
|
|
103
|
+
currency_code: region.currency_code,
|
|
104
|
+
sales_channel_id: salesChannelId,
|
|
105
|
+
no_notification: true,
|
|
106
|
+
status: utils_1.OrderStatus.DRAFT,
|
|
107
|
+
is_draft_order: true,
|
|
108
|
+
};
|
|
109
|
+
// Address ids may arrive as plain strings (same contract as admin).
|
|
110
|
+
if (typeof input.billing_address === "string") {
|
|
111
|
+
workflowInput.billing_address_id = input.billing_address;
|
|
112
|
+
delete workflowInput.billing_address;
|
|
113
|
+
}
|
|
114
|
+
if (typeof input.shipping_address === "string") {
|
|
115
|
+
workflowInput.shipping_address_id = input.shipping_address;
|
|
116
|
+
delete workflowInput.shipping_address;
|
|
117
|
+
}
|
|
118
|
+
const { result } = await (0, core_flows_1.createOrderWorkflow)(req.scope).run({
|
|
119
|
+
input: workflowInput,
|
|
120
|
+
});
|
|
121
|
+
// Attribution (§3.1 option B): agent ↔ draft order. If the link cannot be
|
|
122
|
+
// created the draft would be orphaned (invisible to every agent), so roll
|
|
123
|
+
// the order back and surface the error.
|
|
124
|
+
const link = req.scope.resolve(utils_1.ContainerRegistrationKeys.LINK);
|
|
125
|
+
try {
|
|
126
|
+
await link.create({
|
|
127
|
+
[utils_1.Modules.CUSTOMER]: { customer_id: actorId },
|
|
128
|
+
[utils_1.Modules.ORDER]: { order_id: result.id },
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
await (0, core_flows_1.deleteDraftOrdersWorkflow)(req.scope)
|
|
133
|
+
.run({ input: { order_ids: [result.id] } })
|
|
134
|
+
.catch(() => void 0);
|
|
135
|
+
throw e;
|
|
136
|
+
}
|
|
137
|
+
const draftOrder = await (0, helpers_1.refetchOrder)(result.id, req.scope, req.queryConfig.fields);
|
|
138
|
+
res.status(200).json({ draft_order: draftOrder });
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL25ldG1lLXBvcy9kcmFmdC1vcmRlcnMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUEyQkEsa0JBZ0VDO0FBRUQsb0JBd0ZDO0FBakxELHFEQU1rQztBQUNsQyw0REFJb0M7QUFDcEMsNEZBQXFFO0FBQ3JFLDZGQUE2RjtBQUM3Rix1Q0FBd0M7QUFHeEM7Ozs7R0FJRztBQUVJLEtBQUssVUFBVSxHQUFHLENBQ3ZCLEdBQStCLEVBQy9CLEdBQW1CO0lBRW5CLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFBO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hFLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFHbEMsQ0FBQTtJQUVELHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDM0MsTUFBTSxFQUFFLDJCQUFtQixDQUFDLFVBQVU7UUFDdEMsT0FBTyxFQUFFLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRTtRQUNqQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUM7S0FDckIsQ0FBQyxDQUFBO0lBRUYsSUFBSSxRQUFRLEdBQUc7UUFDYixHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDekQsQ0FBQTtJQUViLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFtQyxDQUFB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
|