@hszrdm/core 1.5.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 +4916 -4157
- package/.medusa/server/src/admin/index.mjs +4916 -4157
- 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/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/middlewares.js +9 -1
- 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/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/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/cart-observability.d.ts +23 -0
- package/.medusa/server/src/core/cart-observability.js +54 -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/version.d.ts +2 -2
- package/.medusa/server/src/core/version.js +2 -2
- package/.medusa/server/src/jobs/abandoned-cart-recovery.js +6 -7
- 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/README.md +1 -1
- package/package.json +29 -8
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const back_in_stock_1 = require("../../../../core/back-in-stock");
|
|
7
|
+
const shared_cart_1 = require("../../../../modules/shared-cart");
|
|
8
|
+
async function GET(req, res) {
|
|
9
|
+
res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, private");
|
|
10
|
+
res.setHeader("Pragma", "no-cache");
|
|
11
|
+
try {
|
|
12
|
+
const token = String(req.params.token || "").trim();
|
|
13
|
+
if (!token || token.length > 200) {
|
|
14
|
+
return res.status(404).json({ message: "A megosztott kosár nem található." });
|
|
15
|
+
}
|
|
16
|
+
const service = req.scope.resolve(shared_cart_1.SHARED_CART_MODULE);
|
|
17
|
+
const rows = await service.listSharedCarts({ token_hash: hashToken(token) }, { take: 1 });
|
|
18
|
+
const shared = rows[0];
|
|
19
|
+
if (!shared) {
|
|
20
|
+
return res.status(404).json({ message: "A megosztott kosár nem található." });
|
|
21
|
+
}
|
|
22
|
+
const expiresAt = new Date(shared.expires_at);
|
|
23
|
+
if (Number.isNaN(expiresAt.getTime()) || expiresAt.getTime() <= Date.now()) {
|
|
24
|
+
return res.status(410).json({ message: "Ez a megosztott kosár már lejárt." });
|
|
25
|
+
}
|
|
26
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
27
|
+
const items = await Promise.all((Array.isArray(shared.items) ? shared.items : []).map(async (item) => ({
|
|
28
|
+
...item,
|
|
29
|
+
availability: await (0, back_in_stock_1.variantAvailability)(query, item.variant_id),
|
|
30
|
+
})));
|
|
31
|
+
const useCount = Math.max(0, Number(shared.use_count) || 0) + 1;
|
|
32
|
+
await service.updateSharedCarts({ id: shared.id, use_count: useCount });
|
|
33
|
+
return res.json({
|
|
34
|
+
shared_cart: {
|
|
35
|
+
items,
|
|
36
|
+
region_id: shared.region_id || null,
|
|
37
|
+
currency_code: shared.currency_code || null,
|
|
38
|
+
expires_at: expiresAt.toISOString(),
|
|
39
|
+
use_count: useCount,
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return res.status(500).json({
|
|
45
|
+
message: error instanceof Error ? error.message : "A megosztott kosár nem tölthető be.",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function hashToken(token) {
|
|
50
|
+
return (0, node_crypto_1.createHash)("sha256").update(token).digest("hex");
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3NoYXJlZC1jYXJ0cy9bdG9rZW5dL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBdUJBLGtCQWtEQztBQXpFRCw2Q0FBd0M7QUFFeEMscURBQXFFO0FBQ3JFLGtFQUFvRTtBQUNwRSxpRUFBb0U7QUFtQjdELEtBQUssVUFBVSxHQUFHLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUMvRCxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFBO0lBQzlFLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBRW5DLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNuRCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDakMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxDQUFDLENBQUE7UUFDL0UsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdDQUFrQixDQUFpQyxDQUFBO1FBQ3JGLE1BQU0sSUFBSSxHQUFHLE1BQU0sT0FBTyxDQUFDLGVBQWUsQ0FDeEMsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQ2hDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUNaLENBQUE7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sRUFB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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
2
|
+
type SnapshotItem = {
|
|
3
|
+
product_id?: string | null;
|
|
4
|
+
variant_id?: string;
|
|
5
|
+
quantity?: number;
|
|
6
|
+
};
|
|
7
|
+
type CreateSharedCartBody = {
|
|
8
|
+
items?: SnapshotItem[];
|
|
9
|
+
region_id?: string | null;
|
|
10
|
+
currency_code?: string | null;
|
|
11
|
+
};
|
|
12
|
+
export declare function POST(req: MedusaRequest<CreateSharedCartBody>, res: MedusaResponse): Promise<MedusaResponse>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const integration_settings_1 = require("../../../modules/integration-settings");
|
|
6
|
+
const shared_cart_1 = require("../../../modules/shared-cart");
|
|
7
|
+
const settings_1 = require("../../../modules/shared-cart/settings");
|
|
8
|
+
async function POST(req, res) {
|
|
9
|
+
try {
|
|
10
|
+
const items = normalizeItems(req.body?.items);
|
|
11
|
+
if (!items.length) {
|
|
12
|
+
return res.status(400).json({ message: "Üres kosár nem osztható meg." });
|
|
13
|
+
}
|
|
14
|
+
const settings = req.scope.resolve(integration_settings_1.INTEGRATION_SETTINGS_MODULE);
|
|
15
|
+
const service = req.scope.resolve(shared_cart_1.SHARED_CART_MODULE);
|
|
16
|
+
const ttlDays = await (0, settings_1.getSharedCartTtlDays)(settings);
|
|
17
|
+
const token = (0, node_crypto_1.randomBytes)(32).toString("base64url");
|
|
18
|
+
const tokenHash = hashToken(token);
|
|
19
|
+
const expiresAt = new Date(Date.now() + ttlDays * 24 * 60 * 60 * 1000);
|
|
20
|
+
await service.createSharedCarts({
|
|
21
|
+
token_hash: tokenHash,
|
|
22
|
+
items,
|
|
23
|
+
region_id: cleanOptionalString(req.body?.region_id),
|
|
24
|
+
currency_code: cleanOptionalString(req.body?.currency_code)?.toLowerCase() || null,
|
|
25
|
+
use_count: 0,
|
|
26
|
+
expires_at: expiresAt,
|
|
27
|
+
});
|
|
28
|
+
return res.status(201).json({
|
|
29
|
+
token,
|
|
30
|
+
expires_at: expiresAt.toISOString(),
|
|
31
|
+
use_count: 0,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return res.status(400).json({
|
|
36
|
+
message: error instanceof Error ? error.message : "A kosár nem osztható meg.",
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function normalizeItems(value) {
|
|
41
|
+
if (!Array.isArray(value))
|
|
42
|
+
return [];
|
|
43
|
+
if (value.length > 100)
|
|
44
|
+
throw new Error("Egy megosztott kosár legfeljebb 100 tételt tartalmazhat.");
|
|
45
|
+
const merged = new Map();
|
|
46
|
+
for (const raw of value) {
|
|
47
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
48
|
+
continue;
|
|
49
|
+
const item = raw;
|
|
50
|
+
const variantId = cleanOptionalString(item.variant_id);
|
|
51
|
+
if (!variantId)
|
|
52
|
+
continue;
|
|
53
|
+
const quantity = Math.trunc(Number(item.quantity));
|
|
54
|
+
if (!Number.isFinite(quantity) || quantity < 1 || quantity > 999) {
|
|
55
|
+
throw new Error("Érvénytelen kosármennyiség.");
|
|
56
|
+
}
|
|
57
|
+
const existing = merged.get(variantId);
|
|
58
|
+
const nextQuantity = (existing?.quantity || 0) + quantity;
|
|
59
|
+
if (nextQuantity > 999)
|
|
60
|
+
throw new Error("Egy variánsból legfeljebb 999 darab osztható meg.");
|
|
61
|
+
merged.set(variantId, {
|
|
62
|
+
product_id: cleanOptionalString(item.product_id),
|
|
63
|
+
variant_id: variantId,
|
|
64
|
+
quantity: nextQuantity,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return [...merged.values()];
|
|
68
|
+
}
|
|
69
|
+
function cleanOptionalString(value) {
|
|
70
|
+
if (typeof value !== "string")
|
|
71
|
+
return null;
|
|
72
|
+
const normalized = value.trim();
|
|
73
|
+
return normalized || null;
|
|
74
|
+
}
|
|
75
|
+
function hashToken(token) {
|
|
76
|
+
return (0, node_crypto_1.createHash)("sha256").update(token).digest("hex");
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3NoYXJlZC1jYXJ0cy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXlCQSxvQkFvQ0M7QUE3REQsNkNBQXFEO0FBRXJELGdGQUc4QztBQUM5Qyw4REFBaUU7QUFDakUsb0VBQTRFO0FBa0JyRSxLQUFLLFVBQVUsSUFBSSxDQUN4QixHQUF3QyxFQUN4QyxHQUFtQjtJQUVuQixJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsQ0FBQyxDQUFBO1FBQzFFLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrREFBMkIsQ0FBd0MsQ0FBQTtRQUN0RyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQ0FBa0IsQ0FBaUMsQ0FBQTtRQUNyRixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEsK0JBQW9CLEVBQUMsUUFBUSxDQUFDLENBQUE7UUFDcEQsTUFBTSxLQUFLLEdBQUcsSUFBQSx5QkFBVyxFQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNuRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJ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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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
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type IntegrationSettingsStore } from "../modules/integration-settings";
|
|
2
|
+
export type CartLifecycleStatus = "active" | "abandoned" | "converted";
|
|
3
|
+
export type ObservableCart = {
|
|
4
|
+
completed_at?: string | Date | null;
|
|
5
|
+
created_at?: string | Date | null;
|
|
6
|
+
updated_at?: string | Date | null;
|
|
7
|
+
items?: Array<{
|
|
8
|
+
quantity?: number | null;
|
|
9
|
+
}> | null;
|
|
10
|
+
};
|
|
11
|
+
export declare function abandonedCartCutoff(delayHours: number, now?: number): Date;
|
|
12
|
+
export declare function abandonedCartQueryFilters(delayHours: number, now?: number): {
|
|
13
|
+
completed_at: null;
|
|
14
|
+
updated_at: {
|
|
15
|
+
$lte: Date;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare function cartItemCount(cart: ObservableCart): number;
|
|
19
|
+
export declare function cartHasItems(cart: ObservableCart): boolean;
|
|
20
|
+
export declare function cartLastActivity(cart: ObservableCart): Date | null;
|
|
21
|
+
export declare function isAbandonedCart(cart: ObservableCart, delayHours: number, now?: number): boolean;
|
|
22
|
+
export declare function cartLifecycleStatus(cart: ObservableCart, delayHours: number, now?: number): CartLifecycleStatus;
|
|
23
|
+
export declare function resolveAbandonedCartDelayHours(store: IntegrationSettingsStore): Promise<number>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.abandonedCartCutoff = abandonedCartCutoff;
|
|
4
|
+
exports.abandonedCartQueryFilters = abandonedCartQueryFilters;
|
|
5
|
+
exports.cartItemCount = cartItemCount;
|
|
6
|
+
exports.cartHasItems = cartHasItems;
|
|
7
|
+
exports.cartLastActivity = cartLastActivity;
|
|
8
|
+
exports.isAbandonedCart = isAbandonedCart;
|
|
9
|
+
exports.cartLifecycleStatus = cartLifecycleStatus;
|
|
10
|
+
exports.resolveAbandonedCartDelayHours = resolveAbandonedCartDelayHours;
|
|
11
|
+
const abandoned_cart_1 = require("./abandoned-cart");
|
|
12
|
+
const integration_settings_1 = require("../modules/integration-settings");
|
|
13
|
+
const HOUR_MS = 60 * 60 * 1000;
|
|
14
|
+
function abandonedCartCutoff(delayHours, now = Date.now()) {
|
|
15
|
+
const normalizedDelay = Math.max(1, Math.trunc(Number(delayHours) || 1));
|
|
16
|
+
return new Date(now - normalizedDelay * HOUR_MS);
|
|
17
|
+
}
|
|
18
|
+
function abandonedCartQueryFilters(delayHours, now = Date.now()) {
|
|
19
|
+
return {
|
|
20
|
+
completed_at: null,
|
|
21
|
+
updated_at: { $lte: abandonedCartCutoff(delayHours, now) },
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function cartItemCount(cart) {
|
|
25
|
+
return (cart.items || []).reduce((sum, item) => sum + Math.max(0, Number(item?.quantity) || 0), 0);
|
|
26
|
+
}
|
|
27
|
+
function cartHasItems(cart) {
|
|
28
|
+
return cartItemCount(cart) > 0;
|
|
29
|
+
}
|
|
30
|
+
function cartLastActivity(cart) {
|
|
31
|
+
const value = cart.updated_at || cart.created_at;
|
|
32
|
+
if (!value)
|
|
33
|
+
return null;
|
|
34
|
+
const timestamp = new Date(value).getTime();
|
|
35
|
+
return Number.isFinite(timestamp) ? new Date(timestamp) : null;
|
|
36
|
+
}
|
|
37
|
+
function isAbandonedCart(cart, delayHours, now = Date.now()) {
|
|
38
|
+
if (cart.completed_at || !cartHasItems(cart))
|
|
39
|
+
return false;
|
|
40
|
+
const activity = cartLastActivity(cart);
|
|
41
|
+
if (!activity)
|
|
42
|
+
return false;
|
|
43
|
+
return activity.getTime() <= abandonedCartCutoff(delayHours, now).getTime();
|
|
44
|
+
}
|
|
45
|
+
function cartLifecycleStatus(cart, delayHours, now = Date.now()) {
|
|
46
|
+
if (cart.completed_at)
|
|
47
|
+
return "converted";
|
|
48
|
+
return isAbandonedCart(cart, delayHours, now) ? "abandoned" : "active";
|
|
49
|
+
}
|
|
50
|
+
async function resolveAbandonedCartDelayHours(store) {
|
|
51
|
+
const resolved = await (0, integration_settings_1.resolvedIntegrationEnvironment)(store, "abandoned-cart");
|
|
52
|
+
return (0, abandoned_cart_1.normalizeAbandonedCartConfig)(resolved.env).delayHours;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1vYnNlcnZhYmlsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvY2FydC1vYnNlcnZhYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBbUJBLGtEQUdDO0FBRUQsOERBS0M7QUFFRCxzQ0FLQztBQUVELG9DQUVDO0FBRUQsNENBS0M7QUFFRCwwQ0FTQztBQUVELGtEQU9DO0FBRUQsd0VBS0M7QUExRUQscURBRXlCO0FBQ3pCLDBFQUd3QztBQVd4QyxNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQTtBQUU5QixTQUFnQixtQkFBbUIsQ0FBQyxVQUFrQixFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ3RFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDeEUsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsZUFBZSxHQUFHLE9BQU8sQ0FBQyxDQUFBO0FBQ2xELENBQUM7QUFFRCxTQUFnQix5QkFBeUIsQ0FBQyxVQUFrQixFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQzVFLE9BQU87UUFDTCxZQUFZLEVBQUUsSUFBSTtRQUNsQixVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUFFO0tBQzNELENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLElBQW9CO0lBQ2hELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDOUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDN0QsQ0FBQyxDQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLElBQW9CO0lBQy9DLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNoQyxDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsSUFBb0I7SUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFBO0lBQ2hELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDM0MsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ2hFLENBQUM7QUFFRCxTQUFnQixlQUFlLENBQzdCLElBQW9CLEVBQ3BCLFVBQWtCLEVBQ2xCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBRWhCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUMxRCxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN2QyxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQzNCLE9BQU8sUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUM3RSxDQUFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQ2pDLElBQW9CLEVBQ3BCLFVBQWtCLEVBQ2xCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBRWhCLElBQUksSUFBSSxDQUFDLFlBQVk7UUFBRSxPQUFPLFdBQVcsQ0FBQTtJQUN6QyxPQUFPLGVBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtBQUN4RSxDQUFDO0FBRU0sS0FBSyxVQUFVLDhCQUE4QixDQUNsRCxLQUErQjtJQUUvQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEscURBQThCLEVBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFDOUUsT0FBTyxJQUFBLDZDQUE0QixFQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUE7QUFDOUQsQ0FBQyJ9
|