@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.
- package/.medusa/server/src/admin/index.js +3739 -0
- package/.medusa/server/src/admin/index.mjs +3738 -0
- package/.medusa/server/src/api/admin/affiliate-applications/[id]/approve/route.js +28 -0
- package/.medusa/server/src/api/admin/affiliate-applications/[id]/reject/route.js +19 -0
- package/.medusa/server/src/api/admin/affiliate-applications/route.js +23 -0
- package/.medusa/server/src/api/admin/affiliate-distribution-reports/query.js +171 -0
- package/.medusa/server/src/api/admin/affiliate-distribution-reports/route.js +13 -0
- package/.medusa/server/src/api/admin/affiliate-program-settings/route.js +27 -0
- package/.medusa/server/src/api/admin/affiliate-reports/[id]/route.js +45 -0
- package/.medusa/server/src/api/admin/affiliate-reports/route.js +27 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/consignment-reminders/route.js +31 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/consignment-transfers/route.js +41 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/reconcile/route.js +34 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/revoke/route.js +36 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/[coupon_id]/rotate/route.js +40 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/coupon-codes/route.js +56 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/distribution/route.js +45 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/inactive/route.js +20 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/route.js +50 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/slugs/[slug_id]/route.js +19 -0
- package/.medusa/server/src/api/admin/affiliates/[id]/slugs/route.js +26 -0
- package/.medusa/server/src/api/admin/affiliates/route.js +43 -0
- package/.medusa/server/src/api/admin/consignment-report-response.js +36 -0
- package/.medusa/server/src/api/admin/consignment-reports/[id]/approve/route.js +25 -0
- package/.medusa/server/src/api/admin/consignment-reports/[id]/correct/route.js +18 -0
- package/.medusa/server/src/api/admin/consignment-reports/[id]/reject/route.js +15 -0
- package/.medusa/server/src/api/admin/consignment-reports/[id]/route.js +11 -0
- package/.medusa/server/src/api/admin/consignment-reports/route.js +27 -0
- package/.medusa/server/src/api/admin/customers/[id]/affiliate/route.js +50 -0
- package/.medusa/server/src/api/admin/orders/[id]/affiliate-attribution/route.js +30 -0
- package/.medusa/server/src/api/affiliate-coupon-http.js +152 -0
- package/.medusa/server/src/api/affiliate-referral-cookie.js +34 -0
- package/.medusa/server/src/api/affiliate-self-service-http.js +37 -0
- package/.medusa/server/src/api/middlewares.js +786 -0
- package/.medusa/server/src/api/store/affiliate-referrals/apply-coupon/route.js +47 -0
- package/.medusa/server/src/api/store/affiliate-referrals/capture/route.js +76 -0
- package/.medusa/server/src/api/store/affiliate-referrals/carts/[cart_id]/route.js +20 -0
- package/.medusa/server/src/api/store/affiliates/consignment-inventory/route.js +53 -0
- package/.medusa/server/src/api/store/affiliates/consignment-report-response.js +31 -0
- package/.medusa/server/src/api/store/affiliates/consignment-reports/[id]/submit/route.js +40 -0
- package/.medusa/server/src/api/store/affiliates/consignment-reports/route.js +43 -0
- package/.medusa/server/src/api/store/affiliates/coupon-labels/route.js +14 -0
- package/.medusa/server/src/api/store/affiliates/me/commissions/route.js +35 -0
- package/.medusa/server/src/api/store/affiliates/me/coupon-codes/[coupon_id]/revoke/route.js +36 -0
- package/.medusa/server/src/api/store/affiliates/me/coupon-codes/[coupon_id]/rotate/route.js +40 -0
- package/.medusa/server/src/api/store/affiliates/me/coupon-codes/route.js +55 -0
- package/.medusa/server/src/api/store/affiliates/me/dashboard/route.js +15 -0
- package/.medusa/server/src/api/store/affiliates/me/route.js +85 -0
- package/.medusa/server/src/api/store/affiliates/me/slugs/[slug_id]/route.js +29 -0
- package/.medusa/server/src/api/store/affiliates/me/slugs/route.js +34 -0
- package/.medusa/server/src/api/store/affiliates/own-order-discount/route.js +22 -0
- package/.medusa/server/src/api/store/affiliates/own-order-promotion/route.js +30 -0
- package/.medusa/server/src/api/store/affiliates/register/route.js +27 -0
- package/.medusa/server/src/api/store/affiliates/resolve-referral/route.js +34 -0
- package/.medusa/server/src/api/validators.js +52 -0
- package/.medusa/server/src/api/wire-response.js +10 -0
- package/.medusa/server/src/integration/email-events.js +51 -0
- package/.medusa/server/src/integrations/inventory-transfer/batch-management-transfer-adapter.js +36 -0
- package/.medusa/server/src/integrations/inventory-transfer/native-inventory-transfer-adapter.js +30 -0
- package/.medusa/server/src/integrations/inventory-transfer/resolve-inventory-transfer-adapter.js +46 -0
- package/.medusa/server/src/integrations/inventory-transfer/types.js +3 -0
- package/.medusa/server/src/jobs/affiliate-attribution-expiry.js +20 -0
- package/.medusa/server/src/jobs/affiliate-consignment-report-reminders.js +15 -0
- package/.medusa/server/src/jobs/affiliate-promotion-freshness.js +24 -0
- package/.medusa/server/src/lib/query-string.js +15 -0
- package/.medusa/server/src/modules/affiliate/domain/affiliate-attribution-policy.js +81 -0
- package/.medusa/server/src/modules/affiliate/domain/affiliate-coupon-policy.js +61 -0
- package/.medusa/server/src/modules/affiliate/domain/commission-policy.js +33 -0
- package/.medusa/server/src/modules/affiliate/domain/consignment-reminder-rules.js +74 -0
- package/.medusa/server/src/modules/affiliate/domain/email-normalization.js +20 -0
- package/.medusa/server/src/modules/affiliate/domain/own-order-coupon-code.js +37 -0
- package/.medusa/server/src/modules/affiliate/domain/plugin-options.js +40 -0
- package/.medusa/server/src/modules/affiliate/index.js +13 -0
- package/.medusa/server/src/modules/affiliate/migrations/Migration20260827085154.js +423 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-application.js +38 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-cart-referral.js +65 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-code-redemption.js +41 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-coupon.js +55 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-distribution-settings.js +22 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-order-attribution.js +49 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-program-settings.js +28 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-referral-session.js +34 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate-slug.js +27 -0
- package/.medusa/server/src/modules/affiliate/models/affiliate.js +49 -0
- package/.medusa/server/src/modules/affiliate/models/commission-entry.js +62 -0
- package/.medusa/server/src/modules/affiliate/models/consignment-report-line.js +21 -0
- package/.medusa/server/src/modules/affiliate/models/consignment-report.js +31 -0
- package/.medusa/server/src/modules/affiliate/models/consignment-transfer-line.js +16 -0
- package/.medusa/server/src/modules/affiliate/models/consignment-transfer.js +20 -0
- package/.medusa/server/src/modules/affiliate/models/customer-affiliate-assignment.js +58 -0
- package/.medusa/server/src/modules/affiliate/service.js +2321 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-application-manager.js +171 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-coupon-manager.js +441 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-discount.service.js +55 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-manager.js +242 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-partner-portal.service.js +138 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-report.service.js +436 -0
- package/.medusa/server/src/modules/affiliate/services/affiliate-slug-manager.js +163 -0
- package/.medusa/server/src/modules/affiliate/services/commission-ledger.service.js +729 -0
- package/.medusa/server/src/modules/affiliate/services/customer-affiliate-assignment-manager.js +350 -0
- package/.medusa/server/src/modules/affiliate/services/order-attribution-manager.js +1051 -0
- package/.medusa/server/src/modules/affiliate/services/referral-lifecycle-manager.js +1420 -0
- package/.medusa/server/src/modules/affiliate/services/utils.js +49 -0
- package/.medusa/server/src/modules/affiliate/types/internal.js +3 -0
- package/.medusa/server/src/paths/affiliate.js +7 -0
- package/.medusa/server/src/paths/index.js +18 -0
- package/.medusa/server/src/schemas/index.js +18 -0
- package/.medusa/server/src/schemas/store.js +24 -0
- package/.medusa/server/src/subscribers/affiliate-cart-updated.js +92 -0
- package/.medusa/server/src/subscribers/affiliate-order-canceled.js +70 -0
- package/.medusa/server/src/subscribers/affiliate-order-placed.js +63 -0
- package/.medusa/server/src/subscribers/affiliate-order-return-received.js +67 -0
- package/.medusa/server/src/subscribers/affiliate-product-eligibility-updated.js +87 -0
- package/.medusa/server/src/types/admin-api.js +3 -0
- package/.medusa/server/src/types/enums.js +53 -0
- package/.medusa/server/src/types/index.js +32 -0
- package/.medusa/server/src/types/public.js +3 -0
- package/.medusa/server/src/types/store-api.js +3 -0
- package/.medusa/server/src/utils/affiliate-cart-operation-lock.js +316 -0
- package/.medusa/server/src/utils/affiliate-promotion-mutation-authorization.js +49 -0
- package/.medusa/server/src/utils/cart-promotions.js +9 -0
- package/.medusa/server/src/utils/money.js +79 -0
- package/.medusa/server/src/utils/promotion-code-availability.js +34 -0
- package/.medusa/server/src/utils/registered-email-checkout.js +101 -0
- package/.medusa/server/src/utils/resolve-services.js +7 -0
- package/.medusa/server/src/utils/settle-cart-promotions.js +44 -0
- package/.medusa/server/src/workflows/affiliate/affiliate-coupon-cart.js +215 -0
- package/.medusa/server/src/workflows/affiliate/affiliate-coupon-command-authorization.js +20 -0
- package/.medusa/server/src/workflows/affiliate/apply-affiliate-coupon.js +174 -0
- package/.medusa/server/src/workflows/affiliate/apply-own-order-promotion.js +89 -0
- package/.medusa/server/src/workflows/affiliate/approve-consignment-report.js +186 -0
- package/.medusa/server/src/workflows/affiliate/correct-approved-consignment-report.js +263 -0
- package/.medusa/server/src/workflows/affiliate/create-affiliate-coupon.js +35 -0
- package/.medusa/server/src/workflows/affiliate/create-commission-correction-for-cancellation.js +21 -0
- package/.medusa/server/src/workflows/affiliate/create-commission-correction-for-refund.js +24 -0
- package/.medusa/server/src/workflows/affiliate/create-commission-for-order.js +17 -0
- package/.medusa/server/src/workflows/affiliate/deactivate-affiliate.js +89 -0
- package/.medusa/server/src/workflows/affiliate/enable-distribution.js +120 -0
- package/.medusa/server/src/workflows/affiliate/enrich-affiliate-report.js +75 -0
- package/.medusa/server/src/workflows/affiliate/ensure-affiliate-coupon-promotion.js +410 -0
- package/.medusa/server/src/workflows/affiliate/ensure-affiliate-own-order-promotion.js +240 -0
- package/.medusa/server/src/workflows/affiliate/ensure-default-affiliate-coupon.js +32 -0
- package/.medusa/server/src/workflows/affiliate/expire-affiliate-attribution-state.js +131 -0
- package/.medusa/server/src/workflows/affiliate/finalize-affiliate-order-attribution.js +82 -0
- package/.medusa/server/src/workflows/affiliate/payment-authorization.js +33 -0
- package/.medusa/server/src/workflows/affiliate/promotion-eligibility.js +179 -0
- package/.medusa/server/src/workflows/affiliate/reconcile-affiliate-cart-referral.js +219 -0
- package/.medusa/server/src/workflows/affiliate/reconcile-affiliate-coupon.js +388 -0
- package/.medusa/server/src/workflows/affiliate/refresh-affiliate-promotions.js +114 -0
- package/.medusa/server/src/workflows/affiliate/resolve-coupon-labels.js +40 -0
- package/.medusa/server/src/workflows/affiliate/revoke-affiliate-coupon.js +29 -0
- package/.medusa/server/src/workflows/affiliate/rotate-affiliate-coupon.js +36 -0
- package/.medusa/server/src/workflows/affiliate/run-consignment-report-reminders.js +58 -0
- package/.medusa/server/src/workflows/affiliate/submit-consignment-report.js +279 -0
- package/.medusa/server/src/workflows/affiliate/transfer-batch-aware-inventory.js +172 -0
- package/.medusa/server/src/workflows/affiliate/transfer-consignment-stock.js +106 -0
- package/.medusa/server/src/workflows/affiliate/update-affiliate-coupon-discounts.js +129 -0
- package/.medusa/server/src/workflows/affiliate/utils.js +118 -0
- package/.medusa/server/src/workflows/hooks/complete-cart-affiliate-attribution.js +57 -0
- package/.medusa/server/src/workflows/hooks/complete-cart-order-created-composition.js +111 -0
- package/.medusa/server/src/workflows/hooks/complete-cart-own-order-discount.js +75 -0
- package/.medusa/server/src/workflows/hooks/enforce-unique-promotion-codes.js +33 -0
- package/.medusa/server/src/workflows/hooks/validate-affiliate-customer-code.js +239 -0
- package/.medusa/server/src/workflows/hooks/validate-complete-cart-affiliate-referral.js +137 -0
- package/LICENSE +21 -0
- package/README.md +799 -0
- package/dist/integration/email-events.d.ts +20 -0
- package/dist/integration/email-events.js +50 -0
- 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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
|