@xbstracts/medusa-coupons 0.0.1
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 +3207 -0
- package/.medusa/server/src/admin/index.mjs +3253 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/entitlements/route.js +9 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/mirror-promotion/route.js +132 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/preview/route.js +28 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/route.js +18 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/route.js +14 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/[id]/route.js +53 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +26 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/route.js +27 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/route.js +36 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/cancel/route.js +15 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/redeem/route.js +15 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/route.js +16 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/route.js +22 -0
- package/.medusa/server/src/api/admin/coupon-products/options/route.js +9 -0
- package/.medusa/server/src/api/admin/coupon-products/products/route.js +16 -0
- package/.medusa/server/src/api/admin/coupon-products/route.js +13 -0
- package/.medusa/server/src/api/admin/coupon-products/uploads/route.js +7 -0
- package/.medusa/server/src/api/coupon-product-routes.js +546 -0
- package/.medusa/server/src/api/entitlement-utils.js +90 -0
- package/.medusa/server/src/api/media-upload.js +57 -0
- package/.medusa/server/src/api/middlewares.js +92 -0
- package/.medusa/server/src/api/product-utils.js +304 -0
- package/.medusa/server/src/api/promotion-code-resolver.js +225 -0
- package/.medusa/server/src/api/seller-utils.js +101 -0
- package/.medusa/server/src/api/utils.js +25 -0
- package/.medusa/server/src/api/validators.js +199 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/entitlements/route.js +9 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/route.js +18 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/route.js +14 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/route.js +60 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +41 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/route.js +45 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/route.js +51 -0
- package/.medusa/server/src/api/vendor/coupon-products/entitlements/[id]/route.js +25 -0
- package/.medusa/server/src/api/vendor/coupon-products/entitlements/route.js +45 -0
- package/.medusa/server/src/api/vendor/coupon-products/options/route.js +9 -0
- package/.medusa/server/src/api/vendor/coupon-products/products/route.js +19 -0
- package/.medusa/server/src/api/vendor/coupon-products/route.js +13 -0
- package/.medusa/server/src/api/vendor/coupon-products/uploads/route.js +7 -0
- package/.medusa/server/src/jobs/retry-coupon-media-deletes.js +14 -0
- package/.medusa/server/src/links/coupon-issuance-order-line-item.js +17 -0
- package/.medusa/server/src/links/coupon-issuance-order.js +15 -0
- package/.medusa/server/src/links/coupon-product-config-product.js +17 -0
- package/.medusa/server/src/links/coupon-product-variant-config-variant.js +17 -0
- package/.medusa/server/src/links/coupon-promotion-mirror-promotion.js +17 -0
- package/.medusa/server/src/links/customer-coupon-entitlement-customer.js +15 -0
- package/.medusa/server/src/modules/coupon/constants.js +46 -0
- package/.medusa/server/src/modules/coupon/index.js +16 -0
- package/.medusa/server/src/modules/coupon/loaders/reconcile-coupon-products.js +65 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260709000000.js +40 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260710000000.js +22 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260711000000.js +25 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260712000000.js +78 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260719000000.js +19 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260722000000.js +17 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260723000000.js +18 -0
- package/.medusa/server/src/modules/coupon/models/coupon-entitlement-promotion.js +31 -0
- package/.medusa/server/src/modules/coupon/models/coupon-entitlement-seller.js +28 -0
- package/.medusa/server/src/modules/coupon/models/coupon-issuance.js +35 -0
- package/.medusa/server/src/modules/coupon/models/coupon-media-asset.js +41 -0
- package/.medusa/server/src/modules/coupon/models/coupon-product-config.js +45 -0
- package/.medusa/server/src/modules/coupon/models/coupon-product-variant-config.js +36 -0
- package/.medusa/server/src/modules/coupon/models/coupon-promotion-mirror.js +27 -0
- package/.medusa/server/src/modules/coupon/models/customer-coupon-entitlement.js +56 -0
- package/.medusa/server/src/modules/coupon/models/index.js +23 -0
- package/.medusa/server/src/modules/coupon/payment-order-utils.js +76 -0
- package/.medusa/server/src/modules/coupon/product-metadata.js +24 -0
- package/.medusa/server/src/modules/coupon/purchase-conditions.js +138 -0
- package/.medusa/server/src/modules/coupon/service.js +628 -0
- package/.medusa/server/src/modules/coupon/types.js +3 -0
- package/.medusa/server/src/modules/coupon/utils.js +302 -0
- package/.medusa/server/src/subscribers/issue-coupons-from-order.js +88 -0
- package/.medusa/server/src/vendor/index.mjs +3237 -0
- package/.medusa/server/src/workflows/hooks/validate-coupon-add-to-cart.js +13 -0
- package/.medusa/server/src/workflows/hooks/validate-coupon-complete-cart.js +8 -0
- package/.medusa/server/src/workflows/index.js +21 -0
- package/.medusa/server/src/workflows/steps.js +27 -0
- package/.medusa/server/src/workflows/validate-coupon-purchase.js +85 -0
- package/README.md +84 -0
- package/package.json +102 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listCouponEntitlements = listCouponEntitlements;
|
|
4
|
+
exports.attachEntitlementSellerTargets = attachEntitlementSellerTargets;
|
|
5
|
+
exports.retrieveCouponEntitlementDetail = retrieveCouponEntitlementDetail;
|
|
6
|
+
exports.retrieveCouponOrderSummary = retrieveCouponOrderSummary;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
async function listCouponEntitlements(service, filters = {}) {
|
|
9
|
+
const entitlements = await service.listCustomerCouponEntitlements(filters);
|
|
10
|
+
return [...entitlements].sort((a, b) => {
|
|
11
|
+
const left = new Date(a.created_at || 0).getTime();
|
|
12
|
+
const right = new Date(b.created_at || 0).getTime();
|
|
13
|
+
return right - left;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async function attachEntitlementSellerTargets(service, entitlements) {
|
|
17
|
+
const ids = (entitlements || []).map((item) => item?.id).filter(Boolean);
|
|
18
|
+
if (!ids.length)
|
|
19
|
+
return entitlements || [];
|
|
20
|
+
const rows = await service.listCouponEntitlementSellers({
|
|
21
|
+
entitlement_id: ids,
|
|
22
|
+
});
|
|
23
|
+
const byEntitlement = new Map();
|
|
24
|
+
for (const row of rows || []) {
|
|
25
|
+
const id = String(row.entitlement_id);
|
|
26
|
+
byEntitlement.set(id, [...(byEntitlement.get(id) || []), row]);
|
|
27
|
+
}
|
|
28
|
+
return (entitlements || []).map((item) => ({
|
|
29
|
+
...item,
|
|
30
|
+
seller_targets: byEntitlement.get(String(item.id)) || [],
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
async function retrieveCouponEntitlementDetail(service, id) {
|
|
34
|
+
const entitlement = await service.retrieveCustomerCouponEntitlement(id);
|
|
35
|
+
let issuance = null;
|
|
36
|
+
if (entitlement?.issuance_id) {
|
|
37
|
+
try {
|
|
38
|
+
issuance = await service.retrieveCouponIssuance(entitlement.issuance_id);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
issuance = null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const [withSellerTargets] = await attachEntitlementSellerTargets(service, [
|
|
45
|
+
entitlement,
|
|
46
|
+
]);
|
|
47
|
+
return {
|
|
48
|
+
customer_coupon_entitlement: withSellerTargets,
|
|
49
|
+
coupon_issuance: issuance,
|
|
50
|
+
order: null,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function retrieveCouponOrderSummary(container, orderId) {
|
|
54
|
+
if (!orderId) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
59
|
+
const { data } = await query.graph({
|
|
60
|
+
entity: "order",
|
|
61
|
+
fields: [
|
|
62
|
+
"id",
|
|
63
|
+
"display_id",
|
|
64
|
+
"email",
|
|
65
|
+
"customer_id",
|
|
66
|
+
"currency_code",
|
|
67
|
+
"total",
|
|
68
|
+
"created_at",
|
|
69
|
+
],
|
|
70
|
+
filters: { id: orderId },
|
|
71
|
+
});
|
|
72
|
+
const order = data?.[0];
|
|
73
|
+
if (!order) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
id: order.id,
|
|
78
|
+
display_id: order.display_id ?? null,
|
|
79
|
+
email: order.email ?? null,
|
|
80
|
+
customer_id: order.customer_id ?? null,
|
|
81
|
+
currency_code: order.currency_code ?? null,
|
|
82
|
+
total: typeof order.total === "number" ? order.total : null,
|
|
83
|
+
created_at: order.created_at ?? null,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL2VudGl0bGVtZW50LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsd0RBYUM7QUFFRCx3RUFrQkM7QUFFRCwwRUF5QkM7QUFFRCxnRUF3Q0M7QUFuSEQscURBQXFFO0FBYTlELEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsT0FBNEIsRUFDNUIsVUFBbUMsRUFBRTtJQUVyQyxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyw4QkFBOEIsQ0FDL0QsT0FBYyxDQUNmLENBQUE7SUFFRCxPQUFPLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLEVBQUU7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ25ELE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQTtJQUNyQixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFTSxLQUFLLFVBQVUsOEJBQThCLENBQ2xELE9BQTRCLEVBQzVCLFlBQW1CO0lBRW5CLE1BQU0sR0FBRyxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU07UUFBRSxPQUFPLFlBQVksSUFBSSxFQUFFLENBQUE7SUFDMUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsNEJBQTRCLENBQUM7UUFDdEQsY0FBYyxFQUFFLEdBQUc7S0FDYixDQUFDLENBQUE7SUFDVCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQTtJQUM5QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUUsR0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzlDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNoRSxDQUFDO0lBQ0QsT0FBTyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekMsR0FBRyxJQUFJO1FBQ1AsY0FBYyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7S0FDekQsQ0FBQyxDQUFDLENBQUE7QUFDTCxDQUFDO0FBRU0sS0FBSyxVQUFVLCtCQUErQixDQUNuRCxPQUE0QixFQUM1QixFQUFVO0lBRVYsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsaUNBQWlDLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDdkUsSUFBSSxRQUFRLEdBQVksSUFBSSxDQUFBO0lBRTVCLElBQUssV0FBbUIsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsc0JBQXNCLENBQzVDLFdBQW1CLENBQUMsV0FBVyxDQUNqQyxDQUFBO1FBQ0gsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLFFBQVEsR0FBRyxJQUFJLENBQUE7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxNQUFNLDhCQUE4QixDQUFDLE9BQU8sRUFBRTtRQUN4RSxXQUFXO0tBQ1osQ0FBQyxDQUFBO0lBQ0YsT0FBTztRQUNMLDJCQUEyQixFQUFFLGlCQUFpQjtRQUM5QyxlQUFlLEVBQUUsUUFBUTtRQUN6QixLQUFLLEVBQUUsSUFBaUM7S0FDekMsQ0FBQTtBQUNILENBQUM7QUFFTSxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLFNBQWMsRUFDZCxPQUF1QjtJQUV2QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDakMsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUU7Z0JBQ04sSUFBSTtnQkFDSixZQUFZO2dCQUNaLE9BQU87Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2dCQUNmLE9BQU87Z0JBQ1AsWUFBWTthQUNiO1lBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRTtTQUN6QixDQUFDLENBQUE7UUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN2QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7UUFFRCxPQUFPO1lBQ0wsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1osVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSTtZQUNwQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJO1lBQzFCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUk7WUFDdEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhLElBQUksSUFBSTtZQUMxQyxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUMzRCxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxJQUFJO1NBQ3JDLENBQUE7SUFDSCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.uploadCouponMedia = uploadCouponMedia;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
6
|
+
const coupon_1 = require("../modules/coupon");
|
|
7
|
+
const seller_utils_1 = require("./seller-utils");
|
|
8
|
+
async function uploadCouponMedia(req, res, access) {
|
|
9
|
+
const files = (req.files || []);
|
|
10
|
+
if (!files.length) {
|
|
11
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No files were uploaded");
|
|
12
|
+
}
|
|
13
|
+
const sellerId = access === "vendor"
|
|
14
|
+
? (0, seller_utils_1.getSellerId)(req)
|
|
15
|
+
: typeof req.body?.seller_id === "string" &&
|
|
16
|
+
req.body.seller_id.trim()
|
|
17
|
+
? req.body.seller_id.trim()
|
|
18
|
+
: null;
|
|
19
|
+
const { result } = await (0, core_flows_1.uploadFilesWorkflow)(req.scope).run({
|
|
20
|
+
input: {
|
|
21
|
+
files: files.map((file) => ({
|
|
22
|
+
filename: file.originalname,
|
|
23
|
+
mimeType: file.mimetype,
|
|
24
|
+
content: file.buffer.toString("base64"),
|
|
25
|
+
access: "public",
|
|
26
|
+
})),
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
const service = req.scope.resolve(coupon_1.COUPON_MODULE);
|
|
30
|
+
try {
|
|
31
|
+
const created = await service.createCouponMediaAssets(result.map((file) => ({
|
|
32
|
+
file_id: file.id,
|
|
33
|
+
url: file.url,
|
|
34
|
+
seller_id: sellerId,
|
|
35
|
+
product_id: null,
|
|
36
|
+
role: "unassigned",
|
|
37
|
+
position: null,
|
|
38
|
+
status: "uploaded",
|
|
39
|
+
delete_attempts: 0,
|
|
40
|
+
last_error: null,
|
|
41
|
+
})));
|
|
42
|
+
const assets = Array.isArray(created) ? created : [created];
|
|
43
|
+
res.status(200).json({
|
|
44
|
+
files: assets.map((asset) => ({
|
|
45
|
+
asset_id: asset.id,
|
|
46
|
+
file_id: asset.file_id,
|
|
47
|
+
url: asset.url,
|
|
48
|
+
})),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
const fileService = req.scope.resolve(utils_1.Modules.FILE);
|
|
53
|
+
await fileService.deleteFiles(result.map((file) => file.id)).catch(() => { });
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaWEtdXBsb2FkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9tZWRpYS11cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFhQSw4Q0E0REM7QUF4RUQscURBQWdFO0FBQ2hFLDREQUFpRTtBQUNqRSw4Q0FBaUQ7QUFFakQsaURBQTRDO0FBUXJDLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsTUFBMEI7SUFFMUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBbUIsQ0FBQTtJQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHdCQUF3QixDQUN6QixDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUNaLE1BQU0sS0FBSyxRQUFRO1FBQ2pCLENBQUMsQ0FBQyxJQUFBLDBCQUFXLEVBQUMsR0FBVSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxPQUFRLEdBQUcsQ0FBQyxJQUFZLEVBQUUsU0FBUyxLQUFLLFFBQVE7WUFDN0MsR0FBRyxDQUFDLElBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBQ3BDLENBQUMsQ0FBRSxHQUFHLENBQUMsSUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUNaLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsZ0NBQW1CLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUMxRCxLQUFLLEVBQUU7WUFDTCxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMzQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQ3ZDLE1BQU0sRUFBRSxRQUFpQjthQUMxQixDQUFDLENBQUM7U0FDSjtLQUNGLENBQUMsQ0FBQTtJQUNGLE1BQU0sT0FBTyxHQUF3QixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxzQkFBYSxDQUFDLENBQUE7SUFFckUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsdUJBQXVCLENBQ25ELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2hCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLFNBQVMsRUFBRSxRQUFRO1lBQ25CLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLElBQUksRUFBRSxZQUFZO1lBQ2xCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsTUFBTSxFQUFFLFVBQVU7WUFDbEIsZUFBZSxFQUFFLENBQUM7WUFDbEIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFRLENBQ1gsQ0FBQTtRQUNELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUUzRCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDakMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNsQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3RCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRzthQUNmLENBQUMsQ0FBQztTQUNKLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQU0sZUFBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3hELE1BQU0sV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUE7UUFDNUUsTUFBTSxLQUFLLENBQUE7SUFDYixDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,92 @@
|
|
|
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
|
+
const framework_1 = require("@medusajs/framework");
|
|
7
|
+
const medusa_1 = require("@medusajs/medusa");
|
|
8
|
+
const seller_utils_1 = require("./seller-utils");
|
|
9
|
+
const promotion_code_resolver_1 = require("./promotion-code-resolver");
|
|
10
|
+
const multer_1 = __importDefault(require("multer"));
|
|
11
|
+
const upload = (0, multer_1.default)({
|
|
12
|
+
storage: multer_1.default.memoryStorage(),
|
|
13
|
+
limits: { fileSize: 25 * 1024 * 1024, files: 20 },
|
|
14
|
+
});
|
|
15
|
+
exports.default = (0, medusa_1.defineMiddlewares)({
|
|
16
|
+
routes: [
|
|
17
|
+
{
|
|
18
|
+
matcher: "/store/carts/:id/promotions",
|
|
19
|
+
method: ["POST", "DELETE"],
|
|
20
|
+
middlewares: [promotion_code_resolver_1.resolveCouponPromotionCodesMiddleware],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
matcher: "/admin/draft-orders/:id/edit/promotions",
|
|
24
|
+
method: ["POST", "DELETE"],
|
|
25
|
+
middlewares: [promotion_code_resolver_1.resolveCouponPromotionCodesMiddleware],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
matcher: "/vendor/draft-orders/:id/edit/promotions",
|
|
29
|
+
method: ["POST", "DELETE"],
|
|
30
|
+
middlewares: [
|
|
31
|
+
seller_utils_1.ensureCouponSellerMiddleware,
|
|
32
|
+
promotion_code_resolver_1.resolveCouponPromotionCodesMiddleware,
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
matcher: "/admin/coupon-products/uploads",
|
|
37
|
+
method: ["POST"],
|
|
38
|
+
middlewares: [
|
|
39
|
+
(0, framework_1.authenticate)("user", ["session", "bearer"], {
|
|
40
|
+
allowUnregistered: false,
|
|
41
|
+
}),
|
|
42
|
+
upload.array("files"),
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
matcher: "/admin/coupon-products",
|
|
47
|
+
middlewares: [
|
|
48
|
+
(0, framework_1.authenticate)("user", ["session", "bearer"], {
|
|
49
|
+
allowUnregistered: false,
|
|
50
|
+
}),
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
matcher: "/admin/coupon-products/*",
|
|
55
|
+
middlewares: [
|
|
56
|
+
(0, framework_1.authenticate)("user", ["session", "bearer"], {
|
|
57
|
+
allowUnregistered: false,
|
|
58
|
+
}),
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
matcher: "/vendor/coupon-products/uploads",
|
|
63
|
+
method: ["POST"],
|
|
64
|
+
middlewares: [
|
|
65
|
+
(0, framework_1.authenticate)("member", ["session", "bearer"], {
|
|
66
|
+
allowUnregistered: false,
|
|
67
|
+
}),
|
|
68
|
+
seller_utils_1.ensureCouponSellerMiddleware,
|
|
69
|
+
upload.array("files"),
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
matcher: "/vendor/coupon-products",
|
|
74
|
+
middlewares: [
|
|
75
|
+
(0, framework_1.authenticate)("member", ["session", "bearer"], {
|
|
76
|
+
allowUnregistered: false,
|
|
77
|
+
}),
|
|
78
|
+
seller_utils_1.ensureCouponSellerMiddleware,
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
matcher: "/vendor/coupon-products/*",
|
|
83
|
+
middlewares: [
|
|
84
|
+
(0, framework_1.authenticate)("member", ["session", "bearer"], {
|
|
85
|
+
allowUnregistered: false,
|
|
86
|
+
}),
|
|
87
|
+
seller_utils_1.ensureCouponSellerMiddleware,
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbURBQWtEO0FBQ2xELDZDQUFvRDtBQUNwRCxpREFBNkQ7QUFDN0QsdUVBQWlGO0FBQ2pGLG9EQUEyQjtBQUUzQixNQUFNLE1BQU0sR0FBRyxJQUFBLGdCQUFNLEVBQUM7SUFDcEIsT0FBTyxFQUFFLGdCQUFNLENBQUMsYUFBYSxFQUFFO0lBQy9CLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO0NBQ2xELENBQUMsQ0FBQTtBQUVGLGtCQUFlLElBQUEsMEJBQWlCLEVBQUM7SUFDL0IsTUFBTSxFQUFFO1FBQ047WUFDRSxPQUFPLEVBQUUsNkJBQTZCO1lBQ3RDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7WUFDMUIsV0FBVyxFQUFFLENBQUMsK0RBQXFDLENBQUM7U0FDckQ7UUFDRDtZQUNFLE9BQU8sRUFBRSx5Q0FBeUM7WUFDbEQsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztZQUMxQixXQUFXLEVBQUUsQ0FBQywrREFBcUMsQ0FBQztTQUNyRDtRQUNEO1lBQ0UsT0FBTyxFQUFFLDBDQUEwQztZQUNuRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO1lBQzFCLFdBQVcsRUFBRTtnQkFDWCwyQ0FBNEI7Z0JBQzVCLCtEQUFxQzthQUN0QztTQUNGO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsZ0NBQWdDO1lBQ3pDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNoQixXQUFXLEVBQUU7Z0JBQ1gsSUFBQSx3QkFBWSxFQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDMUMsaUJBQWlCLEVBQUUsS0FBSztpQkFDekIsQ0FBQztnQkFDRixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQzthQUN0QjtTQUNGO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsd0JBQXdCO1lBQ2pDLFdBQVcsRUFBRTtnQkFDWCxJQUFBLHdCQUFZLEVBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFO29CQUMxQyxpQkFBaUIsRUFBRSxLQUFLO2lCQUN6QixDQUFDO2FBQ0g7U0FDRjtRQUNEO1lBQ0UsT0FBTyxFQUFFLDBCQUEwQjtZQUNuQyxXQUFXLEVBQUU7Z0JBQ1gsSUFBQSx3QkFBWSxFQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDMUMsaUJBQWlCLEVBQUUsS0FBSztpQkFDekIsQ0FBQzthQUNIO1NBQ0Y7UUFDRDtZQUNFLE9BQU8sRUFBRSxpQ0FBaUM7WUFDMUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2hCLFdBQVcsRUFBRTtnQkFDWCxJQUFBLHdCQUFZLEVBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFO29CQUM1QyxpQkFBaUIsRUFBRSxLQUFLO2lCQUN6QixDQUFDO2dCQUNGLDJDQUE0QjtnQkFDNUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDdEI7U0FDRjtRQUNEO1lBQ0UsT0FBTyxFQUFFLHlCQUF5QjtZQUNsQyxXQUFXLEVBQUU7Z0JBQ1gsSUFBQSx3QkFBWSxFQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDNUMsaUJBQWlCLEVBQUUsS0FBSztpQkFDekIsQ0FBQztnQkFDRiwyQ0FBNEI7YUFDN0I7U0FDRjtRQUNEO1lBQ0UsT0FBTyxFQUFFLDJCQUEyQjtZQUNwQyxXQUFXLEVBQUU7Z0JBQ1gsSUFBQSx3QkFBWSxFQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRTtvQkFDNUMsaUJBQWlCLEVBQUUsS0FBSztpQkFDekIsQ0FBQztnQkFDRiwyQ0FBNEI7YUFDN0I7U0FDRjtLQUNGO0NBQ0YsQ0FBQyxDQUFBIn0=
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listProductPickerOptions = listProductPickerOptions;
|
|
4
|
+
exports.listProductsByIds = listProductsByIds;
|
|
5
|
+
exports.isCouponProduct = isCouponProduct;
|
|
6
|
+
exports.buildCouponProductRecord = buildCouponProductRecord;
|
|
7
|
+
exports.listCouponProductOptions = listCouponProductOptions;
|
|
8
|
+
exports.supportedConditionValues = supportedConditionValues;
|
|
9
|
+
exports.validateCouponPurchaseOptions = validateCouponPurchaseOptions;
|
|
10
|
+
exports.resolveCouponSalesChannelIds = resolveCouponSalesChannelIds;
|
|
11
|
+
exports.synchronizeCouponProductSalesChannels = synchronizeCouponProductSalesChannels;
|
|
12
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
13
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
14
|
+
const constants_1 = require("../modules/coupon/constants");
|
|
15
|
+
const purchase_conditions_1 = require("../modules/coupon/purchase-conditions");
|
|
16
|
+
const PRODUCT_FIELDS = [
|
|
17
|
+
"id",
|
|
18
|
+
"title",
|
|
19
|
+
"subtitle",
|
|
20
|
+
"handle",
|
|
21
|
+
"description",
|
|
22
|
+
"status",
|
|
23
|
+
"thumbnail",
|
|
24
|
+
"images.*",
|
|
25
|
+
"metadata",
|
|
26
|
+
"discountable",
|
|
27
|
+
"type_id",
|
|
28
|
+
"collection_id",
|
|
29
|
+
"shipping_profile_id",
|
|
30
|
+
"categories.id",
|
|
31
|
+
"categories.name",
|
|
32
|
+
"tags.id",
|
|
33
|
+
"tags.value",
|
|
34
|
+
"sales_channels.id",
|
|
35
|
+
"sales_channels.name",
|
|
36
|
+
"variants.id",
|
|
37
|
+
"variants.title",
|
|
38
|
+
"variants.sku",
|
|
39
|
+
"variants.manage_inventory",
|
|
40
|
+
"variants.allow_backorder",
|
|
41
|
+
"variants.metadata",
|
|
42
|
+
"variants.options.*",
|
|
43
|
+
"variants.prices.*",
|
|
44
|
+
];
|
|
45
|
+
function parseLimit(value) {
|
|
46
|
+
const parsed = Number(value);
|
|
47
|
+
if (!Number.isFinite(parsed) || parsed <= 0)
|
|
48
|
+
return 100;
|
|
49
|
+
return Math.min(Math.floor(parsed), 200);
|
|
50
|
+
}
|
|
51
|
+
function normalizeSearch(value) {
|
|
52
|
+
return typeof value === "string" ? value.trim().toLowerCase() : "";
|
|
53
|
+
}
|
|
54
|
+
function productMatchesSearch(product, q) {
|
|
55
|
+
if (!q)
|
|
56
|
+
return true;
|
|
57
|
+
return [product.id, product.title, product.handle]
|
|
58
|
+
.filter(Boolean)
|
|
59
|
+
.some((value) => String(value).toLowerCase().includes(q));
|
|
60
|
+
}
|
|
61
|
+
async function graphList(req, entity, fields, filters = {}, take = 100) {
|
|
62
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
63
|
+
const { data } = await query.graph({
|
|
64
|
+
entity,
|
|
65
|
+
fields,
|
|
66
|
+
filters,
|
|
67
|
+
pagination: {
|
|
68
|
+
skip: 0,
|
|
69
|
+
take,
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
return data || [];
|
|
73
|
+
}
|
|
74
|
+
async function listProductPickerOptions(req, options = {}) {
|
|
75
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
76
|
+
const limit = parseLimit(options.limit);
|
|
77
|
+
const q = normalizeSearch(options.q);
|
|
78
|
+
const productIds = Array.from(new Set(options.productIds || [])).filter(Boolean);
|
|
79
|
+
if (options.productIds && productIds.length === 0) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
const { data } = await query.graph({
|
|
83
|
+
entity: "product",
|
|
84
|
+
fields: PRODUCT_FIELDS,
|
|
85
|
+
filters: productIds.length ? { id: productIds } : {},
|
|
86
|
+
pagination: {
|
|
87
|
+
skip: 0,
|
|
88
|
+
take: limit,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
return (data || [])
|
|
92
|
+
.filter((product) => productMatchesSearch(product, q))
|
|
93
|
+
.map((product) => ({
|
|
94
|
+
id: product.id,
|
|
95
|
+
title: product.title,
|
|
96
|
+
handle: product.handle,
|
|
97
|
+
status: product.status,
|
|
98
|
+
thumbnail: product.thumbnail,
|
|
99
|
+
variants: (product.variants || []).map((variant) => ({
|
|
100
|
+
id: variant.id,
|
|
101
|
+
title: variant.title,
|
|
102
|
+
})),
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
async function listProductsByIds(req, productIds) {
|
|
106
|
+
const ids = Array.from(new Set(productIds)).filter(Boolean);
|
|
107
|
+
if (!ids.length) {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
return graphList(req, "product", PRODUCT_FIELDS, { id: ids }, ids.length);
|
|
111
|
+
}
|
|
112
|
+
function isCouponProduct(product) {
|
|
113
|
+
const marker = product?.metadata?.[constants_1.COUPON_METADATA_KEY];
|
|
114
|
+
return marker?.item_type === "coupon" || marker?.config_id;
|
|
115
|
+
}
|
|
116
|
+
function buildCouponProductRecord(config, product, variantConfigs = [], entitlementCount = 0) {
|
|
117
|
+
return {
|
|
118
|
+
id: product?.id || config.product_id,
|
|
119
|
+
product,
|
|
120
|
+
coupon_product_config: config,
|
|
121
|
+
coupon_product_variant_configs: variantConfigs,
|
|
122
|
+
entitlements_count: entitlementCount,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async function safeOptions(req, entity, fields, filters = {}, take = 200) {
|
|
126
|
+
try {
|
|
127
|
+
return await graphList(req, entity, fields, filters, take);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function listStoreCurrencyOptions(req) {
|
|
134
|
+
const stores = await safeOptions(req, "store", ["id", "supported_currencies.*"], {}, 1);
|
|
135
|
+
const supportedCurrencies = stores[0]?.supported_currencies || [];
|
|
136
|
+
const currencyCodes = supportedCurrencies
|
|
137
|
+
.map((currency) => currency.currency_code?.trim().toLowerCase())
|
|
138
|
+
.filter(Boolean);
|
|
139
|
+
if (!currencyCodes.length) {
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
const currencyDetails = await safeOptions(req, "currency", ["code", "name", "symbol", "symbol_native"], { code: currencyCodes }, currencyCodes.length);
|
|
143
|
+
const detailsByCode = Object.fromEntries(currencyDetails.map((currency) => [
|
|
144
|
+
currency.code?.toLowerCase(),
|
|
145
|
+
currency,
|
|
146
|
+
]));
|
|
147
|
+
return supportedCurrencies
|
|
148
|
+
.map((supportedCurrency) => {
|
|
149
|
+
const code = supportedCurrency.currency_code?.trim().toLowerCase();
|
|
150
|
+
if (!code)
|
|
151
|
+
return null;
|
|
152
|
+
const currency = detailsByCode[code] || supportedCurrency.currency || {};
|
|
153
|
+
return {
|
|
154
|
+
code,
|
|
155
|
+
name: currency.name || code.toUpperCase(),
|
|
156
|
+
symbol: currency.symbol || "",
|
|
157
|
+
symbol_native: currency.symbol_native || currency.symbol || "",
|
|
158
|
+
is_default: Boolean(supportedCurrency.is_default),
|
|
159
|
+
is_tax_inclusive: Boolean(supportedCurrency.is_tax_inclusive),
|
|
160
|
+
};
|
|
161
|
+
})
|
|
162
|
+
.filter(Boolean);
|
|
163
|
+
}
|
|
164
|
+
async function listSellerCustomerGroupIds(req, sellerId) {
|
|
165
|
+
const rows = await safeOptions(req, "seller_customer", ["customer.groups.id"], { seller_id: sellerId }, 10_000);
|
|
166
|
+
return Array.from(new Set(rows
|
|
167
|
+
.flatMap((row) => row.customer?.groups || [])
|
|
168
|
+
.map((group) => group.id)
|
|
169
|
+
.filter(Boolean)));
|
|
170
|
+
}
|
|
171
|
+
function filterSellerValues(values, allowed, readId) {
|
|
172
|
+
const allowedSet = new Set(allowed.map((value) => value.toLowerCase()));
|
|
173
|
+
return values.filter((value) => {
|
|
174
|
+
const id = readId(value);
|
|
175
|
+
return id ? allowedSet.has(id.toLowerCase()) : false;
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
async function listCouponProductOptions(req, sellerProductIds, sellerId) {
|
|
179
|
+
const restrictProducts = Array.isArray(sellerProductIds);
|
|
180
|
+
const productFilters = restrictProducts ? { id: sellerProductIds } : {};
|
|
181
|
+
const currencies = await listStoreCurrencyOptions(req);
|
|
182
|
+
let [types, collections, categories, tags, salesChannels, shippingProfiles, campaigns, sellers, products, customerGroups, regions, countries,] = await Promise.all([
|
|
183
|
+
safeOptions(req, "product_type", ["id", "value"]),
|
|
184
|
+
safeOptions(req, "product_collection", ["id", "title", "handle"]),
|
|
185
|
+
safeOptions(req, "product_category", [
|
|
186
|
+
"id",
|
|
187
|
+
"name",
|
|
188
|
+
"handle",
|
|
189
|
+
"parent_category_id",
|
|
190
|
+
]),
|
|
191
|
+
safeOptions(req, "product_tag", ["id", "value"]),
|
|
192
|
+
safeOptions(req, "sales_channel", ["id", "name", "description"]),
|
|
193
|
+
safeOptions(req, "shipping_profile", ["id", "name", "type"]),
|
|
194
|
+
safeOptions(req, "campaign", [
|
|
195
|
+
"id",
|
|
196
|
+
"name",
|
|
197
|
+
"campaign_identifier",
|
|
198
|
+
"starts_at",
|
|
199
|
+
"ends_at",
|
|
200
|
+
"budget.*",
|
|
201
|
+
]),
|
|
202
|
+
safeOptions(req, "seller", ["id", "name", "handle"]),
|
|
203
|
+
restrictProducts && !sellerProductIds.length
|
|
204
|
+
? []
|
|
205
|
+
: safeOptions(req, "product", PRODUCT_FIELDS, productFilters, 200),
|
|
206
|
+
safeOptions(req, "customer_group", ["id", "name", "metadata"]),
|
|
207
|
+
safeOptions(req, "region", ["id", "name", "currency_code"]),
|
|
208
|
+
safeOptions(req, "country", ["iso_2", "iso_3", "display_name", "name"], {}, 300),
|
|
209
|
+
]);
|
|
210
|
+
if (sellerId) {
|
|
211
|
+
const allowedGroups = await listSellerCustomerGroupIds(req, sellerId);
|
|
212
|
+
customerGroups = filterSellerValues(customerGroups, allowedGroups, (group) => group.id);
|
|
213
|
+
sellers = sellers.filter((seller) => seller.id === sellerId);
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
currencies,
|
|
217
|
+
product_types: types,
|
|
218
|
+
product_collections: collections,
|
|
219
|
+
product_categories: categories,
|
|
220
|
+
product_tags: tags,
|
|
221
|
+
sales_channels: salesChannels,
|
|
222
|
+
customer_groups: customerGroups,
|
|
223
|
+
regions,
|
|
224
|
+
countries: countries.map((country) => ({
|
|
225
|
+
...country,
|
|
226
|
+
id: country.iso_2?.toLowerCase(),
|
|
227
|
+
iso_2: country.iso_2?.toLowerCase(),
|
|
228
|
+
display_name: country.display_name || country.name || country.iso_2,
|
|
229
|
+
})),
|
|
230
|
+
shipping_profiles: shippingProfiles,
|
|
231
|
+
campaigns,
|
|
232
|
+
sellers,
|
|
233
|
+
coupon_products: products.filter(isCouponProduct),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
const CONDITION_OPTION_KEYS = {
|
|
237
|
+
"customer.groups.id": "customer_groups",
|
|
238
|
+
"region.id": "regions",
|
|
239
|
+
"shipping_address.country_code": "countries",
|
|
240
|
+
sales_channel_id: "sales_channels",
|
|
241
|
+
currency_code: "currencies",
|
|
242
|
+
};
|
|
243
|
+
function optionValue(attribute, option) {
|
|
244
|
+
if (attribute === "currency_code")
|
|
245
|
+
return option.code;
|
|
246
|
+
if (attribute === "shipping_address.country_code")
|
|
247
|
+
return option.iso_2;
|
|
248
|
+
return option.id;
|
|
249
|
+
}
|
|
250
|
+
function supportedConditionValues(options, attribute) {
|
|
251
|
+
return (options[CONDITION_OPTION_KEYS[attribute]] || [])
|
|
252
|
+
.map((option) => optionValue(attribute, option))
|
|
253
|
+
.filter(Boolean)
|
|
254
|
+
.map((value) => attribute === "currency_code" ||
|
|
255
|
+
attribute === "shipping_address.country_code"
|
|
256
|
+
? value.toLowerCase()
|
|
257
|
+
: value);
|
|
258
|
+
}
|
|
259
|
+
function validateCouponPurchaseOptions(coupon, options) {
|
|
260
|
+
const conditions = (0, purchase_conditions_1.normalizePurchaseConditions)(coupon.purchase_conditions || []);
|
|
261
|
+
for (const condition of conditions) {
|
|
262
|
+
const supported = new Set(supportedConditionValues(options, condition.attribute));
|
|
263
|
+
for (const value of condition.values) {
|
|
264
|
+
if (!supported.has(value)) {
|
|
265
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `${value} is not an available ${condition.attribute} purchase condition value`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (coupon.benefit_type === "fixed_amount") {
|
|
270
|
+
const condition = (0, purchase_conditions_1.findPurchaseCondition)(conditions, "currency_code");
|
|
271
|
+
if (!condition) {
|
|
272
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "A Currency Code purchase condition is required for fixed amount coupons");
|
|
273
|
+
}
|
|
274
|
+
const effectiveCurrencies = (0, purchase_conditions_1.resolveEffectiveConditionValues)(condition, supportedConditionValues(options, "currency_code")).sort();
|
|
275
|
+
const amountCurrencies = Array.from(new Set((coupon.amounts || [])
|
|
276
|
+
.map((amount) => amount.currency_code.toLowerCase())
|
|
277
|
+
.filter(Boolean))).sort();
|
|
278
|
+
if (effectiveCurrencies.length !== amountCurrencies.length ||
|
|
279
|
+
effectiveCurrencies.some((currency, index) => currency !== amountCurrencies[index])) {
|
|
280
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Fixed coupon amounts must include every effective Currency Code condition value");
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return conditions;
|
|
284
|
+
}
|
|
285
|
+
function resolveCouponSalesChannelIds(conditions, options) {
|
|
286
|
+
return (0, purchase_conditions_1.resolveEffectiveConditionValues)((0, purchase_conditions_1.findPurchaseCondition)(conditions, "sales_channel_id"), supportedConditionValues(options, "sales_channel_id"));
|
|
287
|
+
}
|
|
288
|
+
async function synchronizeCouponProductSalesChannels(req, productId, salesChannelIds, sellerId) {
|
|
289
|
+
await (0, core_flows_1.updateProductsWorkflow)(req.scope).run({
|
|
290
|
+
input: {
|
|
291
|
+
products: [
|
|
292
|
+
{
|
|
293
|
+
id: productId,
|
|
294
|
+
sales_channels: salesChannelIds.map((id) => ({ id })),
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
additional_data: {
|
|
298
|
+
source: "medusa-coupons",
|
|
299
|
+
...(sellerId ? { seller_id: sellerId } : {}),
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvcHJvZHVjdC11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZGQSw0REFzQ0M7QUFFRCw4Q0FVQztBQUVELDBDQUdDO0FBRUQsNERBYUM7QUFtR0QsNERBd0ZDO0FBdUJELDREQWFDO0FBRUQsc0VBdURDO0FBRUQsb0VBUUM7QUFFRCxzRkFvQkM7QUExZEQscURBR2tDO0FBQ2xDLDREQUFvRTtBQUNwRSwyREFBaUU7QUFNakUsK0VBSThDO0FBRTlDLE1BQU0sY0FBYyxHQUFHO0lBQ3JCLElBQUk7SUFDSixPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixhQUFhO0lBQ2IsUUFBUTtJQUNSLFdBQVc7SUFDWCxVQUFVO0lBQ1YsVUFBVTtJQUNWLGNBQWM7SUFDZCxTQUFTO0lBQ1QsZUFBZTtJQUNmLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLFNBQVM7SUFDVCxZQUFZO0lBQ1osbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCwyQkFBMkI7SUFDM0IsMEJBQTBCO0lBQzFCLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIsbUJBQW1CO0NBQ3BCLENBQUE7QUFRRCxTQUFTLFVBQVUsQ0FBQyxLQUFjO0lBQ2hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFBO0lBQ3ZELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQzFDLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxLQUFjO0lBQ3JD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
|