@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.
Files changed (84) hide show
  1. package/.medusa/server/src/admin/index.js +3207 -0
  2. package/.medusa/server/src/admin/index.mjs +3253 -0
  3. package/.medusa/server/src/api/admin/coupon-products/[product_id]/entitlements/route.js +9 -0
  4. package/.medusa/server/src/api/admin/coupon-products/[product_id]/mirror-promotion/route.js +132 -0
  5. package/.medusa/server/src/api/admin/coupon-products/[product_id]/preview/route.js +28 -0
  6. package/.medusa/server/src/api/admin/coupon-products/[product_id]/route.js +18 -0
  7. package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
  8. package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/route.js +14 -0
  9. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/route.js +53 -0
  10. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +26 -0
  11. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/route.js +27 -0
  12. package/.medusa/server/src/api/admin/coupon-products/configs/route.js +36 -0
  13. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/cancel/route.js +15 -0
  14. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/redeem/route.js +15 -0
  15. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/route.js +16 -0
  16. package/.medusa/server/src/api/admin/coupon-products/entitlements/route.js +22 -0
  17. package/.medusa/server/src/api/admin/coupon-products/options/route.js +9 -0
  18. package/.medusa/server/src/api/admin/coupon-products/products/route.js +16 -0
  19. package/.medusa/server/src/api/admin/coupon-products/route.js +13 -0
  20. package/.medusa/server/src/api/admin/coupon-products/uploads/route.js +7 -0
  21. package/.medusa/server/src/api/coupon-product-routes.js +546 -0
  22. package/.medusa/server/src/api/entitlement-utils.js +90 -0
  23. package/.medusa/server/src/api/media-upload.js +57 -0
  24. package/.medusa/server/src/api/middlewares.js +92 -0
  25. package/.medusa/server/src/api/product-utils.js +304 -0
  26. package/.medusa/server/src/api/promotion-code-resolver.js +225 -0
  27. package/.medusa/server/src/api/seller-utils.js +101 -0
  28. package/.medusa/server/src/api/utils.js +25 -0
  29. package/.medusa/server/src/api/validators.js +199 -0
  30. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/entitlements/route.js +9 -0
  31. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/route.js +18 -0
  32. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
  33. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/route.js +14 -0
  34. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/route.js +60 -0
  35. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +41 -0
  36. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/route.js +45 -0
  37. package/.medusa/server/src/api/vendor/coupon-products/configs/route.js +51 -0
  38. package/.medusa/server/src/api/vendor/coupon-products/entitlements/[id]/route.js +25 -0
  39. package/.medusa/server/src/api/vendor/coupon-products/entitlements/route.js +45 -0
  40. package/.medusa/server/src/api/vendor/coupon-products/options/route.js +9 -0
  41. package/.medusa/server/src/api/vendor/coupon-products/products/route.js +19 -0
  42. package/.medusa/server/src/api/vendor/coupon-products/route.js +13 -0
  43. package/.medusa/server/src/api/vendor/coupon-products/uploads/route.js +7 -0
  44. package/.medusa/server/src/jobs/retry-coupon-media-deletes.js +14 -0
  45. package/.medusa/server/src/links/coupon-issuance-order-line-item.js +17 -0
  46. package/.medusa/server/src/links/coupon-issuance-order.js +15 -0
  47. package/.medusa/server/src/links/coupon-product-config-product.js +17 -0
  48. package/.medusa/server/src/links/coupon-product-variant-config-variant.js +17 -0
  49. package/.medusa/server/src/links/coupon-promotion-mirror-promotion.js +17 -0
  50. package/.medusa/server/src/links/customer-coupon-entitlement-customer.js +15 -0
  51. package/.medusa/server/src/modules/coupon/constants.js +46 -0
  52. package/.medusa/server/src/modules/coupon/index.js +16 -0
  53. package/.medusa/server/src/modules/coupon/loaders/reconcile-coupon-products.js +65 -0
  54. package/.medusa/server/src/modules/coupon/migrations/Migration20260709000000.js +40 -0
  55. package/.medusa/server/src/modules/coupon/migrations/Migration20260710000000.js +22 -0
  56. package/.medusa/server/src/modules/coupon/migrations/Migration20260711000000.js +25 -0
  57. package/.medusa/server/src/modules/coupon/migrations/Migration20260712000000.js +78 -0
  58. package/.medusa/server/src/modules/coupon/migrations/Migration20260719000000.js +19 -0
  59. package/.medusa/server/src/modules/coupon/migrations/Migration20260722000000.js +17 -0
  60. package/.medusa/server/src/modules/coupon/migrations/Migration20260723000000.js +18 -0
  61. package/.medusa/server/src/modules/coupon/models/coupon-entitlement-promotion.js +31 -0
  62. package/.medusa/server/src/modules/coupon/models/coupon-entitlement-seller.js +28 -0
  63. package/.medusa/server/src/modules/coupon/models/coupon-issuance.js +35 -0
  64. package/.medusa/server/src/modules/coupon/models/coupon-media-asset.js +41 -0
  65. package/.medusa/server/src/modules/coupon/models/coupon-product-config.js +45 -0
  66. package/.medusa/server/src/modules/coupon/models/coupon-product-variant-config.js +36 -0
  67. package/.medusa/server/src/modules/coupon/models/coupon-promotion-mirror.js +27 -0
  68. package/.medusa/server/src/modules/coupon/models/customer-coupon-entitlement.js +56 -0
  69. package/.medusa/server/src/modules/coupon/models/index.js +23 -0
  70. package/.medusa/server/src/modules/coupon/payment-order-utils.js +76 -0
  71. package/.medusa/server/src/modules/coupon/product-metadata.js +24 -0
  72. package/.medusa/server/src/modules/coupon/purchase-conditions.js +138 -0
  73. package/.medusa/server/src/modules/coupon/service.js +628 -0
  74. package/.medusa/server/src/modules/coupon/types.js +3 -0
  75. package/.medusa/server/src/modules/coupon/utils.js +302 -0
  76. package/.medusa/server/src/subscribers/issue-coupons-from-order.js +88 -0
  77. package/.medusa/server/src/vendor/index.mjs +3237 -0
  78. package/.medusa/server/src/workflows/hooks/validate-coupon-add-to-cart.js +13 -0
  79. package/.medusa/server/src/workflows/hooks/validate-coupon-complete-cart.js +8 -0
  80. package/.medusa/server/src/workflows/index.js +21 -0
  81. package/.medusa/server/src/workflows/steps.js +27 -0
  82. package/.medusa/server/src/workflows/validate-coupon-purchase.js +85 -0
  83. package/README.md +84 -0
  84. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRsZW1lbnQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL2VudGl0bGVtZW50LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsd0RBYUM7QUFFRCx3RUFrQkM7QUFFRCwwRUF5QkM7QUFFRCxnRUF3Q0M7QUFuSEQscURBQXFFO0FBYTlELEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsT0FBNEIsRUFDNUIsVUFBbUMsRUFBRTtJQUVyQyxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyw4QkFBOEIsQ0FDL0QsT0FBYyxDQUNmLENBQUE7SUFFRCxPQUFPLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLEVBQUU7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ25ELE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQTtJQUNyQixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFTSxLQUFLLFVBQVUsOEJBQThCLENBQ2xELE9BQTRCLEVBQzVCLFlBQW1CO0lBRW5CLE1BQU0sR0FBRyxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU07UUFBRSxPQUFPLFlBQVksSUFBSSxFQUFFLENBQUE7SUFDMUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENB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
@@ -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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