@hszrdm/core 1.4.0 → 1.6.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 +6361 -3789
- package/.medusa/server/src/admin/index.mjs +6361 -3789
- package/.medusa/server/src/api/admin/back-in-stock/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/back-in-stock/route.js +70 -0
- package/.medusa/server/src/api/admin/core-carts/[id]/items/[itemId]/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/core-carts/[id]/items/[itemId]/route.js +64 -0
- package/.medusa/server/src/api/admin/core-carts/[id]/items/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/core-carts/[id]/items/route.js +40 -0
- package/.medusa/server/src/api/admin/core-carts/[id]/promotions/[code]/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/core-carts/[id]/promotions/[code]/route.js +40 -0
- package/.medusa/server/src/api/admin/core-carts/[id]/promotions/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/core-carts/[id]/promotions/route.js +41 -0
- package/.medusa/server/src/api/admin/core-carts/[id]/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/core-carts/[id]/route.js +28 -0
- package/.medusa/server/src/api/admin/core-carts/customer/[id]/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/core-carts/customer/[id]/route.js +34 -0
- package/.medusa/server/src/api/admin/core-carts/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/core-carts/route.js +69 -0
- package/.medusa/server/src/api/admin/customer-activation/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/customer-activation/route.js +97 -0
- package/.medusa/server/src/api/admin/customer-import/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/customer-import/route.js +166 -0
- package/.medusa/server/src/api/admin/order-export/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/order-export/route.js +88 -0
- package/.medusa/server/src/api/admin/product-migration/inventory/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/product-migration/inventory/route.js +164 -0
- package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.js +204 -0
- package/.medusa/server/src/api/admin/product-migration/products/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/product-migration/products/route.js +24 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/route.js +36 -4
- package/.medusa/server/src/api/admin/product-reviews/settings/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/product-reviews/settings/route.js +63 -0
- package/.medusa/server/src/api/admin/shared-cart/settings/route.d.ts +5 -0
- package/.medusa/server/src/api/admin/shared-cart/settings/route.js +31 -0
- package/.medusa/server/src/api/admin/system-runtime/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/system-runtime/route.js +18 -0
- package/.medusa/server/src/api/hooks/packeta/status/route.d.ts +2 -0
- package/.medusa/server/src/api/hooks/packeta/status/route.js +55 -0
- package/.medusa/server/src/api/middlewares.js +24 -1
- package/.medusa/server/src/api/store/abandoned-cart/recover/route.d.ts +2 -0
- package/.medusa/server/src/api/store/abandoned-cart/recover/route.js +37 -0
- package/.medusa/server/src/api/store/back-in-stock/route.d.ts +8 -0
- package/.medusa/server/src/api/store/back-in-stock/route.js +124 -0
- package/.medusa/server/src/api/store/core-carts/me/active/route.d.ts +2 -0
- package/.medusa/server/src/api/store/core-carts/me/active/route.js +54 -0
- package/.medusa/server/src/api/store/customer-activation/complete/route.d.ts +2 -0
- package/.medusa/server/src/api/store/customer-activation/complete/route.js +96 -0
- package/.medusa/server/src/api/store/customer-activation/route.d.ts +2 -0
- package/.medusa/server/src/api/store/customer-activation/route.js +34 -0
- package/.medusa/server/src/api/store/products/[id]/reviews/route.d.ts +1 -0
- package/.medusa/server/src/api/store/products/[id]/reviews/route.js +76 -34
- package/.medusa/server/src/api/store/review-request/route.d.ts +2 -0
- package/.medusa/server/src/api/store/review-request/route.js +60 -0
- package/.medusa/server/src/api/store/shared-carts/[token]/route.d.ts +2 -0
- package/.medusa/server/src/api/store/shared-carts/[token]/route.js +52 -0
- package/.medusa/server/src/api/store/shared-carts/route.d.ts +13 -0
- package/.medusa/server/src/api/store/shared-carts/route.js +78 -0
- package/.medusa/server/src/core/abandoned-cart.d.ts +64 -0
- package/.medusa/server/src/core/abandoned-cart.js +197 -0
- package/.medusa/server/src/core/admin-cart-management.d.ts +18 -0
- package/.medusa/server/src/core/admin-cart-management.js +102 -0
- package/.medusa/server/src/core/admin-cart-visibility.d.ts +94 -0
- package/.medusa/server/src/core/admin-cart-visibility.js +192 -0
- package/.medusa/server/src/core/back-in-stock.d.ts +51 -0
- package/.medusa/server/src/core/back-in-stock.js +107 -0
- package/.medusa/server/src/core/cart-observability.d.ts +23 -0
- package/.medusa/server/src/core/cart-observability.js +54 -0
- package/.medusa/server/src/core/checkout-contract.d.ts +1 -0
- package/.medusa/server/src/core/checkout-contract.js +2 -1
- package/.medusa/server/src/core/customer-account-contract.d.ts +3 -0
- package/.medusa/server/src/core/customer-account-contract.js +4 -1
- package/.medusa/server/src/core/customer-activation.d.ts +120 -0
- package/.medusa/server/src/core/customer-activation.js +169 -0
- package/.medusa/server/src/core/customer-cart-resume.d.ts +21 -0
- package/.medusa/server/src/core/customer-cart-resume.js +72 -0
- package/.medusa/server/src/core/customer-email.d.ts +1 -1
- package/.medusa/server/src/core/customer-email.js +4 -1
- package/.medusa/server/src/core/native-migration-export.d.ts +6 -0
- package/.medusa/server/src/core/native-migration-export.js +105 -0
- package/.medusa/server/src/core/order-export.d.ts +11 -0
- package/.medusa/server/src/core/order-export.js +297 -0
- package/.medusa/server/src/core/review-request.d.ts +61 -0
- package/.medusa/server/src/core/review-request.js +105 -0
- package/.medusa/server/src/core/review-reward.d.ts +94 -0
- package/.medusa/server/src/core/review-reward.js +124 -0
- package/.medusa/server/src/core/runtime-health.d.ts +39 -0
- package/.medusa/server/src/core/runtime-health.js +250 -0
- package/.medusa/server/src/core/storefront-core-config.d.ts +10 -0
- package/.medusa/server/src/core/storefront-core-config.js +26 -1
- package/.medusa/server/src/core/version.d.ts +2 -2
- package/.medusa/server/src/core/version.js +2 -2
- package/.medusa/server/src/jobs/abandoned-cart-recovery.d.ts +23 -0
- package/.medusa/server/src/jobs/abandoned-cart-recovery.js +137 -0
- package/.medusa/server/src/jobs/back-in-stock-reconciliation.d.ts +15 -0
- package/.medusa/server/src/jobs/back-in-stock-reconciliation.js +90 -0
- package/.medusa/server/src/jobs/dpd-statusdata-sync.d.ts +17 -0
- package/.medusa/server/src/jobs/dpd-statusdata-sync.js +107 -0
- package/.medusa/server/src/jobs/mpl-push-tracking.d.ts +19 -0
- package/.medusa/server/src/jobs/mpl-push-tracking.js +183 -0
- package/.medusa/server/src/jobs/mpl-status-sync.d.ts +8 -2
- package/.medusa/server/src/jobs/mpl-status-sync.js +12 -7
- package/.medusa/server/src/jobs/product-review-request-dispatch.d.ts +28 -0
- package/.medusa/server/src/jobs/product-review-request-dispatch.js +84 -0
- package/.medusa/server/src/jobs/runtime-heartbeat.d.ts +12 -0
- package/.medusa/server/src/jobs/runtime-heartbeat.js +13 -0
- package/.medusa/server/src/jobs/shipping-status-sync.d.ts +8 -2
- package/.medusa/server/src/jobs/shipping-status-sync.js +11 -14
- package/.medusa/server/src/lib/modules/shipping/idempotency.js +3 -3
- package/.medusa/server/src/lib/modules/shipping/index.d.ts +1 -0
- package/.medusa/server/src/lib/modules/shipping/index.js +2 -1
- package/.medusa/server/src/lib/modules/shipping/tracking.d.ts +48 -0
- package/.medusa/server/src/lib/modules/shipping/tracking.js +368 -0
- package/.medusa/server/src/lib/modules/shipping/webhooks.d.ts +6 -9
- package/.medusa/server/src/lib/modules/shipping/webhooks.js +24 -137
- package/.medusa/server/src/modules/back-in-stock/index.d.ts +23 -0
- package/.medusa/server/src/modules/back-in-stock/index.js +16 -0
- package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.d.ts +5 -0
- package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.js +18 -0
- package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.d.ts +13 -0
- package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.js +23 -0
- package/.medusa/server/src/modules/back-in-stock/service.d.ts +22 -0
- package/.medusa/server/src/modules/back-in-stock/service.js +12 -0
- package/.medusa/server/src/modules/email-center/abandoned-cart-registration.d.ts +1 -0
- package/.medusa/server/src/modules/email-center/abandoned-cart-registration.js +27 -0
- package/.medusa/server/src/modules/email-center/back-in-stock-registration.d.ts +1 -0
- package/.medusa/server/src/modules/email-center/back-in-stock-registration.js +27 -0
- package/.medusa/server/src/modules/email-center/defaults.js +7 -1
- package/.medusa/server/src/modules/email-center/index.d.ts +2 -0
- package/.medusa/server/src/modules/email-center/index.js +3 -1
- package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.d.ts +1 -0
- package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.js +30 -0
- package/.medusa/server/src/modules/integration-settings/index.d.ts +1 -0
- package/.medusa/server/src/modules/integration-settings/index.js +2 -1
- package/.medusa/server/src/modules/integration-settings/storefront-public-registration.js +15 -1
- package/.medusa/server/src/modules/product-review/index.d.ts +14 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.js +28 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.js +20 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.js +18 -0
- package/.medusa/server/src/modules/product-review/models/product-review-settings.d.ts +15 -0
- package/.medusa/server/src/modules/product-review/models/product-review-settings.js +19 -0
- package/.medusa/server/src/modules/product-review/models/product-review.d.ts +6 -2
- package/.medusa/server/src/modules/product-review/models/product-review.js +7 -3
- package/.medusa/server/src/modules/product-review/service.d.ts +22 -1
- package/.medusa/server/src/modules/product-review/service.js +3 -2
- package/.medusa/server/src/modules/shared-cart/index.d.ts +21 -0
- package/.medusa/server/src/modules/shared-cart/index.js +13 -0
- package/.medusa/server/src/modules/shared-cart/migrations/Migration20261102010000.d.ts +5 -0
- package/.medusa/server/src/modules/shared-cart/migrations/Migration20261102010000.js +16 -0
- package/.medusa/server/src/modules/shared-cart/models/shared-cart.d.ts +10 -0
- package/.medusa/server/src/modules/shared-cart/models/shared-cart.js +17 -0
- package/.medusa/server/src/modules/shared-cart/service.d.ts +14 -0
- package/.medusa/server/src/modules/shared-cart/service.js +11 -0
- package/.medusa/server/src/modules/shared-cart/settings.d.ts +7 -0
- package/.medusa/server/src/modules/shared-cart/settings.js +64 -0
- package/.medusa/server/src/providers/dpd/index.d.ts +2 -0
- package/.medusa/server/src/providers/dpd/index.js +3 -1
- package/.medusa/server/src/providers/dpd/statusdata-ftp.d.ts +16 -0
- package/.medusa/server/src/providers/dpd/statusdata-ftp.js +268 -0
- package/.medusa/server/src/providers/dpd/statusdata.d.ts +14 -0
- package/.medusa/server/src/providers/dpd/statusdata.js +161 -0
- package/.medusa/server/src/providers/mpl/client.d.ts +3 -1
- package/.medusa/server/src/providers/mpl/client.js +154 -2
- package/.medusa/server/src/providers/mpl/service.js +31 -20
- package/.medusa/server/src/providers/mpl/types.d.ts +25 -0
- package/.medusa/server/src/providers/mpl/types.js +1 -1
- package/.medusa/server/src/providers/packeta/index.d.ts +1 -0
- package/.medusa/server/src/providers/packeta/index.js +2 -1
- package/.medusa/server/src/providers/packeta/push-tracking.d.ts +8 -0
- package/.medusa/server/src/providers/packeta/push-tracking.js +96 -0
- package/.medusa/server/src/providers/packeta/service.js +22 -2
- package/.medusa/server/src/scripts/core-init.d.ts +1 -1
- package/.medusa/server/src/scripts/core-init.js +3 -2
- package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.d.ts +7 -0
- package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.js +65 -0
- package/.medusa/server/src/workflows/link-migrated-customer.d.ts +8 -0
- package/.medusa/server/src/workflows/link-migrated-customer.js +17 -0
- package/README.md +1 -1
- package/package.json +30 -8
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeAbandonedCartConfig = normalizeAbandonedCartConfig;
|
|
4
|
+
exports.createAbandonedCartRecoveryToken = createAbandonedCartRecoveryToken;
|
|
5
|
+
exports.verifyAbandonedCartRecoveryToken = verifyAbandonedCartRecoveryToken;
|
|
6
|
+
exports.abandonedCartRecoveryUrl = abandonedCartRecoveryUrl;
|
|
7
|
+
exports.abandonedCartEmailHash = abandonedCartEmailHash;
|
|
8
|
+
exports.subscribedNewsletterRecipient = subscribedNewsletterRecipient;
|
|
9
|
+
exports.issueAbandonedCartCoupon = issueAbandonedCartCoupon;
|
|
10
|
+
exports.sendAbandonedCartRecoveryEmail = sendAbandonedCartRecoveryEmail;
|
|
11
|
+
exports.abandonedCartCouponCode = abandonedCartCouponCode;
|
|
12
|
+
exports.cartLocale = cartLocale;
|
|
13
|
+
const node_crypto_1 = require("node:crypto");
|
|
14
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
15
|
+
const newsletter_1 = require("../modules/newsletter");
|
|
16
|
+
const email_center_1 = require("../modules/email-center");
|
|
17
|
+
const customer_email_1 = require("./customer-email");
|
|
18
|
+
function normalizeAbandonedCartConfig(env) {
|
|
19
|
+
const couponType = env.ABANDONED_CART_COUPON_TYPE === "fixed" ? "fixed" : "percentage";
|
|
20
|
+
const fallbackValue = couponType === "fixed" ? 2000 : 5;
|
|
21
|
+
const rawValue = Number(env.ABANDONED_CART_COUPON_VALUE ?? fallbackValue);
|
|
22
|
+
const couponValue = Number.isFinite(rawValue) && rawValue > 0
|
|
23
|
+
? couponType === "percentage"
|
|
24
|
+
? Math.min(100, rawValue)
|
|
25
|
+
: rawValue
|
|
26
|
+
: fallbackValue;
|
|
27
|
+
return {
|
|
28
|
+
enabled: env.ABANDONED_CART_ENABLED === "true",
|
|
29
|
+
delayHours: boundedInteger(env.ABANDONED_CART_DELAY_HOURS, 24, 1, 720),
|
|
30
|
+
recoveryTtlHours: boundedInteger(env.ABANDONED_CART_RECOVERY_TTL_HOURS, 168, 1, 720),
|
|
31
|
+
couponEnabled: env.ABANDONED_CART_COUPON_ENABLED === "true",
|
|
32
|
+
couponType,
|
|
33
|
+
couponValue,
|
|
34
|
+
couponCurrency: String(env.ABANDONED_CART_COUPON_CURRENCY || "huf").trim().toLowerCase() || "huf",
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function createAbandonedCartRecoveryToken(cartId, email, locale, ttlHours = 168) {
|
|
38
|
+
const payload = {
|
|
39
|
+
cart_id: String(cartId || "").trim(),
|
|
40
|
+
email_hash: abandonedCartEmailHash(email),
|
|
41
|
+
locale: normalizeRecoveryLocale(locale),
|
|
42
|
+
exp: Math.floor(Date.now() / 1000) + Math.max(1, Math.min(720, Math.trunc(Number(ttlHours) || 168))) * 3600,
|
|
43
|
+
};
|
|
44
|
+
if (!payload.cart_id)
|
|
45
|
+
throw new Error("A kosár azonosítója hiányzik.");
|
|
46
|
+
const encoded = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
|
47
|
+
return `${encoded}.${sign(encoded)}`;
|
|
48
|
+
}
|
|
49
|
+
function verifyAbandonedCartRecoveryToken(token) {
|
|
50
|
+
const [encoded, signature] = String(token || "").trim().split(".");
|
|
51
|
+
if (!encoded || !signature)
|
|
52
|
+
return null;
|
|
53
|
+
const expected = Buffer.from(sign(encoded), "utf8");
|
|
54
|
+
const actual = Buffer.from(signature, "utf8");
|
|
55
|
+
if (expected.length !== actual.length || !(0, node_crypto_1.timingSafeEqual)(expected, actual))
|
|
56
|
+
return null;
|
|
57
|
+
try {
|
|
58
|
+
const payload = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
|
|
59
|
+
if (!payload.cart_id || !payload.email_hash || !payload.exp)
|
|
60
|
+
return null;
|
|
61
|
+
if (payload.exp <= Math.floor(Date.now() / 1000))
|
|
62
|
+
return null;
|
|
63
|
+
payload.locale = normalizeRecoveryLocale(payload.locale);
|
|
64
|
+
return payload;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function abandonedCartRecoveryUrl(cartId, email, locale, ttlHours = 168) {
|
|
71
|
+
const normalizedLocale = normalizeRecoveryLocale(locale);
|
|
72
|
+
const token = createAbandonedCartRecoveryToken(cartId, email, normalizedLocale, ttlHours);
|
|
73
|
+
const path = normalizedLocale === "en-US" ? "/en/cart-recovery" : "/hu/kosar-visszaallitas";
|
|
74
|
+
return `${(0, customer_email_1.storefrontUrl)()}${path}?token=${encodeURIComponent(token)}`;
|
|
75
|
+
}
|
|
76
|
+
function abandonedCartEmailHash(email) {
|
|
77
|
+
return (0, node_crypto_1.createHash)("sha256")
|
|
78
|
+
.update((0, newsletter_1.normalizeNewsletterEmail)(email), "utf8")
|
|
79
|
+
.digest("hex");
|
|
80
|
+
}
|
|
81
|
+
async function subscribedNewsletterRecipient(container, email) {
|
|
82
|
+
const normalized = (0, newsletter_1.normalizeNewsletterEmail)(email);
|
|
83
|
+
const newsletter = container.resolve(newsletter_1.NEWSLETTER_MODULE);
|
|
84
|
+
const rows = await newsletter.listNewsletterSubscribers({ email: normalized, status: "subscribed" }, { take: 1 });
|
|
85
|
+
return rows[0] || null;
|
|
86
|
+
}
|
|
87
|
+
async function issueAbandonedCartCoupon(input) {
|
|
88
|
+
if (!input.config.couponEnabled)
|
|
89
|
+
return null;
|
|
90
|
+
const promotionService = input.container.resolve(utils_1.Modules.PROMOTION);
|
|
91
|
+
const code = abandonedCartCouponCode(input.cartId);
|
|
92
|
+
const existing = await promotionService.listPromotions({ code }, { take: 1 });
|
|
93
|
+
if (existing?.[0]) {
|
|
94
|
+
return { id: existing[0].id, code: existing[0].code || code, existing: true };
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const promotion = await promotionService.createPromotions({
|
|
98
|
+
code,
|
|
99
|
+
type: "standard",
|
|
100
|
+
status: "active",
|
|
101
|
+
limit: 1,
|
|
102
|
+
application_method: {
|
|
103
|
+
type: input.config.couponType,
|
|
104
|
+
target_type: "order",
|
|
105
|
+
value: input.config.couponValue,
|
|
106
|
+
...(input.config.couponType === "fixed"
|
|
107
|
+
? { currency_code: input.config.couponCurrency }
|
|
108
|
+
: {}),
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
return { id: promotion.id, code: promotion.code || code, existing: false };
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
const retried = await promotionService.listPromotions({ code }, { take: 1 });
|
|
115
|
+
if (retried?.[0]) {
|
|
116
|
+
return { id: retried[0].id, code: retried[0].code || code, existing: true };
|
|
117
|
+
}
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function sendAbandonedCartRecoveryEmail(input) {
|
|
122
|
+
const email = (0, newsletter_1.normalizeNewsletterEmail)(input.cart.email);
|
|
123
|
+
const subscriber = await subscribedNewsletterRecipient(input.container, email);
|
|
124
|
+
if (!subscriber)
|
|
125
|
+
return { skipped: true, reason: "not-subscribed" };
|
|
126
|
+
const locale = cartLocale(input.cart);
|
|
127
|
+
const unsubscribeToken = (0, newsletter_1.createNewsletterUnsubscribeToken)(String(subscriber.id), email);
|
|
128
|
+
const unsubscribeUrl = (0, newsletter_1.newsletterUnsubscribeUrl)(unsubscribeToken);
|
|
129
|
+
const recoveryUrl = abandonedCartRecoveryUrl(input.cart.id, email, locale, input.config.recoveryTtlHours);
|
|
130
|
+
const couponMessage = input.couponCode
|
|
131
|
+
? locale === "en-US"
|
|
132
|
+
? `Your single-use discount code: ${input.couponCode}`
|
|
133
|
+
: `Az egyszer használható kedvezménykódod: ${input.couponCode}`
|
|
134
|
+
: "";
|
|
135
|
+
const content = await (0, email_center_1.resolveEmailContent)({
|
|
136
|
+
container: input.container,
|
|
137
|
+
key: "cart.abandoned",
|
|
138
|
+
locale,
|
|
139
|
+
data: {
|
|
140
|
+
recovery_url: recoveryUrl,
|
|
141
|
+
coupon_code: input.couponCode || "",
|
|
142
|
+
coupon_message: couponMessage,
|
|
143
|
+
unsubscribe_url: unsubscribeUrl,
|
|
144
|
+
item_count: cartItemCount(input.cart),
|
|
145
|
+
total: input.cart.total ?? "",
|
|
146
|
+
currency_code: input.cart.currency_code || "",
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
if (!content)
|
|
150
|
+
throw new Error("A cart.abandoned Email Center sablon nem érhető el.");
|
|
151
|
+
return (0, email_center_1.sendManagedEmail)({
|
|
152
|
+
container: input.container,
|
|
153
|
+
to: email,
|
|
154
|
+
key: "cart.abandoned",
|
|
155
|
+
locale,
|
|
156
|
+
content: (0, email_center_1.ensureMarketingUnsubscribe)(content, unsubscribeUrl, locale),
|
|
157
|
+
idempotencyKey: `abandoned-cart:${input.cart.id}`,
|
|
158
|
+
resourceId: input.cart.id,
|
|
159
|
+
resourceType: "cart",
|
|
160
|
+
track: true,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function abandonedCartCouponCode(cartId) {
|
|
164
|
+
const digest = (0, node_crypto_1.createHmac)("sha256", tokenSecret())
|
|
165
|
+
.update(String(cartId || ""), "utf8")
|
|
166
|
+
.digest("hex")
|
|
167
|
+
.slice(0, 10)
|
|
168
|
+
.toUpperCase();
|
|
169
|
+
return `CART-${digest}`;
|
|
170
|
+
}
|
|
171
|
+
function cartLocale(cart) {
|
|
172
|
+
return normalizeRecoveryLocale(cart.locale || cart.metadata?.storefront_locale || cart.metadata?.locale);
|
|
173
|
+
}
|
|
174
|
+
function cartItemCount(cart) {
|
|
175
|
+
return (cart.items || []).reduce((sum, item) => sum + Math.max(0, Number(item?.quantity) || 0), 0);
|
|
176
|
+
}
|
|
177
|
+
function normalizeRecoveryLocale(value) {
|
|
178
|
+
return String(value || "").trim().toLowerCase().startsWith("en") ? "en-US" : "hu-HU";
|
|
179
|
+
}
|
|
180
|
+
function boundedInteger(value, fallback, min, max) {
|
|
181
|
+
const parsed = Number(value);
|
|
182
|
+
return Number.isFinite(parsed) ? Math.max(min, Math.min(max, Math.trunc(parsed))) : fallback;
|
|
183
|
+
}
|
|
184
|
+
function sign(value) {
|
|
185
|
+
return (0, node_crypto_1.createHmac)("sha256", tokenSecret()).update(value, "utf8").digest("base64url");
|
|
186
|
+
}
|
|
187
|
+
function tokenSecret() {
|
|
188
|
+
const secret = String(process.env.ABANDONED_CART_TOKEN_SECRET ||
|
|
189
|
+
process.env.COOKIE_SECRET ||
|
|
190
|
+
process.env.JWT_SECRET ||
|
|
191
|
+
"").trim();
|
|
192
|
+
if (secret.length < 16) {
|
|
193
|
+
throw new Error("ABANDONED_CART_TOKEN_SECRET, COOKIE_SECRET vagy JWT_SECRET szükséges a kosár-visszaállító linkekhez.");
|
|
194
|
+
}
|
|
195
|
+
return secret;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJhbmRvbmVkLWNhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9hYmFuZG9uZWQtY2FydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZDQSxvRUFtQkM7QUFFRCw0RUFlQztBQUVELDRFQWdCQztBQUVELDREQVVDO0FBRUQsd0RBSUM7QUFFRCxzRUFRQztBQUVELDREQXFDQztBQUVELHdFQW9EQztBQUVELDBEQU9DO0FBRUQsZ0NBSUM7QUEzT0QsNkNBQXFFO0FBQ3JFLHFEQUFtRDtBQUNuRCxzREFNOEI7QUFDOUIsMERBSWdDO0FBQ2hDLHFEQUFnRDtBQStCaEQsU0FBZ0IsNEJBQTRCLENBQUMsR0FBdUM7SUFDbEYsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLDBCQUEwQixLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUE7SUFDdEYsTUFBTSxhQUFhLEdBQUcsVUFBVSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxhQUFhLENBQUMsQ0FBQTtJQUN6RSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDO1FBQzNELENBQUMsQ0FBQyxVQUFVLEtBQUssWUFBWTtZQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxRQUFRO1FBQ1osQ0FBQyxDQUFDLGFBQWEsQ0FBQTtJQUVqQixPQUFPO1FBQ0wsT0FBTyxFQUFFLEdBQUcsQ0FBQyxzQkFBc0IsS0FBSyxNQUFNO1FBQzlDLFVBQVUsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFLEVBQUUsRUFB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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CartLifecycleStatus } from "./cart-observability";
|
|
2
|
+
export declare class AdminCartManagementError extends Error {
|
|
3
|
+
readonly statusCode: number;
|
|
4
|
+
constructor(statusCode: number, message: string);
|
|
5
|
+
}
|
|
6
|
+
export type AdminMutableCart = {
|
|
7
|
+
id: string;
|
|
8
|
+
status: CartLifecycleStatus;
|
|
9
|
+
};
|
|
10
|
+
export declare function assertAdminCartMutable<T extends AdminMutableCart>(cart: T | null): T;
|
|
11
|
+
export declare function requireAdminCartId(value: unknown): string;
|
|
12
|
+
export declare function requireCustomerId(value: unknown): string;
|
|
13
|
+
export declare function requireRegionId(value: unknown): string;
|
|
14
|
+
export declare function requireVariantId(value: unknown): string;
|
|
15
|
+
export declare function requireLineItemId(value: unknown): string;
|
|
16
|
+
export declare function requireCartQuantity(value: unknown): number;
|
|
17
|
+
export declare function requirePromotionCode(value: unknown): string;
|
|
18
|
+
export declare function adminCartManagementStatus(error: unknown): number;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdminCartManagementError = void 0;
|
|
4
|
+
exports.assertAdminCartMutable = assertAdminCartMutable;
|
|
5
|
+
exports.requireAdminCartId = requireAdminCartId;
|
|
6
|
+
exports.requireCustomerId = requireCustomerId;
|
|
7
|
+
exports.requireRegionId = requireRegionId;
|
|
8
|
+
exports.requireVariantId = requireVariantId;
|
|
9
|
+
exports.requireLineItemId = requireLineItemId;
|
|
10
|
+
exports.requireCartQuantity = requireCartQuantity;
|
|
11
|
+
exports.requirePromotionCode = requirePromotionCode;
|
|
12
|
+
exports.adminCartManagementStatus = adminCartManagementStatus;
|
|
13
|
+
class AdminCartManagementError extends Error {
|
|
14
|
+
constructor(statusCode, message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = "AdminCartManagementError";
|
|
17
|
+
this.statusCode = statusCode;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.AdminCartManagementError = AdminCartManagementError;
|
|
21
|
+
function assertAdminCartMutable(cart) {
|
|
22
|
+
if (!cart) {
|
|
23
|
+
throw new AdminCartManagementError(404, "A kosár nem található.");
|
|
24
|
+
}
|
|
25
|
+
if (cart.status === "converted") {
|
|
26
|
+
throw new AdminCartManagementError(409, "A konvertált kosár már rendeléshez tartozik, ezért nem szerkeszthető.");
|
|
27
|
+
}
|
|
28
|
+
return cart;
|
|
29
|
+
}
|
|
30
|
+
function requireAdminCartId(value) {
|
|
31
|
+
const id = String(value || "").trim();
|
|
32
|
+
if (!id) {
|
|
33
|
+
throw new AdminCartManagementError(400, "A kosár azonosítója hiányzik.");
|
|
34
|
+
}
|
|
35
|
+
return id;
|
|
36
|
+
}
|
|
37
|
+
function requireCustomerId(value) {
|
|
38
|
+
const id = String(value || "").trim();
|
|
39
|
+
if (!id) {
|
|
40
|
+
throw new AdminCartManagementError(400, "A vásárló azonosítója hiányzik.");
|
|
41
|
+
}
|
|
42
|
+
return id;
|
|
43
|
+
}
|
|
44
|
+
function requireRegionId(value) {
|
|
45
|
+
const id = String(value || "").trim();
|
|
46
|
+
if (!id) {
|
|
47
|
+
throw new AdminCartManagementError(400, "A régió kiválasztása kötelező.");
|
|
48
|
+
}
|
|
49
|
+
return id;
|
|
50
|
+
}
|
|
51
|
+
function requireVariantId(value) {
|
|
52
|
+
const id = String(value || "").trim();
|
|
53
|
+
if (!id) {
|
|
54
|
+
throw new AdminCartManagementError(400, "A termékváltozat kiválasztása kötelező.");
|
|
55
|
+
}
|
|
56
|
+
return id;
|
|
57
|
+
}
|
|
58
|
+
function requireLineItemId(value) {
|
|
59
|
+
const id = String(value || "").trim();
|
|
60
|
+
if (!id) {
|
|
61
|
+
throw new AdminCartManagementError(400, "A kosártétel azonosítója hiányzik.");
|
|
62
|
+
}
|
|
63
|
+
return id;
|
|
64
|
+
}
|
|
65
|
+
function requireCartQuantity(value) {
|
|
66
|
+
const quantity = Number(value);
|
|
67
|
+
if (!Number.isInteger(quantity) || quantity < 1) {
|
|
68
|
+
throw new AdminCartManagementError(400, "A mennyiség legalább 1 egész szám lehet.");
|
|
69
|
+
}
|
|
70
|
+
return quantity;
|
|
71
|
+
}
|
|
72
|
+
function requirePromotionCode(value) {
|
|
73
|
+
const code = String(value || "").trim();
|
|
74
|
+
if (!code) {
|
|
75
|
+
throw new AdminCartManagementError(400, "A promóciós kód hiányzik.");
|
|
76
|
+
}
|
|
77
|
+
return code;
|
|
78
|
+
}
|
|
79
|
+
function adminCartManagementStatus(error) {
|
|
80
|
+
if (error instanceof AdminCartManagementError)
|
|
81
|
+
return error.statusCode;
|
|
82
|
+
const type = String(error?.type || "");
|
|
83
|
+
switch (type) {
|
|
84
|
+
case "unauthorized":
|
|
85
|
+
return 401;
|
|
86
|
+
case "forbidden":
|
|
87
|
+
return 403;
|
|
88
|
+
case "not_found":
|
|
89
|
+
return 404;
|
|
90
|
+
case "conflict":
|
|
91
|
+
return 409;
|
|
92
|
+
case "duplicate_error":
|
|
93
|
+
case "payment_authorization_error":
|
|
94
|
+
return 422;
|
|
95
|
+
case "not_allowed":
|
|
96
|
+
case "invalid_data":
|
|
97
|
+
return 400;
|
|
98
|
+
default:
|
|
99
|
+
return 500;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tY2FydC1tYW5hZ2VtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvYWRtaW4tY2FydC1tYW5hZ2VtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlCQSx3REFXQztBQUVELGdEQU1DO0FBRUQsOENBTUM7QUFFRCwwQ0FNQztBQUVELDRDQU1DO0FBRUQsOENBTUM7QUFFRCxrREFNQztBQUVELG9EQU1DO0FBRUQsOERBc0JDO0FBMUdELE1BQWEsd0JBQXlCLFNBQVEsS0FBSztJQUdqRCxZQUFZLFVBQWtCLEVBQUUsT0FBZTtRQUM3QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLDBCQUEwQixDQUFBO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO0lBQzlCLENBQUM7Q0FDRjtBQVJELDREQVFDO0FBT0QsU0FBZ0Isc0JBQXNCLENBQTZCLElBQWM7SUFDL0UsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLHdCQUF3QixDQUFDLEdBQUcsRUFBRSx3QkFBd0IsQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLHdCQUF3QixDQUNoQyxHQUFHLEVBQ0gsdUVBQXVFLENBQ3hFLENBQUE7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsS0FBYztJQUMvQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3JDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNSLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsK0JBQStCLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lB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
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type CartLifecycleStatus } from "./cart-observability";
|
|
2
|
+
export type CartVisibilityQuery = {
|
|
3
|
+
graph(input: Record<string, unknown>): Promise<{
|
|
4
|
+
data: Array<Record<string, any>>;
|
|
5
|
+
metadata?: {
|
|
6
|
+
count?: number;
|
|
7
|
+
};
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
export type CartVisibilityListInput = {
|
|
11
|
+
status?: CartLifecycleStatus | "all";
|
|
12
|
+
search?: string;
|
|
13
|
+
offset?: number;
|
|
14
|
+
limit?: number;
|
|
15
|
+
};
|
|
16
|
+
export declare function listAdminCarts(query: CartVisibilityQuery, delayHours: number, input?: CartVisibilityListInput): Promise<{
|
|
17
|
+
carts: {
|
|
18
|
+
id: string;
|
|
19
|
+
customer_id: any;
|
|
20
|
+
customer_name: string | null;
|
|
21
|
+
email: string | null;
|
|
22
|
+
customer_label: string;
|
|
23
|
+
currency_code: string;
|
|
24
|
+
total: any;
|
|
25
|
+
item_count: number;
|
|
26
|
+
created_at: any;
|
|
27
|
+
updated_at: any;
|
|
28
|
+
completed_at: any;
|
|
29
|
+
status: CartLifecycleStatus;
|
|
30
|
+
order: {
|
|
31
|
+
id: any;
|
|
32
|
+
display_id: any;
|
|
33
|
+
} | null;
|
|
34
|
+
}[];
|
|
35
|
+
count: number;
|
|
36
|
+
offset: number;
|
|
37
|
+
limit: number;
|
|
38
|
+
abandoned_delay_hours: number;
|
|
39
|
+
}>;
|
|
40
|
+
export declare function getAdminCart(query: CartVisibilityQuery, cartId: string, delayHours: number): Promise<{
|
|
41
|
+
customer: any;
|
|
42
|
+
order: any;
|
|
43
|
+
region: any;
|
|
44
|
+
promotions: any[];
|
|
45
|
+
items: any[];
|
|
46
|
+
id: string;
|
|
47
|
+
customer_id: any;
|
|
48
|
+
customer_name: string | null;
|
|
49
|
+
email: string | null;
|
|
50
|
+
customer_label: string;
|
|
51
|
+
currency_code: string;
|
|
52
|
+
total: any;
|
|
53
|
+
item_count: number;
|
|
54
|
+
created_at: any;
|
|
55
|
+
updated_at: any;
|
|
56
|
+
completed_at: any;
|
|
57
|
+
status: CartLifecycleStatus;
|
|
58
|
+
} | null>;
|
|
59
|
+
export declare function getLatestCustomerCart(query: CartVisibilityQuery, customerId: string, delayHours: number): Promise<{
|
|
60
|
+
id: string;
|
|
61
|
+
customer_id: any;
|
|
62
|
+
customer_name: string | null;
|
|
63
|
+
email: string | null;
|
|
64
|
+
customer_label: string;
|
|
65
|
+
currency_code: string;
|
|
66
|
+
total: any;
|
|
67
|
+
item_count: number;
|
|
68
|
+
created_at: any;
|
|
69
|
+
updated_at: any;
|
|
70
|
+
completed_at: any;
|
|
71
|
+
status: CartLifecycleStatus;
|
|
72
|
+
order: {
|
|
73
|
+
id: any;
|
|
74
|
+
display_id: any;
|
|
75
|
+
} | null;
|
|
76
|
+
} | null>;
|
|
77
|
+
export declare function getActiveCustomerCart(query: CartVisibilityQuery, customerId: string, delayHours: number): Promise<{
|
|
78
|
+
id: string;
|
|
79
|
+
customer_id: any;
|
|
80
|
+
customer_name: string | null;
|
|
81
|
+
email: string | null;
|
|
82
|
+
customer_label: string;
|
|
83
|
+
currency_code: string;
|
|
84
|
+
total: any;
|
|
85
|
+
item_count: number;
|
|
86
|
+
created_at: any;
|
|
87
|
+
updated_at: any;
|
|
88
|
+
completed_at: any;
|
|
89
|
+
status: CartLifecycleStatus;
|
|
90
|
+
order: {
|
|
91
|
+
id: any;
|
|
92
|
+
display_id: any;
|
|
93
|
+
} | null;
|
|
94
|
+
} | null>;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listAdminCarts = listAdminCarts;
|
|
4
|
+
exports.getAdminCart = getAdminCart;
|
|
5
|
+
exports.getLatestCustomerCart = getLatestCustomerCart;
|
|
6
|
+
exports.getActiveCustomerCart = getActiveCustomerCart;
|
|
7
|
+
const cart_observability_1 = require("./cart-observability");
|
|
8
|
+
const LIST_FIELDS = [
|
|
9
|
+
"id",
|
|
10
|
+
"email",
|
|
11
|
+
"customer_id",
|
|
12
|
+
"currency_code",
|
|
13
|
+
"total",
|
|
14
|
+
"created_at",
|
|
15
|
+
"updated_at",
|
|
16
|
+
"completed_at",
|
|
17
|
+
"items.id",
|
|
18
|
+
"items.quantity",
|
|
19
|
+
"customer.id",
|
|
20
|
+
"customer.email",
|
|
21
|
+
"customer.first_name",
|
|
22
|
+
"customer.last_name",
|
|
23
|
+
"order.id",
|
|
24
|
+
"order.display_id",
|
|
25
|
+
];
|
|
26
|
+
const DETAIL_FIELDS = [
|
|
27
|
+
...LIST_FIELDS,
|
|
28
|
+
"subtotal",
|
|
29
|
+
"discount_total",
|
|
30
|
+
"shipping_total",
|
|
31
|
+
"tax_total",
|
|
32
|
+
"original_total",
|
|
33
|
+
"region.id",
|
|
34
|
+
"region.name",
|
|
35
|
+
"promotions.id",
|
|
36
|
+
"promotions.code",
|
|
37
|
+
"items.title",
|
|
38
|
+
"items.product_title",
|
|
39
|
+
"items.product_id",
|
|
40
|
+
"items.variant_id",
|
|
41
|
+
"items.variant_title",
|
|
42
|
+
"items.variant_sku",
|
|
43
|
+
"items.unit_price",
|
|
44
|
+
"items.subtotal",
|
|
45
|
+
"items.discount_total",
|
|
46
|
+
"items.tax_total",
|
|
47
|
+
"items.total",
|
|
48
|
+
];
|
|
49
|
+
async function listAdminCarts(query, delayHours, input = {}) {
|
|
50
|
+
const status = input.status || "all";
|
|
51
|
+
const search = String(input.search || "").trim().toLowerCase();
|
|
52
|
+
const offset = Math.max(0, Math.trunc(Number(input.offset) || 0));
|
|
53
|
+
const limit = Math.max(1, Math.min(100, Math.trunc(Number(input.limit) || 25)));
|
|
54
|
+
const now = Date.now();
|
|
55
|
+
const carts = await queryAll(query, {
|
|
56
|
+
entity: "cart",
|
|
57
|
+
fields: LIST_FIELDS,
|
|
58
|
+
order: { updated_at: "DESC" },
|
|
59
|
+
});
|
|
60
|
+
const rows = carts
|
|
61
|
+
.filter(cart_observability_1.cartHasItems)
|
|
62
|
+
.map((cart) => cartSummary(cart, delayHours, now))
|
|
63
|
+
.filter((cart) => status === "all" || cart.status === status)
|
|
64
|
+
.filter((cart) => !search || searchableCart(cart).includes(search))
|
|
65
|
+
.sort((a, b) => dateNumber(b.updated_at) - dateNumber(a.updated_at));
|
|
66
|
+
return {
|
|
67
|
+
carts: rows.slice(offset, offset + limit),
|
|
68
|
+
count: rows.length,
|
|
69
|
+
offset,
|
|
70
|
+
limit,
|
|
71
|
+
abandoned_delay_hours: delayHours,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async function getAdminCart(query, cartId, delayHours) {
|
|
75
|
+
const id = String(cartId || "").trim();
|
|
76
|
+
if (!id)
|
|
77
|
+
return null;
|
|
78
|
+
const result = await query.graph({
|
|
79
|
+
entity: "cart",
|
|
80
|
+
fields: DETAIL_FIELDS,
|
|
81
|
+
filters: { id },
|
|
82
|
+
pagination: { take: 1 },
|
|
83
|
+
});
|
|
84
|
+
const cart = result.data?.[0];
|
|
85
|
+
if (!cart)
|
|
86
|
+
return null;
|
|
87
|
+
const summary = cartSummary(cart, delayHours, Date.now());
|
|
88
|
+
return {
|
|
89
|
+
...cart,
|
|
90
|
+
...summary,
|
|
91
|
+
customer: cart.customer || null,
|
|
92
|
+
order: cart.order || null,
|
|
93
|
+
region: cart.region || null,
|
|
94
|
+
promotions: Array.isArray(cart.promotions) ? cart.promotions : [],
|
|
95
|
+
items: Array.isArray(cart.items) ? cart.items : [],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async function getLatestCustomerCart(query, customerId, delayHours) {
|
|
99
|
+
const id = String(customerId || "").trim();
|
|
100
|
+
if (!id)
|
|
101
|
+
return null;
|
|
102
|
+
const result = await query.graph({
|
|
103
|
+
entity: "cart",
|
|
104
|
+
fields: LIST_FIELDS,
|
|
105
|
+
filters: { customer_id: id },
|
|
106
|
+
pagination: { take: 20, order: { updated_at: "DESC" } },
|
|
107
|
+
});
|
|
108
|
+
const cart = (result.data || []).find(cart_observability_1.cartHasItems);
|
|
109
|
+
return cart ? cartSummary(cart, delayHours, Date.now()) : null;
|
|
110
|
+
}
|
|
111
|
+
async function getActiveCustomerCart(query, customerId, delayHours) {
|
|
112
|
+
const id = String(customerId || "").trim();
|
|
113
|
+
if (!id)
|
|
114
|
+
return null;
|
|
115
|
+
const carts = await queryAll(query, {
|
|
116
|
+
entity: "cart",
|
|
117
|
+
fields: LIST_FIELDS,
|
|
118
|
+
filters: { customer_id: id },
|
|
119
|
+
order: { updated_at: "DESC" },
|
|
120
|
+
});
|
|
121
|
+
const now = Date.now();
|
|
122
|
+
const active = carts
|
|
123
|
+
.map((cart) => cartSummary(cart, delayHours, now))
|
|
124
|
+
.find((cart) => cart.status === "active");
|
|
125
|
+
return active || null;
|
|
126
|
+
}
|
|
127
|
+
function cartSummary(cart, delayHours, now) {
|
|
128
|
+
const customer = cart.customer && typeof cart.customer === "object" ? cart.customer : null;
|
|
129
|
+
const email = String(cart.email || customer?.email || "").trim() || null;
|
|
130
|
+
const name = [customer?.first_name, customer?.last_name]
|
|
131
|
+
.map((value) => String(value || "").trim())
|
|
132
|
+
.filter(Boolean)
|
|
133
|
+
.join(" ");
|
|
134
|
+
return {
|
|
135
|
+
id: String(cart.id),
|
|
136
|
+
customer_id: cart.customer_id || customer?.id || null,
|
|
137
|
+
customer_name: name || null,
|
|
138
|
+
email,
|
|
139
|
+
customer_label: name || email || "Vendég",
|
|
140
|
+
currency_code: String(cart.currency_code || "").toUpperCase(),
|
|
141
|
+
total: cart.total ?? 0,
|
|
142
|
+
item_count: (0, cart_observability_1.cartItemCount)(cart),
|
|
143
|
+
created_at: cart.created_at || null,
|
|
144
|
+
updated_at: cart.updated_at || cart.created_at || null,
|
|
145
|
+
completed_at: cart.completed_at || null,
|
|
146
|
+
status: (0, cart_observability_1.cartLifecycleStatus)(cart, delayHours, now),
|
|
147
|
+
order: cart.order
|
|
148
|
+
? {
|
|
149
|
+
id: cart.order.id || null,
|
|
150
|
+
display_id: cart.order.display_id ?? null,
|
|
151
|
+
}
|
|
152
|
+
: null,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async function queryAll(query, input) {
|
|
156
|
+
const all = [];
|
|
157
|
+
const take = 250;
|
|
158
|
+
for (let skip = 0;; skip += take) {
|
|
159
|
+
const result = await query.graph({
|
|
160
|
+
entity: input.entity,
|
|
161
|
+
fields: input.fields,
|
|
162
|
+
filters: input.filters || {},
|
|
163
|
+
pagination: {
|
|
164
|
+
skip,
|
|
165
|
+
take,
|
|
166
|
+
order: input.order || { updated_at: "DESC" },
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
const rows = result.data || [];
|
|
170
|
+
all.push(...rows);
|
|
171
|
+
if (rows.length < take)
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
return all;
|
|
175
|
+
}
|
|
176
|
+
function searchableCart(cart) {
|
|
177
|
+
return [
|
|
178
|
+
cart.id,
|
|
179
|
+
cart.customer_id,
|
|
180
|
+
cart.customer_name,
|
|
181
|
+
cart.email,
|
|
182
|
+
cart.order?.id,
|
|
183
|
+
cart.order?.display_id,
|
|
184
|
+
]
|
|
185
|
+
.map((value) => String(value ?? "").toLowerCase())
|
|
186
|
+
.join(" ");
|
|
187
|
+
}
|
|
188
|
+
function dateNumber(value) {
|
|
189
|
+
const parsed = Date.parse(String(value || ""));
|
|
190
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tY2FydC12aXNpYmlsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvYWRtaW4tY2FydC12aXNpYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0VBLHdDQStCQztBQUVELG9DQTJCQztBQUVELHNEQWdCQztBQUVELHNEQW9CQztBQXBLRCw2REFLNkI7QUFnQjdCLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLElBQUk7SUFDSixPQUFPO0lBQ1AsYUFBYTtJQUNiLGVBQWU7SUFDZixPQUFPO0lBQ1AsWUFBWTtJQUNaLFlBQVk7SUFDWixjQUFjO0lBQ2QsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsVUFBVTtJQUNWLGtCQUFrQjtDQUNuQixDQUFBO0FBRUQsTUFBTSxhQUFhLEdBQUc7SUFDcEIsR0FBRyxXQUFXO0lBQ2QsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsYUFBYTtJQUNiLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsYUFBYTtJQUNiLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsaUJBQWlCO0lBQ2pCLGFBQWE7Q0FDZCxDQUFBO0FBRU0sS0FBSyxVQUFVLGNBQWMsQ0FDbEMsS0FBMEIsRUFDMUIsVUFBa0IsRUFDbEIsUUFBaUMsRUFBRTtJQUVuQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQTtJQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFX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
|