@hartl-services/medusa-affiliate 0.3.0

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 (169) hide show
  1. package/.medusa/server/src/admin/index.js +3739 -0
  2. package/.medusa/server/src/admin/index.mjs +3738 -0
  3. package/.medusa/server/src/api/admin/affiliate-applications/[id]/approve/route.js +28 -0
  4. package/.medusa/server/src/api/admin/affiliate-applications/[id]/reject/route.js +19 -0
  5. package/.medusa/server/src/api/admin/affiliate-applications/route.js +23 -0
  6. package/.medusa/server/src/api/admin/affiliate-distribution-reports/query.js +171 -0
  7. package/.medusa/server/src/api/admin/affiliate-distribution-reports/route.js +13 -0
  8. package/.medusa/server/src/api/admin/affiliate-program-settings/route.js +27 -0
  9. package/.medusa/server/src/api/admin/affiliate-reports/[id]/route.js +45 -0
  10. package/.medusa/server/src/api/admin/affiliate-reports/route.js +27 -0
  11. package/.medusa/server/src/api/admin/affiliates/[id]/consignment-reminders/route.js +31 -0
  12. package/.medusa/server/src/api/admin/affiliates/[id]/consignment-transfers/route.js +41 -0
  13. package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/reconcile/route.js +34 -0
  14. package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/revoke/route.js +36 -0
  15. package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/rotate/route.js +40 -0
  16. package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/route.js +56 -0
  17. package/.medusa/server/src/api/admin/affiliates/[id]/distribution/route.js +45 -0
  18. package/.medusa/server/src/api/admin/affiliates/[id]/inactive/route.js +20 -0
  19. package/.medusa/server/src/api/admin/affiliates/[id]/route.js +50 -0
  20. package/.medusa/server/src/api/admin/affiliates/[id]/slugs/[slug_id]/route.js +19 -0
  21. package/.medusa/server/src/api/admin/affiliates/[id]/slugs/route.js +26 -0
  22. package/.medusa/server/src/api/admin/affiliates/route.js +43 -0
  23. package/.medusa/server/src/api/admin/consignment-report-response.js +36 -0
  24. package/.medusa/server/src/api/admin/consignment-reports/[id]/approve/route.js +25 -0
  25. package/.medusa/server/src/api/admin/consignment-reports/[id]/correct/route.js +18 -0
  26. package/.medusa/server/src/api/admin/consignment-reports/[id]/reject/route.js +15 -0
  27. package/.medusa/server/src/api/admin/consignment-reports/[id]/route.js +11 -0
  28. package/.medusa/server/src/api/admin/consignment-reports/route.js +27 -0
  29. package/.medusa/server/src/api/admin/customers/[id]/affiliate/route.js +50 -0
  30. package/.medusa/server/src/api/admin/orders/[id]/affiliate-attribution/route.js +30 -0
  31. package/.medusa/server/src/api/affiliate-coupon-http.js +152 -0
  32. package/.medusa/server/src/api/affiliate-referral-cookie.js +34 -0
  33. package/.medusa/server/src/api/affiliate-self-service-http.js +37 -0
  34. package/.medusa/server/src/api/middlewares.js +786 -0
  35. package/.medusa/server/src/api/store/affiliate-referrals/apply-coupon/route.js +47 -0
  36. package/.medusa/server/src/api/store/affiliate-referrals/capture/route.js +76 -0
  37. package/.medusa/server/src/api/store/affiliate-referrals/carts/[cart_id]/route.js +20 -0
  38. package/.medusa/server/src/api/store/affiliates/consignment-inventory/route.js +53 -0
  39. package/.medusa/server/src/api/store/affiliates/consignment-report-response.js +31 -0
  40. package/.medusa/server/src/api/store/affiliates/consignment-reports/[id]/submit/route.js +40 -0
  41. package/.medusa/server/src/api/store/affiliates/consignment-reports/route.js +43 -0
  42. package/.medusa/server/src/api/store/affiliates/coupon-labels/route.js +14 -0
  43. package/.medusa/server/src/api/store/affiliates/me/commissions/route.js +35 -0
  44. package/.medusa/server/src/api/store/affiliates/me/coupon-codes/[coupon_id]/revoke/route.js +36 -0
  45. package/.medusa/server/src/api/store/affiliates/me/coupon-codes/[coupon_id]/rotate/route.js +40 -0
  46. package/.medusa/server/src/api/store/affiliates/me/coupon-codes/route.js +55 -0
  47. package/.medusa/server/src/api/store/affiliates/me/dashboard/route.js +15 -0
  48. package/.medusa/server/src/api/store/affiliates/me/route.js +85 -0
  49. package/.medusa/server/src/api/store/affiliates/me/slugs/[slug_id]/route.js +29 -0
  50. package/.medusa/server/src/api/store/affiliates/me/slugs/route.js +34 -0
  51. package/.medusa/server/src/api/store/affiliates/own-order-discount/route.js +22 -0
  52. package/.medusa/server/src/api/store/affiliates/own-order-promotion/route.js +30 -0
  53. package/.medusa/server/src/api/store/affiliates/register/route.js +27 -0
  54. package/.medusa/server/src/api/store/affiliates/resolve-referral/route.js +34 -0
  55. package/.medusa/server/src/api/validators.js +52 -0
  56. package/.medusa/server/src/api/wire-response.js +10 -0
  57. package/.medusa/server/src/integration/email-events.js +51 -0
  58. package/.medusa/server/src/integrations/inventory-transfer/batch-management-transfer-adapter.js +36 -0
  59. package/.medusa/server/src/integrations/inventory-transfer/native-inventory-transfer-adapter.js +30 -0
  60. package/.medusa/server/src/integrations/inventory-transfer/resolve-inventory-transfer-adapter.js +46 -0
  61. package/.medusa/server/src/integrations/inventory-transfer/types.js +3 -0
  62. package/.medusa/server/src/jobs/affiliate-attribution-expiry.js +20 -0
  63. package/.medusa/server/src/jobs/affiliate-consignment-report-reminders.js +15 -0
  64. package/.medusa/server/src/jobs/affiliate-promotion-freshness.js +24 -0
  65. package/.medusa/server/src/lib/query-string.js +15 -0
  66. package/.medusa/server/src/modules/affiliate/domain/affiliate-attribution-policy.js +81 -0
  67. package/.medusa/server/src/modules/affiliate/domain/affiliate-coupon-policy.js +61 -0
  68. package/.medusa/server/src/modules/affiliate/domain/commission-policy.js +33 -0
  69. package/.medusa/server/src/modules/affiliate/domain/consignment-reminder-rules.js +74 -0
  70. package/.medusa/server/src/modules/affiliate/domain/email-normalization.js +20 -0
  71. package/.medusa/server/src/modules/affiliate/domain/own-order-coupon-code.js +37 -0
  72. package/.medusa/server/src/modules/affiliate/domain/plugin-options.js +40 -0
  73. package/.medusa/server/src/modules/affiliate/index.js +13 -0
  74. package/.medusa/server/src/modules/affiliate/migrations/Migration20260827085154.js +423 -0
  75. package/.medusa/server/src/modules/affiliate/models/affiliate-application.js +38 -0
  76. package/.medusa/server/src/modules/affiliate/models/affiliate-cart-referral.js +65 -0
  77. package/.medusa/server/src/modules/affiliate/models/affiliate-code-redemption.js +41 -0
  78. package/.medusa/server/src/modules/affiliate/models/affiliate-coupon.js +55 -0
  79. package/.medusa/server/src/modules/affiliate/models/affiliate-distribution-settings.js +22 -0
  80. package/.medusa/server/src/modules/affiliate/models/affiliate-order-attribution.js +49 -0
  81. package/.medusa/server/src/modules/affiliate/models/affiliate-program-settings.js +28 -0
  82. package/.medusa/server/src/modules/affiliate/models/affiliate-referral-session.js +34 -0
  83. package/.medusa/server/src/modules/affiliate/models/affiliate-slug.js +27 -0
  84. package/.medusa/server/src/modules/affiliate/models/affiliate.js +49 -0
  85. package/.medusa/server/src/modules/affiliate/models/commission-entry.js +62 -0
  86. package/.medusa/server/src/modules/affiliate/models/consignment-report-line.js +21 -0
  87. package/.medusa/server/src/modules/affiliate/models/consignment-report.js +31 -0
  88. package/.medusa/server/src/modules/affiliate/models/consignment-transfer-line.js +16 -0
  89. package/.medusa/server/src/modules/affiliate/models/consignment-transfer.js +20 -0
  90. package/.medusa/server/src/modules/affiliate/models/customer-affiliate-assignment.js +58 -0
  91. package/.medusa/server/src/modules/affiliate/service.js +2321 -0
  92. package/.medusa/server/src/modules/affiliate/services/affiliate-application-manager.js +171 -0
  93. package/.medusa/server/src/modules/affiliate/services/affiliate-coupon-manager.js +441 -0
  94. package/.medusa/server/src/modules/affiliate/services/affiliate-discount.service.js +55 -0
  95. package/.medusa/server/src/modules/affiliate/services/affiliate-manager.js +242 -0
  96. package/.medusa/server/src/modules/affiliate/services/affiliate-partner-portal.service.js +138 -0
  97. package/.medusa/server/src/modules/affiliate/services/affiliate-report.service.js +436 -0
  98. package/.medusa/server/src/modules/affiliate/services/affiliate-slug-manager.js +163 -0
  99. package/.medusa/server/src/modules/affiliate/services/commission-ledger.service.js +729 -0
  100. package/.medusa/server/src/modules/affiliate/services/customer-affiliate-assignment-manager.js +350 -0
  101. package/.medusa/server/src/modules/affiliate/services/order-attribution-manager.js +1051 -0
  102. package/.medusa/server/src/modules/affiliate/services/referral-lifecycle-manager.js +1420 -0
  103. package/.medusa/server/src/modules/affiliate/services/utils.js +49 -0
  104. package/.medusa/server/src/modules/affiliate/types/internal.js +3 -0
  105. package/.medusa/server/src/paths/affiliate.js +7 -0
  106. package/.medusa/server/src/paths/index.js +18 -0
  107. package/.medusa/server/src/schemas/index.js +18 -0
  108. package/.medusa/server/src/schemas/store.js +24 -0
  109. package/.medusa/server/src/subscribers/affiliate-cart-updated.js +92 -0
  110. package/.medusa/server/src/subscribers/affiliate-order-canceled.js +70 -0
  111. package/.medusa/server/src/subscribers/affiliate-order-placed.js +63 -0
  112. package/.medusa/server/src/subscribers/affiliate-order-return-received.js +67 -0
  113. package/.medusa/server/src/subscribers/affiliate-product-eligibility-updated.js +87 -0
  114. package/.medusa/server/src/types/admin-api.js +3 -0
  115. package/.medusa/server/src/types/enums.js +53 -0
  116. package/.medusa/server/src/types/index.js +32 -0
  117. package/.medusa/server/src/types/public.js +3 -0
  118. package/.medusa/server/src/types/store-api.js +3 -0
  119. package/.medusa/server/src/utils/affiliate-cart-operation-lock.js +316 -0
  120. package/.medusa/server/src/utils/affiliate-promotion-mutation-authorization.js +49 -0
  121. package/.medusa/server/src/utils/cart-promotions.js +9 -0
  122. package/.medusa/server/src/utils/money.js +79 -0
  123. package/.medusa/server/src/utils/promotion-code-availability.js +34 -0
  124. package/.medusa/server/src/utils/registered-email-checkout.js +101 -0
  125. package/.medusa/server/src/utils/resolve-services.js +7 -0
  126. package/.medusa/server/src/utils/settle-cart-promotions.js +44 -0
  127. package/.medusa/server/src/workflows/affiliate/affiliate-coupon-cart.js +215 -0
  128. package/.medusa/server/src/workflows/affiliate/affiliate-coupon-command-authorization.js +20 -0
  129. package/.medusa/server/src/workflows/affiliate/apply-affiliate-coupon.js +174 -0
  130. package/.medusa/server/src/workflows/affiliate/apply-own-order-promotion.js +89 -0
  131. package/.medusa/server/src/workflows/affiliate/approve-consignment-report.js +186 -0
  132. package/.medusa/server/src/workflows/affiliate/correct-approved-consignment-report.js +263 -0
  133. package/.medusa/server/src/workflows/affiliate/create-affiliate-coupon.js +35 -0
  134. package/.medusa/server/src/workflows/affiliate/create-commission-correction-for-cancellation.js +21 -0
  135. package/.medusa/server/src/workflows/affiliate/create-commission-correction-for-refund.js +24 -0
  136. package/.medusa/server/src/workflows/affiliate/create-commission-for-order.js +17 -0
  137. package/.medusa/server/src/workflows/affiliate/deactivate-affiliate.js +89 -0
  138. package/.medusa/server/src/workflows/affiliate/enable-distribution.js +120 -0
  139. package/.medusa/server/src/workflows/affiliate/enrich-affiliate-report.js +75 -0
  140. package/.medusa/server/src/workflows/affiliate/ensure-affiliate-coupon-promotion.js +410 -0
  141. package/.medusa/server/src/workflows/affiliate/ensure-affiliate-own-order-promotion.js +240 -0
  142. package/.medusa/server/src/workflows/affiliate/ensure-default-affiliate-coupon.js +32 -0
  143. package/.medusa/server/src/workflows/affiliate/expire-affiliate-attribution-state.js +131 -0
  144. package/.medusa/server/src/workflows/affiliate/finalize-affiliate-order-attribution.js +82 -0
  145. package/.medusa/server/src/workflows/affiliate/payment-authorization.js +33 -0
  146. package/.medusa/server/src/workflows/affiliate/promotion-eligibility.js +179 -0
  147. package/.medusa/server/src/workflows/affiliate/reconcile-affiliate-cart-referral.js +219 -0
  148. package/.medusa/server/src/workflows/affiliate/reconcile-affiliate-coupon.js +388 -0
  149. package/.medusa/server/src/workflows/affiliate/refresh-affiliate-promotions.js +114 -0
  150. package/.medusa/server/src/workflows/affiliate/resolve-coupon-labels.js +40 -0
  151. package/.medusa/server/src/workflows/affiliate/revoke-affiliate-coupon.js +29 -0
  152. package/.medusa/server/src/workflows/affiliate/rotate-affiliate-coupon.js +36 -0
  153. package/.medusa/server/src/workflows/affiliate/run-consignment-report-reminders.js +58 -0
  154. package/.medusa/server/src/workflows/affiliate/submit-consignment-report.js +279 -0
  155. package/.medusa/server/src/workflows/affiliate/transfer-batch-aware-inventory.js +172 -0
  156. package/.medusa/server/src/workflows/affiliate/transfer-consignment-stock.js +106 -0
  157. package/.medusa/server/src/workflows/affiliate/update-affiliate-coupon-discounts.js +129 -0
  158. package/.medusa/server/src/workflows/affiliate/utils.js +118 -0
  159. package/.medusa/server/src/workflows/hooks/complete-cart-affiliate-attribution.js +57 -0
  160. package/.medusa/server/src/workflows/hooks/complete-cart-order-created-composition.js +111 -0
  161. package/.medusa/server/src/workflows/hooks/complete-cart-own-order-discount.js +75 -0
  162. package/.medusa/server/src/workflows/hooks/enforce-unique-promotion-codes.js +33 -0
  163. package/.medusa/server/src/workflows/hooks/validate-affiliate-customer-code.js +239 -0
  164. package/.medusa/server/src/workflows/hooks/validate-complete-cart-affiliate-referral.js +137 -0
  165. package/LICENSE +21 -0
  166. package/README.md +799 -0
  167. package/dist/integration/email-events.d.ts +20 -0
  168. package/dist/integration/email-events.js +50 -0
  169. package/package.json +84 -0
@@ -0,0 +1,786 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.holdAffiliateCartRequestLocks = exports.bindAffiliateReferralCookie = void 0;
37
+ const Sentry = __importStar(require("@sentry/node"));
38
+ const http_1 = require("@medusajs/framework/http");
39
+ const utils_1 = require("@medusajs/framework/utils");
40
+ const registered_email_checkout_1 = require("../utils/registered-email-checkout");
41
+ const resolve_services_1 = require("../utils/resolve-services");
42
+ const cart_promotions_1 = require("../utils/cart-promotions");
43
+ const validators_1 = require("./validators");
44
+ const affiliate_referral_cookie_1 = require("./affiliate-referral-cookie");
45
+ const email_normalization_1 = require("../modules/affiliate/domain/email-normalization");
46
+ const affiliate_cart_operation_lock_1 = require("../utils/affiliate-cart-operation-lock");
47
+ const affiliate_coupon_cart_1 = require("../workflows/affiliate/affiliate-coupon-cart");
48
+ const ensure_affiliate_coupon_promotion_1 = require("../workflows/affiliate/ensure-affiliate-coupon-promotion");
49
+ const reconcile_affiliate_coupon_1 = require("../workflows/affiliate/reconcile-affiliate-coupon");
50
+ const reportTolerated = (req, area, message, error) => {
51
+ Sentry.captureException(error, {
52
+ tags: { area },
53
+ extra: { cartId: req.params.id, path: req.originalUrl || req.url },
54
+ });
55
+ try {
56
+ req.scope
57
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
58
+ .warn(`${message} (cart ${req.params.id}): ${error instanceof Error ? error.message : "Unknown error"}`);
59
+ }
60
+ catch {
61
+ // A missing logger must not turn the tolerated failure into a real one.
62
+ }
63
+ };
64
+ /**
65
+ * Binds a pending affiliate referral cookie to the cart. Every plain cart
66
+ * read and write passes through here, so for those a failure is reported and
67
+ * tolerated - the cookie is deliberately left in place so the next request
68
+ * retries the binding. Only cart completion keeps the failure fatal: that is
69
+ * the last moment the referral can still be attributed to the order.
70
+ */
71
+ const bindAffiliateReferralCookieState = async (req, res, options) => {
72
+ const rawToken = (0, affiliate_referral_cookie_1.readAffiliateReferralCookie)(req.headers.cookie);
73
+ if (!rawToken)
74
+ return;
75
+ try {
76
+ await (0, resolve_services_1.resolveAffiliateService)(req.scope).bindReferralSessionToCart({
77
+ cart_id: req.params.id,
78
+ raw_token: rawToken,
79
+ }, req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY));
80
+ }
81
+ catch (error) {
82
+ if (options.fatal)
83
+ throw error;
84
+ reportTolerated(req, "affiliate-referral-cookie", "Affiliate referral cookie could not be bound to the cart", error);
85
+ return;
86
+ }
87
+ res.setHeader("Set-Cookie", (0, affiliate_referral_cookie_1.buildClearedAffiliateReferralCookie)({
88
+ secure: process.env.NODE_ENV === "production",
89
+ }));
90
+ };
91
+ const bindAffiliateReferralCookie = async (req, res, next) => {
92
+ await bindAffiliateReferralCookieState(req, res, { fatal: false });
93
+ next();
94
+ };
95
+ exports.bindAffiliateReferralCookie = bindAffiliateReferralCookie;
96
+ const CART_BUSY_MESSAGE = "Der Warenkorb wird gerade aktualisiert. Bitte versuche es gleich noch einmal.";
97
+ const isCompleteCartRequest = (req) => (req.originalUrl || req.url).split("?", 1)[0].endsWith("/complete");
98
+ const readCompleteCartLockState = async (req) => {
99
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
100
+ const { data } = await query.graph({
101
+ entity: "cart",
102
+ fields: [
103
+ "id",
104
+ "email",
105
+ "customer_id",
106
+ "promotions.id",
107
+ "promotions.code",
108
+ ],
109
+ filters: { id: req.params.id },
110
+ }, { cache: { enable: false } });
111
+ const cart = data[0];
112
+ if (!cart) {
113
+ return { affiliate_ids: [], coupon_ids: [], signature: "missing" };
114
+ }
115
+ const affiliateService = (0, resolve_services_1.resolveAffiliateService)(req.scope);
116
+ const [referralState, couponBindings] = await Promise.all([
117
+ affiliateService.inspectAffiliateCartReferralForCheckout({
118
+ cart_id: cart.id,
119
+ customer_id: cart.customer_id ?? null,
120
+ normalized_email: cart.email
121
+ ? (0, email_normalization_1.normalizeAffiliateEmail)(cart.email)
122
+ : null,
123
+ }, query),
124
+ (0, affiliate_coupon_cart_1.loadAffiliateCouponCartBindings)(affiliateService, (0, cart_promotions_1.readCartPromotions)(cart.promotions)),
125
+ ]);
126
+ const affiliateIds = [
127
+ ...new Set([
128
+ ...referralState.referrals.map(({ affiliate_id }) => affiliate_id),
129
+ ...(referralState.assignment
130
+ ? [referralState.assignment.affiliate_id]
131
+ : []),
132
+ ...couponBindings.map(({ coupon }) => coupon.affiliate_id),
133
+ ]),
134
+ ].sort();
135
+ const cleanupPending = referralState.latest_referral?.status === "invalidated" &&
136
+ referralState.latest_referral.invalidated_reason === "affiliate_inactive";
137
+ const couponIds = cleanupPending
138
+ ? []
139
+ : [...new Set(couponBindings.map(({ coupon }) => coupon.id))].sort();
140
+ const signature = JSON.stringify({
141
+ affiliate_ids: affiliateIds,
142
+ coupon_bindings: couponBindings
143
+ .map(({ coupon, exact, promotion }) => ({
144
+ coupon_id: coupon.id,
145
+ exact,
146
+ promotion_id: promotion.id,
147
+ }))
148
+ .sort((left, right) => left.promotion_id.localeCompare(right.promotion_id)),
149
+ referrals: referralState.referrals
150
+ .map((referral) => ({
151
+ id: referral.id,
152
+ affiliate_id: referral.affiliate_id,
153
+ status: referral.status,
154
+ source_affiliate_coupon_id: referral.source_affiliate_coupon_id,
155
+ applied_affiliate_coupon_id: referral.applied_affiliate_coupon_id,
156
+ applied_promotion_id: referral.applied_promotion_id,
157
+ updated_at: referral.updated_at,
158
+ }))
159
+ .sort((left, right) => left.id.localeCompare(right.id)),
160
+ assignment: referralState.assignment
161
+ ? {
162
+ id: referralState.assignment.id,
163
+ affiliate_id: referralState.assignment.affiliate_id,
164
+ updated_at: referralState.assignment.updated_at,
165
+ }
166
+ : null,
167
+ });
168
+ return {
169
+ affiliate_ids: affiliateIds,
170
+ coupon_ids: couponIds,
171
+ signature,
172
+ };
173
+ };
174
+ const releaseRequestLocks = (requestLease) => {
175
+ let releasePromise;
176
+ return () => {
177
+ releasePromise ??= requestLease.release();
178
+ return releasePromise;
179
+ };
180
+ };
181
+ const holdAffiliateCartRequestLocks = async (req, res, next) => {
182
+ const complete = isCompleteCartRequest(req);
183
+ let observed = complete ? await readCompleteCartLockState(req) : null;
184
+ let cookieBound = false;
185
+ let requestLease = null;
186
+ try {
187
+ for (let attempt = 0; attempt < 3; attempt += 1) {
188
+ const sagaKeys = (observed?.affiliate_ids ?? []).map(affiliate_cart_operation_lock_1.affiliateSagaLockKey);
189
+ const provisioningKeys = observed?.coupon_ids.length
190
+ ? observed.affiliate_ids.flatMap(ensure_affiliate_coupon_promotion_1.affiliateCouponProvisioningLockKeys)
191
+ : [];
192
+ requestLease = await (0, affiliate_cart_operation_lock_1.acquireAffiliateOperationLocks)(req.scope, [
193
+ (0, affiliate_cart_operation_lock_1.affiliateCartLockKey)(req.params.id),
194
+ ...sagaKeys,
195
+ ...provisioningKeys,
196
+ ]);
197
+ let retryState = null;
198
+ await requestLease.run(async () => {
199
+ if (!cookieBound) {
200
+ await bindAffiliateReferralCookieState(req, res, { fatal: complete });
201
+ cookieBound = true;
202
+ }
203
+ if (!complete)
204
+ return;
205
+ const locked = await readCompleteCartLockState(req);
206
+ if (observed && observed.signature !== locked.signature) {
207
+ retryState = locked;
208
+ return;
209
+ }
210
+ const revalidated = await readCompleteCartLockState(req);
211
+ if (revalidated.signature !== locked.signature) {
212
+ retryState = revalidated;
213
+ return;
214
+ }
215
+ for (const couponId of revalidated.coupon_ids) {
216
+ await (0, reconcile_affiliate_coupon_1.reconcileAffiliateCouponForCart)(req.scope, couponId, req.params.id);
217
+ }
218
+ const finalState = await readCompleteCartLockState(req);
219
+ const lockedAffiliateIds = new Set(revalidated.affiliate_ids);
220
+ if (finalState.affiliate_ids.some((affiliateId) => !lockedAffiliateIds.has(affiliateId))) {
221
+ retryState = finalState;
222
+ }
223
+ });
224
+ if (!retryState)
225
+ break;
226
+ await requestLease.release();
227
+ requestLease = null;
228
+ observed = retryState;
229
+ }
230
+ if (!requestLease) {
231
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "Affiliate cart state changed repeatedly while completing the cart.");
232
+ }
233
+ const release = releaseRequestLocks(requestLease);
234
+ const releaseOnExit = () => {
235
+ void release().catch((error) => {
236
+ const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
237
+ logger.error(`Affiliate cart request lock release failed: ${error instanceof Error ? error.message : "Unknown error"}`);
238
+ });
239
+ };
240
+ res.once("finish", releaseOnExit);
241
+ res.once("close", releaseOnExit);
242
+ if (res.writableEnded || res.destroyed) {
243
+ res.off("finish", releaseOnExit);
244
+ res.off("close", releaseOnExit);
245
+ await release();
246
+ return;
247
+ }
248
+ try {
249
+ requestLease.run(() => next());
250
+ }
251
+ catch (error) {
252
+ res.off("finish", releaseOnExit);
253
+ res.off("close", releaseOnExit);
254
+ try {
255
+ await release();
256
+ }
257
+ catch (releaseError) {
258
+ throw new AggregateError([error, releaseError], "Affiliate cart request and lock release failed");
259
+ }
260
+ throw error;
261
+ }
262
+ }
263
+ catch (error) {
264
+ if (requestLease) {
265
+ const release = releaseRequestLocks(requestLease);
266
+ try {
267
+ await release();
268
+ }
269
+ catch (releaseError) {
270
+ throw new AggregateError([error, releaseError], "Affiliate cart request lock preparation failed");
271
+ }
272
+ }
273
+ if (error instanceof affiliate_cart_operation_lock_1.AffiliateOperationLockTimeoutError) {
274
+ // Another request (or the reconcile subscriber) still holds this cart.
275
+ // That is a transient, retryable condition for the customer, not a
276
+ // server fault - and Medusa overwrites the message of a CONFLICT with
277
+ // its generic idempotency text, so NOT_ALLOWED (400) is the only type
278
+ // that carries a customer-readable message.
279
+ reportTolerated(req, "affiliate-cart-lock", "Affiliate cart lock could not be acquired in time", error);
280
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, CART_BUSY_MESSAGE);
281
+ }
282
+ throw error;
283
+ }
284
+ };
285
+ exports.holdAffiliateCartRequestLocks = holdAffiliateCartRequestLocks;
286
+ const preventConsignmentOrderCancellation = async (req, _res, next) => {
287
+ const orderService = req.scope.resolve(utils_1.Modules.ORDER);
288
+ const order = await orderService.retrieveOrder(req.params.id, {
289
+ select: ["id", "metadata"],
290
+ });
291
+ if (order.metadata?.consignment === true) {
292
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.FORBIDDEN, "Kommissionsabrechnungen dürfen nicht storniert werden. Verwende stattdessen eine Kommissionskorrektur.");
293
+ }
294
+ next();
295
+ };
296
+ const enforceConsignmentReportOwnership = async (req, _res, next) => {
297
+ const customerId = req.auth_context?.actor_id;
298
+ if (!customerId) {
299
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.FORBIDDEN, "Für diese Monatsmeldung ist eine Customer-Anmeldung erforderlich.");
300
+ }
301
+ const service = (0, resolve_services_1.resolveAffiliateService)(req.scope);
302
+ const affiliate = await service.findActiveAffiliateByCustomerId(customerId);
303
+ const report = await service.retrieveConsignmentReportRecord(req.params.id);
304
+ if (!affiliate || report.affiliate_id !== affiliate.id) {
305
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.FORBIDDEN, "Diese Monatsmeldung gehört zu einem anderen Affiliate.");
306
+ }
307
+ next();
308
+ };
309
+ exports.default = (0, http_1.defineMiddlewares)({
310
+ routes: [
311
+ // Registered-email gates. The storefront makes these calls from the browser
312
+ // with a Medusa session cookie, hence "session" first; bearer covers its
313
+ // server-side calls. allowUnauthenticated keeps guest checkout working -
314
+ // the gates only refuse an email that belongs to an existing account.
315
+ {
316
+ matcher: "/store/carts",
317
+ methods: ["POST"],
318
+ middlewares: [
319
+ (0, http_1.authenticate)("customer", ["session", "bearer"], { allowUnauthenticated: true }),
320
+ registered_email_checkout_1.requireLoginForRegisteredCartEmail,
321
+ ],
322
+ },
323
+ {
324
+ matcher: "/store/carts/:id",
325
+ methods: ["POST"],
326
+ middlewares: [
327
+ (0, http_1.authenticate)("customer", ["session", "bearer"], { allowUnauthenticated: true }),
328
+ registered_email_checkout_1.requireLoginForRegisteredCartEmail,
329
+ ],
330
+ },
331
+ {
332
+ matcher: "/store/payment-collections/:id/payment-sessions",
333
+ methods: ["POST"],
334
+ middlewares: [
335
+ (0, http_1.authenticate)("customer", ["session", "bearer"], { allowUnauthenticated: true }),
336
+ registered_email_checkout_1.requireLoginForRegisteredPaymentEmail,
337
+ ],
338
+ },
339
+ {
340
+ matcher: "/store/carts/:id/complete",
341
+ methods: ["POST"],
342
+ middlewares: [
343
+ (0, http_1.authenticate)("customer", ["session", "bearer"], { allowUnauthenticated: true }),
344
+ registered_email_checkout_1.requireLoginForRegisteredCheckoutEmail,
345
+ ],
346
+ },
347
+ {
348
+ matcher: "/store/carts/:id*",
349
+ methods: ["POST", "PUT", "PATCH", "DELETE"],
350
+ middlewares: [exports.holdAffiliateCartRequestLocks],
351
+ },
352
+ {
353
+ matcher: "/store/carts/:id*",
354
+ methods: ["GET"],
355
+ middlewares: [exports.bindAffiliateReferralCookie],
356
+ },
357
+ {
358
+ matcher: "/store/affiliate-referrals/capture",
359
+ methods: ["POST"],
360
+ middlewares: [(0, http_1.validateAndTransformBody)(validators_1.CaptureAffiliateReferralSchema)],
361
+ },
362
+ {
363
+ matcher: "/store/affiliate-referrals/apply-coupon",
364
+ methods: ["POST"],
365
+ middlewares: [(0, http_1.validateAndTransformBody)(validators_1.ApplyAffiliateCouponSchema)],
366
+ },
367
+ {
368
+ matcher: "/store/affiliates/coupon-labels",
369
+ methods: ["POST"],
370
+ middlewares: [
371
+ (0, http_1.validateAndTransformBody)(validators_1.ResolveAffiliateCouponLabelsPayloadSchema),
372
+ ],
373
+ },
374
+ {
375
+ matcher: "/store/affiliates/me",
376
+ methods: ["GET"],
377
+ middlewares: [
378
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
379
+ (0, http_1.validateAndTransformQuery)(validators_1.PartnerPortalEmptyQuerySchema, {
380
+ isList: false,
381
+ }),
382
+ ],
383
+ },
384
+ {
385
+ matcher: "/store/affiliates/me",
386
+ methods: ["POST"],
387
+ middlewares: [
388
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
389
+ (0, http_1.validateAndTransformBody)(validators_1.UpdatePartnerPortalProfileSchema),
390
+ ],
391
+ },
392
+ {
393
+ matcher: "/store/affiliates/me/slugs",
394
+ methods: ["GET"],
395
+ middlewares: [
396
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
397
+ (0, http_1.validateAndTransformQuery)(validators_1.PartnerPortalEmptyQuerySchema, {
398
+ isList: false,
399
+ }),
400
+ ],
401
+ },
402
+ {
403
+ matcher: "/store/affiliates/me/slugs",
404
+ methods: ["POST"],
405
+ middlewares: [
406
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
407
+ (0, http_1.validateAndTransformBody)(validators_1.CreatePartnerPortalSlugSchema),
408
+ ],
409
+ },
410
+ {
411
+ matcher: "/store/affiliates/me/slugs/:slug_id",
412
+ methods: ["POST"],
413
+ middlewares: [
414
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
415
+ (0, http_1.validateAndTransformBody)(validators_1.UpdatePartnerPortalSlugSchema),
416
+ ],
417
+ },
418
+ {
419
+ matcher: "/store/affiliates/me/coupon-codes",
420
+ methods: ["GET"],
421
+ middlewares: [
422
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
423
+ (0, http_1.validateAndTransformQuery)(validators_1.ListStoreAffiliateCouponCodesQuerySchema, {
424
+ isList: true,
425
+ }),
426
+ ],
427
+ },
428
+ {
429
+ matcher: "/store/affiliates/me/coupon-codes",
430
+ methods: ["POST"],
431
+ middlewares: [
432
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
433
+ (0, http_1.validateAndTransformBody)(validators_1.CreateStoreAffiliateCouponCodeSchema),
434
+ ],
435
+ },
436
+ {
437
+ matcher: "/store/affiliates/me/coupon-codes/:coupon_id/rotate",
438
+ methods: ["POST"],
439
+ middlewares: [
440
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
441
+ (0, http_1.validateAndTransformBody)(validators_1.RotateStoreAffiliateCouponCodeSchema),
442
+ ],
443
+ },
444
+ {
445
+ matcher: "/store/affiliates/me/coupon-codes/:coupon_id/revoke",
446
+ methods: ["POST"],
447
+ middlewares: [(0, http_1.authenticate)("customer", ["session", "bearer"])],
448
+ },
449
+ {
450
+ matcher: "/store/affiliates/me/dashboard",
451
+ methods: ["GET"],
452
+ middlewares: [
453
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
454
+ (0, http_1.validateAndTransformQuery)(validators_1.PartnerPortalDateRangeQuerySchema, {
455
+ isList: false,
456
+ }),
457
+ ],
458
+ },
459
+ {
460
+ matcher: "/store/affiliates/me/commissions",
461
+ methods: ["GET"],
462
+ middlewares: [
463
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
464
+ (0, http_1.validateAndTransformQuery)(validators_1.PartnerPortalCommissionsQuerySchema, {
465
+ isList: false,
466
+ }),
467
+ ],
468
+ },
469
+ {
470
+ matcher: "/store/affiliates/register",
471
+ methods: ["POST"],
472
+ middlewares: [
473
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
474
+ (0, http_1.validateAndTransformBody)(validators_1.SubmitAffiliateApplicationSchema),
475
+ ],
476
+ },
477
+ {
478
+ matcher: "/store/affiliates/resolve-referral",
479
+ methods: ["GET"],
480
+ middlewares: [
481
+ (0, http_1.validateAndTransformQuery)(validators_1.ResolveReferralQuerySchema, {
482
+ isList: false,
483
+ }),
484
+ ],
485
+ },
486
+ {
487
+ matcher: "/store/affiliates/own-order-discount",
488
+ methods: ["GET"],
489
+ middlewares: [
490
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
491
+ (0, http_1.validateAndTransformQuery)(validators_1.OwnOrderDiscountQuerySchema, {
492
+ isList: false,
493
+ }),
494
+ ],
495
+ },
496
+ {
497
+ matcher: "/store/affiliates/own-order-promotion",
498
+ methods: ["POST"],
499
+ middlewares: [
500
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
501
+ (0, http_1.validateAndTransformBody)(validators_1.ApplyOwnOrderPromotionSchema),
502
+ ],
503
+ },
504
+ {
505
+ matcher: "/store/affiliates/consignment-inventory",
506
+ methods: ["GET"],
507
+ middlewares: [(0, http_1.authenticate)("customer", ["session", "bearer"])],
508
+ },
509
+ {
510
+ matcher: "/store/affiliates/consignment-reports",
511
+ methods: ["GET"],
512
+ middlewares: [(0, http_1.authenticate)("customer", ["session", "bearer"])],
513
+ },
514
+ {
515
+ matcher: "/store/affiliates/consignment-reports",
516
+ methods: ["POST"],
517
+ middlewares: [
518
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
519
+ (0, http_1.validateAndTransformBody)(validators_1.SubmitConsignmentReportSchema),
520
+ ],
521
+ },
522
+ {
523
+ matcher: "/store/affiliates/consignment-reports/:id/submit",
524
+ methods: ["POST"],
525
+ middlewares: [
526
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
527
+ enforceConsignmentReportOwnership,
528
+ (0, http_1.validateAndTransformBody)(validators_1.SubmitExistingConsignmentReportSchema),
529
+ ],
530
+ },
531
+ {
532
+ matcher: "/admin/affiliate-applications",
533
+ methods: ["GET"],
534
+ middlewares: [
535
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
536
+ (0, http_1.validateAndTransformQuery)(validators_1.ListAffiliateApplicationsQuerySchema, {
537
+ isList: true,
538
+ }),
539
+ ],
540
+ },
541
+ {
542
+ matcher: "/admin/affiliate-applications/:id/approve",
543
+ methods: ["POST"],
544
+ middlewares: [
545
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
546
+ (0, http_1.validateAndTransformBody)(validators_1.ApproveAffiliateApplicationSchema),
547
+ ],
548
+ },
549
+ {
550
+ matcher: "/admin/affiliate-applications/:id/reject",
551
+ methods: ["POST"],
552
+ middlewares: [
553
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
554
+ (0, http_1.validateAndTransformBody)(validators_1.RejectAffiliateApplicationSchema),
555
+ ],
556
+ },
557
+ {
558
+ matcher: "/admin/affiliates",
559
+ methods: ["GET"],
560
+ middlewares: [
561
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
562
+ (0, http_1.validateAndTransformQuery)(validators_1.ListAffiliatesQuerySchema, {
563
+ isList: true,
564
+ }),
565
+ ],
566
+ },
567
+ {
568
+ matcher: "/admin/affiliates",
569
+ methods: ["POST"],
570
+ middlewares: [
571
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
572
+ (0, http_1.validateAndTransformBody)(validators_1.CreateAffiliateSchema),
573
+ ],
574
+ },
575
+ {
576
+ matcher: "/admin/affiliates/:id",
577
+ methods: ["GET"],
578
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
579
+ },
580
+ {
581
+ matcher: "/admin/affiliates/:id",
582
+ methods: ["POST"],
583
+ middlewares: [
584
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
585
+ (0, http_1.validateAndTransformBody)(validators_1.UpdateAffiliateSchema),
586
+ ],
587
+ },
588
+ {
589
+ matcher: "/admin/affiliates/:id/inactive",
590
+ methods: ["POST"],
591
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
592
+ },
593
+ {
594
+ matcher: "/admin/affiliates/:id/slugs",
595
+ methods: ["GET"],
596
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
597
+ },
598
+ {
599
+ matcher: "/admin/affiliates/:id/slugs",
600
+ methods: ["POST"],
601
+ middlewares: [
602
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
603
+ (0, http_1.validateAndTransformBody)(validators_1.CreateAffiliateSlugSchema),
604
+ ],
605
+ },
606
+ {
607
+ matcher: "/admin/affiliates/:id/slugs/:slug_id",
608
+ methods: ["POST"],
609
+ middlewares: [
610
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
611
+ (0, http_1.validateAndTransformBody)(validators_1.UpdateAffiliateSlugSchema),
612
+ ],
613
+ },
614
+ {
615
+ matcher: "/admin/affiliates/:id/coupon-codes",
616
+ methods: ["GET"],
617
+ middlewares: [
618
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
619
+ (0, http_1.validateAndTransformQuery)(validators_1.ListAdminAffiliateCouponCodesQuerySchema, {
620
+ isList: true,
621
+ }),
622
+ ],
623
+ },
624
+ {
625
+ matcher: "/admin/affiliates/:id/coupon-codes",
626
+ methods: ["POST"],
627
+ middlewares: [
628
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
629
+ (0, http_1.validateAndTransformBody)(validators_1.CreateAdminAffiliateCouponCodeSchema),
630
+ ],
631
+ },
632
+ {
633
+ matcher: "/admin/affiliates/:id/coupon-codes/:coupon_id/rotate",
634
+ methods: ["POST"],
635
+ middlewares: [
636
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
637
+ (0, http_1.validateAndTransformBody)(validators_1.RotateAdminAffiliateCouponCodeSchema),
638
+ ],
639
+ },
640
+ {
641
+ matcher: "/admin/affiliates/:id/coupon-codes/:coupon_id/revoke",
642
+ methods: ["POST"],
643
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
644
+ },
645
+ {
646
+ matcher: "/admin/affiliates/:id/coupon-codes/:coupon_id/reconcile",
647
+ methods: ["POST"],
648
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
649
+ },
650
+ {
651
+ matcher: "/admin/affiliates/:id/distribution",
652
+ methods: ["GET"],
653
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
654
+ },
655
+ {
656
+ matcher: "/admin/affiliates/:id/distribution",
657
+ methods: ["POST"],
658
+ middlewares: [
659
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
660
+ (0, http_1.validateAndTransformBody)(validators_1.EnableAffiliateDistributionSchema),
661
+ ],
662
+ },
663
+ {
664
+ matcher: "/admin/affiliates/:id/consignment-transfers",
665
+ methods: ["POST"],
666
+ middlewares: [
667
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
668
+ (0, http_1.validateAndTransformBody)(validators_1.TransferConsignmentStockSchema),
669
+ ],
670
+ },
671
+ {
672
+ matcher: "/admin/affiliates/:id/consignment-reminders",
673
+ methods: ["POST"],
674
+ middlewares: [
675
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
676
+ (0, http_1.validateAndTransformBody)(validators_1.RequestConsignmentReminderSchema),
677
+ ],
678
+ },
679
+ {
680
+ matcher: "/admin/consignment-reports/:id/approve",
681
+ methods: ["POST"],
682
+ middlewares: [
683
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
684
+ (0, http_1.validateAndTransformBody)(validators_1.ApproveConsignmentReportSchema),
685
+ ],
686
+ },
687
+ {
688
+ matcher: "/admin/consignment-reports",
689
+ methods: ["GET"],
690
+ middlewares: [
691
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
692
+ (0, http_1.validateAndTransformQuery)(validators_1.ListConsignmentReportsQuerySchema, {
693
+ isList: true,
694
+ }),
695
+ ],
696
+ },
697
+ {
698
+ matcher: "/admin/consignment-reports/:id",
699
+ methods: ["GET"],
700
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
701
+ },
702
+ {
703
+ matcher: "/admin/affiliate-distribution-reports",
704
+ methods: ["GET"],
705
+ middlewares: [
706
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
707
+ (0, http_1.validateAndTransformQuery)(validators_1.AffiliateDistributionReportQuerySchema, {
708
+ isList: false,
709
+ }),
710
+ ],
711
+ },
712
+ {
713
+ matcher: "/admin/affiliate-program-settings",
714
+ methods: ["GET"],
715
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
716
+ },
717
+ {
718
+ matcher: "/admin/affiliate-program-settings",
719
+ methods: ["POST"],
720
+ middlewares: [
721
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
722
+ (0, http_1.validateAndTransformBody)(validators_1.UpdateAffiliateProgramSettingsSchema),
723
+ ],
724
+ },
725
+ {
726
+ matcher: "/admin/consignment-reports/:id/reject",
727
+ methods: ["POST"],
728
+ middlewares: [
729
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
730
+ (0, http_1.validateAndTransformBody)(validators_1.RejectConsignmentReportSchema),
731
+ ],
732
+ },
733
+ {
734
+ matcher: "/admin/consignment-reports/:id/correct",
735
+ methods: ["POST"],
736
+ middlewares: [
737
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
738
+ (0, http_1.validateAndTransformBody)(validators_1.CorrectConsignmentReportSchema),
739
+ ],
740
+ },
741
+ {
742
+ matcher: "/admin/orders/:id/cancel",
743
+ methods: ["POST"],
744
+ middlewares: [preventConsignmentOrderCancellation],
745
+ },
746
+ {
747
+ matcher: "/admin/orders/:id/affiliate-attribution",
748
+ methods: ["GET"],
749
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
750
+ },
751
+ {
752
+ matcher: "/admin/customers/:id/affiliate",
753
+ methods: ["POST"],
754
+ middlewares: [
755
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
756
+ (0, http_1.validateAndTransformBody)(validators_1.SetCustomerAffiliateAssignmentSchema),
757
+ ],
758
+ },
759
+ {
760
+ matcher: "/admin/customers/:id/affiliate",
761
+ methods: ["GET", "DELETE"],
762
+ middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
763
+ },
764
+ {
765
+ matcher: "/admin/affiliate-reports",
766
+ methods: ["GET"],
767
+ middlewares: [
768
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
769
+ (0, http_1.validateAndTransformQuery)(validators_1.ReportDateRangeQuerySchema, {
770
+ isList: false,
771
+ }),
772
+ ],
773
+ },
774
+ {
775
+ matcher: "/admin/affiliate-reports/:id",
776
+ methods: ["GET"],
777
+ middlewares: [
778
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
779
+ (0, http_1.validateAndTransformQuery)(validators_1.ReportDetailQuerySchema, {
780
+ isList: false,
781
+ }),
782
+ ],
783
+ },
784
+ ],
785
+ });
786
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUFzQztBQUN0QyxtREFLaUM7QUFPakMscURBSWtDO0FBRWxDLGtGQUkyQztBQUMzQyxnRUFBbUU7QUFDbkUsOERBQTZEO0FBQzdELDZDQTBDcUI7QUFDckIsMkVBR29DO0FBQ3BDLHlGQUF5RjtBQUN6RiwwRkFNK0M7QUFDL0Msd0ZBQThGO0FBQzlGLGdIQUE4RztBQUM5RyxrR0FBbUc7QUFFbkcsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsR0FBa0IsRUFDbEIsSUFBWSxFQUNaLE9BQWUsRUFDZixLQUFjLEVBQ1IsRUFBRTtJQUNSLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUU7UUFDN0IsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFO1FBQ2QsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUU7S0FDbkUsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxDQUFDO1FBQ0gsR0FBRyxDQUFDLEtBQUs7YUFDTixPQUFPLENBQ04saUNBQXlCLENBQUMsTUFBTSxDQUNqQzthQUNBLElBQUksQ0FDSCxHQUFHLE9BQU8sVUFBVSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFDL0IsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFDM0MsRUFBRSxDQUNILENBQUE7SUFDTCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asd0VBQXdFO0lBQzFFLENBQUM7QUFDSCxDQUFDLENBQUE7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFN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