@hszrdm/core 1.4.0 → 1.5.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 +5582 -3769
- package/.medusa/server/src/admin/index.mjs +5582 -3769
- 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/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/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 +16 -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/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/core/abandoned-cart.d.ts +64 -0
- package/.medusa/server/src/core/abandoned-cart.js +197 -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/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-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 +138 -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/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/package.json +2 -1
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTerminalShippingStatus = isTerminalShippingStatus;
|
|
4
|
+
exports.mapPacketaStatus = mapPacketaStatus;
|
|
5
|
+
exports.mapMplPullStatus = mapMplPullStatus;
|
|
6
|
+
exports.mapMplPushStatus = mapMplPushStatus;
|
|
7
|
+
exports.mapDpdStatusdataScanCode = mapDpdStatusdataScanCode;
|
|
8
|
+
exports.applyNormalizedTrackingEvent = applyNormalizedTrackingEvent;
|
|
9
|
+
exports.findOrderByShipmentIdentifiers = findOrderByShipmentIdentifiers;
|
|
10
|
+
exports.shipmentMatches = shipmentMatches;
|
|
11
|
+
const node_crypto_1 = require("node:crypto");
|
|
12
|
+
const operations_1 = require("./operations");
|
|
13
|
+
const state_1 = require("../../../modules/integration-operation/state");
|
|
14
|
+
const TERMINAL = new Set([
|
|
15
|
+
"DELIVERED",
|
|
16
|
+
"RETURNED",
|
|
17
|
+
"CANCELLED",
|
|
18
|
+
]);
|
|
19
|
+
function isTerminalShippingStatus(value) {
|
|
20
|
+
return TERMINAL.has(String(value || "").toUpperCase());
|
|
21
|
+
}
|
|
22
|
+
function mapPacketaStatus(input) {
|
|
23
|
+
const id = Number(input.statusId);
|
|
24
|
+
const code = String(input.statusCode || "").trim().toLowerCase();
|
|
25
|
+
const returning = input.isReturning === true || input.isReturning === 1 || input.isReturning === "1";
|
|
26
|
+
if (returning && (id === 7 || code.includes("delivered") || code.includes("returned"))) {
|
|
27
|
+
return "RETURNED";
|
|
28
|
+
}
|
|
29
|
+
if (returning)
|
|
30
|
+
return "RETURNING";
|
|
31
|
+
if (code.includes("cancel"))
|
|
32
|
+
return "CANCELLED";
|
|
33
|
+
if (code.includes("returned"))
|
|
34
|
+
return "RETURNED";
|
|
35
|
+
if (code.includes("return"))
|
|
36
|
+
return "RETURNING";
|
|
37
|
+
if (code.includes("delivered"))
|
|
38
|
+
return "DELIVERED";
|
|
39
|
+
if (code.includes("ready for pickup") || code.includes("ready for pick-up"))
|
|
40
|
+
return "AT_PICKUP_POINT";
|
|
41
|
+
if (code.includes("out for delivery"))
|
|
42
|
+
return "OUT_FOR_DELIVERY";
|
|
43
|
+
if (code.includes("received data"))
|
|
44
|
+
return "CREATED";
|
|
45
|
+
if (code.includes("arrived") || code.includes("departed") || code.includes("handed to carrier") || code.includes("prepared for departure")) {
|
|
46
|
+
return "IN_TRANSIT";
|
|
47
|
+
}
|
|
48
|
+
if (id === 1)
|
|
49
|
+
return "CREATED";
|
|
50
|
+
if ([2, 3, 4, 6].includes(id))
|
|
51
|
+
return "IN_TRANSIT";
|
|
52
|
+
if (id === 5)
|
|
53
|
+
return "AT_PICKUP_POINT";
|
|
54
|
+
if (id === 7)
|
|
55
|
+
return "DELIVERED";
|
|
56
|
+
if (id === 25)
|
|
57
|
+
return "IN_TRANSIT";
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function mapMplPullStatus(input) {
|
|
61
|
+
const categoryCode = Number(input.categoryCode);
|
|
62
|
+
const category = normalizeText(input.category);
|
|
63
|
+
const description = normalizeText(input.description);
|
|
64
|
+
if (containsAny(description, [
|
|
65
|
+
"feladónak visszakézbesítve",
|
|
66
|
+
"returned to sender",
|
|
67
|
+
"returned to the sender",
|
|
68
|
+
]))
|
|
69
|
+
return "RETURNED";
|
|
70
|
+
if (containsAny(description, [
|
|
71
|
+
"visszaküldés alatt",
|
|
72
|
+
"return to sender",
|
|
73
|
+
"returning to sender",
|
|
74
|
+
]))
|
|
75
|
+
return "RETURNING";
|
|
76
|
+
if (containsAny(description, [
|
|
77
|
+
"sikeresen kézbesítve",
|
|
78
|
+
"sikeres kézbesítés",
|
|
79
|
+
"successfully delivered",
|
|
80
|
+
]))
|
|
81
|
+
return "DELIVERED";
|
|
82
|
+
if (categoryCode === 5 || category.includes("kézbesített") || category.includes("delivered")) {
|
|
83
|
+
// MPL category 5 also contains non-delivery accounting events and
|
|
84
|
+
// return-to-sender events, so never infer DELIVERED from the category alone.
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
if (categoryCode === 4 || category.includes("kézbesítés") || category.includes("delivery")) {
|
|
88
|
+
if (containsAny(description, [
|
|
89
|
+
"postán átvehető",
|
|
90
|
+
"postaponton",
|
|
91
|
+
"csomagautomatából átvehető",
|
|
92
|
+
"ready for pickup",
|
|
93
|
+
"ready for pick-up",
|
|
94
|
+
]))
|
|
95
|
+
return "AT_PICKUP_POINT";
|
|
96
|
+
if (containsAny(description, [
|
|
97
|
+
"kézbesítőnél van",
|
|
98
|
+
"handed over to delivery man",
|
|
99
|
+
"out for delivery",
|
|
100
|
+
]))
|
|
101
|
+
return "OUT_FOR_DELIVERY";
|
|
102
|
+
return "IN_TRANSIT";
|
|
103
|
+
}
|
|
104
|
+
if (categoryCode === 3 || category.includes("szállítás") || category.includes("transport")) {
|
|
105
|
+
if (containsAny(description, ["nem kézbesíthető", "undeliverable"]))
|
|
106
|
+
return "RETURNING";
|
|
107
|
+
return "IN_TRANSIT";
|
|
108
|
+
}
|
|
109
|
+
if (categoryCode === 2 || category.includes("feldolgozás") || category.includes("processing"))
|
|
110
|
+
return "PROCESSING";
|
|
111
|
+
if (categoryCode === 1 || category.includes("felvétel") || category.includes("acceptance"))
|
|
112
|
+
return "ACCEPTED";
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
function mapMplPushStatus(status, statusText) {
|
|
116
|
+
const value = normalizeText(status);
|
|
117
|
+
const text = normalizeText(statusText);
|
|
118
|
+
if (containsAny(text, ["returned to sender", "feladónak visszakézbesítve"]))
|
|
119
|
+
return "RETURNED";
|
|
120
|
+
if (containsAny(value, ["returned", "return delivered"]))
|
|
121
|
+
return "RETURNED";
|
|
122
|
+
if (containsAny(value, ["return", "returning"]))
|
|
123
|
+
return "RETURNING";
|
|
124
|
+
if (containsAny(value, ["delivered"]))
|
|
125
|
+
return "DELIVERED";
|
|
126
|
+
if (containsAny(value, ["delivery"])) {
|
|
127
|
+
if (containsAny(text, ["ready for pickup", "ready for pick-up", "átvehető"]))
|
|
128
|
+
return "AT_PICKUP_POINT";
|
|
129
|
+
return "OUT_FOR_DELIVERY";
|
|
130
|
+
}
|
|
131
|
+
if (containsAny(value, ["transport", "transit"]))
|
|
132
|
+
return "IN_TRANSIT";
|
|
133
|
+
if (containsAny(value, ["processing"]))
|
|
134
|
+
return "PROCESSING";
|
|
135
|
+
if (containsAny(value, ["acceptance", "accepted"]))
|
|
136
|
+
return "ACCEPTED";
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
function mapDpdStatusdataScanCode(scanCode, serviceCode) {
|
|
140
|
+
const code = String(scanCode ?? "").trim().padStart(2, "0");
|
|
141
|
+
const service = String(serviceCode ?? "").trim();
|
|
142
|
+
if (code === "13") {
|
|
143
|
+
return ["298", "299", "300", "301"].includes(service)
|
|
144
|
+
? "RETURNED"
|
|
145
|
+
: "DELIVERED";
|
|
146
|
+
}
|
|
147
|
+
if (code === "23")
|
|
148
|
+
return "AT_PICKUP_POINT";
|
|
149
|
+
if (code === "03")
|
|
150
|
+
return "OUT_FOR_DELIVERY";
|
|
151
|
+
if (code === "14")
|
|
152
|
+
return "ERROR";
|
|
153
|
+
if (code === "05" || code === "15")
|
|
154
|
+
return "ACCEPTED";
|
|
155
|
+
if (["02", "04", "06", "08", "09", "10", "20"].includes(code)) {
|
|
156
|
+
return "IN_TRANSIT";
|
|
157
|
+
}
|
|
158
|
+
// DPD 18 is explicitly an information scan that can represent different
|
|
159
|
+
// states, including calculated delivery/release, so it must not be guessed.
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
async function applyNormalizedTrackingEvent(input) {
|
|
163
|
+
const identifiers = uniqueStrings(input.event.shipmentIdentifiers);
|
|
164
|
+
if (!identifiers.length)
|
|
165
|
+
throw new Error("Hiányzó tracking/csomagazonosító.");
|
|
166
|
+
const fingerprint = input.event.eventId || (0, node_crypto_1.createHash)("sha256")
|
|
167
|
+
.update([
|
|
168
|
+
input.event.carrier,
|
|
169
|
+
input.event.source,
|
|
170
|
+
identifiers.join(","),
|
|
171
|
+
input.event.rawStatus || input.event.status || "",
|
|
172
|
+
input.event.occurredAt || "",
|
|
173
|
+
].join("|"))
|
|
174
|
+
.digest("hex");
|
|
175
|
+
const acquired = input.operationStore
|
|
176
|
+
? await (0, state_1.acquireOperation)(input.operationStore, {
|
|
177
|
+
provider: input.event.carrier,
|
|
178
|
+
operation_type: `status.${input.event.source}`,
|
|
179
|
+
entity_type: "shipment",
|
|
180
|
+
entity_id: identifiers[0],
|
|
181
|
+
external_id: identifiers[0],
|
|
182
|
+
idempotency_key: `${input.event.carrier}:status:${input.event.source}:${fingerprint}`,
|
|
183
|
+
reference_data: {
|
|
184
|
+
replay_safe: true,
|
|
185
|
+
identifiers,
|
|
186
|
+
status: input.event.status ?? null,
|
|
187
|
+
raw_status: input.event.rawStatus ?? null,
|
|
188
|
+
occurred_at: input.event.occurredAt ?? null,
|
|
189
|
+
},
|
|
190
|
+
})
|
|
191
|
+
: null;
|
|
192
|
+
if (acquired && !acquired.acquired) {
|
|
193
|
+
if (acquired.operation.status !== "succeeded") {
|
|
194
|
+
// A concurrent/stale worker may still own this event. Returning null keeps
|
|
195
|
+
// stream cursors and Statusdata files retryable until the operation either
|
|
196
|
+
// succeeds or the existing reconciliation logic moves it to failed.
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
duplicate: true,
|
|
201
|
+
orderId: acquired.operation.reference_data?.order_id ?? null,
|
|
202
|
+
status: acquired.operation.reference_data?.status ?? input.event.status ?? null,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
const order = await findOrderByShipmentIdentifiers(input.orderService, input.event.carrier, identifiers, input.operationStore);
|
|
207
|
+
if (!order) {
|
|
208
|
+
if (acquired && input.operationStore) {
|
|
209
|
+
await (0, state_1.operationFailed)(input.operationStore, acquired.operation, new Error("Tracking eseményhez nem található rendelés."), false, identifiers[0], {
|
|
210
|
+
...(acquired.operation.reference_data ?? {}),
|
|
211
|
+
replay_safe: true,
|
|
212
|
+
identifiers,
|
|
213
|
+
retry_reason: "order_not_found",
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
const rawCurrent = order.metadata?.[input.event.carrier];
|
|
219
|
+
const current = rawCurrent && typeof rawCurrent === "object"
|
|
220
|
+
? rawCurrent
|
|
221
|
+
: {};
|
|
222
|
+
const hasCanonicalStatus = Boolean(input.event.status);
|
|
223
|
+
const incomingTime = hasCanonicalStatus ? parseTime(input.event.occurredAt) : null;
|
|
224
|
+
const currentTime = parseTime(current.statusUpdatedAt ?? current.status_updated_at);
|
|
225
|
+
const currentStatus = String(current.status || "").toUpperCase();
|
|
226
|
+
const nextStatus = input.event.status || currentStatus || "UNKNOWN";
|
|
227
|
+
const stale = hasCanonicalStatus && incomingTime != null && currentTime != null && incomingTime < currentTime;
|
|
228
|
+
const terminalRegression = hasCanonicalStatus && isTerminalShippingStatus(currentStatus) && !isTerminalShippingStatus(nextStatus);
|
|
229
|
+
if (stale || terminalRegression) {
|
|
230
|
+
if (acquired && input.operationStore) {
|
|
231
|
+
await (0, state_1.operationSucceeded)(input.operationStore, acquired.operation, identifiers[0], {
|
|
232
|
+
...(acquired.operation.reference_data ?? {}),
|
|
233
|
+
replay_safe: true,
|
|
234
|
+
order_id: order.id,
|
|
235
|
+
status: current.status ?? null,
|
|
236
|
+
stale,
|
|
237
|
+
terminal_regression: terminalRegression,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
orderId: order.id,
|
|
242
|
+
status: current.status ?? null,
|
|
243
|
+
stale,
|
|
244
|
+
terminalRegression,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
const eventAt = input.event.occurredAt || new Date().toISOString();
|
|
248
|
+
const statusUpdatedAt = hasCanonicalStatus
|
|
249
|
+
? eventAt
|
|
250
|
+
: String(current.statusUpdatedAt ?? current.status_updated_at ?? "") || undefined;
|
|
251
|
+
const shipment = {
|
|
252
|
+
...current,
|
|
253
|
+
...(input.event.extra ?? {}),
|
|
254
|
+
status: nextStatus,
|
|
255
|
+
...(statusUpdatedAt ? { statusUpdatedAt } : {}),
|
|
256
|
+
trackingSource: input.event.source,
|
|
257
|
+
trackingEventId: input.event.eventId || fingerprint,
|
|
258
|
+
lastTrackingEventAt: eventAt,
|
|
259
|
+
...(hasCanonicalStatus && input.event.rawStatus != null ? { rawStatus: input.event.rawStatus } : {}),
|
|
260
|
+
...(hasCanonicalStatus && input.event.statusText != null ? { statusDescription: input.event.statusText } : {}),
|
|
261
|
+
...(input.event.trackingNumber ? { trackingNumber: input.event.trackingNumber } : {}),
|
|
262
|
+
...(input.event.trackingUrl ? { trackingUrl: input.event.trackingUrl } : {}),
|
|
263
|
+
...(hasCanonicalStatus && nextStatus === "DELIVERED" ? { deliveredAt: eventAt } : {}),
|
|
264
|
+
...(hasCanonicalStatus && nextStatus === "RETURNED" ? { returnedAt: eventAt } : {}),
|
|
265
|
+
};
|
|
266
|
+
const next = (0, operations_1.appendShippingOperation)({ ...(order.metadata ?? {}), [input.event.carrier]: shipment }, {
|
|
267
|
+
carrier: input.event.carrier,
|
|
268
|
+
action: "status",
|
|
269
|
+
status: "success",
|
|
270
|
+
actorId: `${input.event.carrier}-${input.event.source}`,
|
|
271
|
+
durationMs: 0,
|
|
272
|
+
message: `${carrierName(input.event.carrier)}: tracking státusz frissítve (${input.event.source}).`,
|
|
273
|
+
response: {
|
|
274
|
+
status: nextStatus,
|
|
275
|
+
rawStatus: input.event.rawStatus ?? null,
|
|
276
|
+
source: input.event.source,
|
|
277
|
+
identifiers,
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
await input.orderService.updateOrders([{ id: order.id, metadata: next.metadata }]);
|
|
281
|
+
if (acquired && input.operationStore) {
|
|
282
|
+
await (0, state_1.operationSucceeded)(input.operationStore, acquired.operation, identifiers[0], {
|
|
283
|
+
...(acquired.operation.reference_data ?? {}),
|
|
284
|
+
replay_safe: true,
|
|
285
|
+
order_id: order.id,
|
|
286
|
+
status: nextStatus,
|
|
287
|
+
identifiers,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
return { orderId: order.id, status: nextStatus, duplicate: false };
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
if (acquired && input.operationStore) {
|
|
294
|
+
await (0, state_1.operationFailed)(input.operationStore, acquired.operation, error, false, identifiers[0], acquired.operation.reference_data ?? undefined);
|
|
295
|
+
}
|
|
296
|
+
throw error;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
async function findOrderByShipmentIdentifiers(orderService, carrier, identifiers, operationStore) {
|
|
300
|
+
const ids = new Set(uniqueStrings(identifiers));
|
|
301
|
+
if (operationStore) {
|
|
302
|
+
for (const identifier of ids) {
|
|
303
|
+
const operations = await operationStore.listIntegrationOperations({
|
|
304
|
+
provider: carrier,
|
|
305
|
+
operation_type: "shipment.create",
|
|
306
|
+
entity_type: "order",
|
|
307
|
+
status: "succeeded",
|
|
308
|
+
external_id: identifier,
|
|
309
|
+
}, { take: 5, order: { updated_at: "DESC" } });
|
|
310
|
+
const entityId = operations.find((item) => item.entity_id)?.entity_id;
|
|
311
|
+
if (entityId)
|
|
312
|
+
return orderService.retrieveOrder(entityId);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const pageSize = 200;
|
|
316
|
+
for (let skip = 0;; skip += pageSize) {
|
|
317
|
+
const orders = await orderService.listOrders({}, { take: pageSize, skip, order: { created_at: "DESC" } });
|
|
318
|
+
const match = orders.find((order) => shipmentMatches(order, carrier, ids));
|
|
319
|
+
if (match)
|
|
320
|
+
return match;
|
|
321
|
+
if (orders.length < pageSize)
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
return undefined;
|
|
325
|
+
}
|
|
326
|
+
function shipmentMatches(order, carrier, identifiers) {
|
|
327
|
+
const raw = order.metadata?.[carrier];
|
|
328
|
+
if (!raw || typeof raw !== "object")
|
|
329
|
+
return false;
|
|
330
|
+
const shipment = raw;
|
|
331
|
+
const candidates = carrier === "foxpost"
|
|
332
|
+
? [shipment.packageId, shipment.trackingNumber]
|
|
333
|
+
: carrier === "gls"
|
|
334
|
+
? [shipment.parcelNumber, shipment.parcelId, shipment.trackingNumber]
|
|
335
|
+
: carrier === "packeta"
|
|
336
|
+
? [shipment.packetId, shipment.barcode, shipment.trackingNumber, shipment.courierNumber]
|
|
337
|
+
: carrier === "dpd"
|
|
338
|
+
? [shipment.parcelNumber, shipment.trackingNumber, shipment.shipmentId]
|
|
339
|
+
: [shipment.trackingNumber, ...(Array.isArray(shipment.packageTrackingNumbers) ? shipment.packageTrackingNumbers : [])];
|
|
340
|
+
return candidates.some((candidate) => identifiers.has(String(candidate ?? "").trim()));
|
|
341
|
+
}
|
|
342
|
+
function carrierName(carrier) {
|
|
343
|
+
if (carrier === "foxpost")
|
|
344
|
+
return "FOXPOST";
|
|
345
|
+
if (carrier === "gls")
|
|
346
|
+
return "GLS";
|
|
347
|
+
if (carrier === "packeta")
|
|
348
|
+
return "Packeta";
|
|
349
|
+
if (carrier === "dpd")
|
|
350
|
+
return "DPD";
|
|
351
|
+
return "MPL";
|
|
352
|
+
}
|
|
353
|
+
function uniqueStrings(values) {
|
|
354
|
+
return [...new Set(values.map((value) => String(value ?? "").trim()).filter(Boolean))];
|
|
355
|
+
}
|
|
356
|
+
function parseTime(value) {
|
|
357
|
+
if (!value)
|
|
358
|
+
return null;
|
|
359
|
+
const time = Date.parse(String(value));
|
|
360
|
+
return Number.isFinite(time) ? time : null;
|
|
361
|
+
}
|
|
362
|
+
function normalizeText(value) {
|
|
363
|
+
return String(value ?? "").trim().toLowerCase();
|
|
364
|
+
}
|
|
365
|
+
function containsAny(value, needles) {
|
|
366
|
+
return needles.some((needle) => value.includes(needle));
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvc2hpcHBpbmcvdHJhY2tpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpREEsNERBRUM7QUFFRCw0Q0ErQkM7QUFFRCw0Q0F3REM7QUFFRCw0Q0FnQkM7QUFFRCw0REF1QkM7QUFFRCxvRUF3TEM7QUFFRCx3RUFxQ0M7QUFFRCwwQ0FlQztBQTNhRCw2Q0FBd0M7QUFDeEMsNkNBQXNEO0FBTXRELHdFQUlxRDtBQWdDckQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQTBCO0lBQ2hELFdBQVc7SUFDWCxVQUFVO0lBQ1YsV0FBVztDQUNaLENBQUMsQ0FBQTtBQUVGLFNBQWdCLHdCQUF3QixDQUFDLEtBQWM7SUFDckQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUE2QixDQUFDLENBQUE7QUFDbkYsQ0FBQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLEtBSWhDO0lBQ0MsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNqQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNoRSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLEdBQUcsQ0FBQTtJQUVwRyxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUs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
|
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
import type { ShippingOrderService } from "./types";
|
|
2
1
|
import type { IntegrationOperationStore } from "../../../modules/integration-operation/types";
|
|
2
|
+
import type { ShippingOrderService } from "./types";
|
|
3
3
|
type ShippingWebhookCarrier = "foxpost" | "gls";
|
|
4
4
|
export declare function verifyShippingWebhook(provided: unknown): boolean;
|
|
5
5
|
export declare function applyCarrierWebhook(orderService: ShippingOrderService, carrier: ShippingWebhookCarrier, body: unknown, operationStore?: IntegrationOperationStore): Promise<{
|
|
6
6
|
duplicate: boolean;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
orderId: {} | null;
|
|
8
|
+
status: {} | null;
|
|
9
9
|
stale?: undefined;
|
|
10
|
+
terminalRegression?: undefined;
|
|
10
11
|
} | {
|
|
11
12
|
orderId: string;
|
|
12
|
-
status:
|
|
13
|
+
status: {} | null;
|
|
13
14
|
stale: boolean;
|
|
15
|
+
terminalRegression: boolean;
|
|
14
16
|
duplicate?: undefined;
|
|
15
|
-
} | {
|
|
16
|
-
orderId: string;
|
|
17
|
-
status: "CANCELLED" | "CREATED" | "LABEL_CREATED" | "HANDED_OVER" | "IN_TRANSIT" | "AT_LOCKER" | "OUT_FOR_DELIVERY" | "DELIVERED" | "RETURNING" | "RETURNED" | "ERROR" | "UNKNOWN";
|
|
18
|
-
duplicate?: undefined;
|
|
19
|
-
stale?: undefined;
|
|
20
17
|
} | null>;
|
|
21
18
|
export {};
|
|
@@ -5,8 +5,7 @@ exports.applyCarrierWebhook = applyCarrierWebhook;
|
|
|
5
5
|
const node_crypto_1 = require("node:crypto");
|
|
6
6
|
const foxpost_1 = require("../../../providers/foxpost");
|
|
7
7
|
const gls_1 = require("../../../providers/gls");
|
|
8
|
-
const
|
|
9
|
-
const state_1 = require("../../../modules/integration-operation/state");
|
|
8
|
+
const tracking_1 = require("./tracking");
|
|
10
9
|
function verifyShippingWebhook(provided) {
|
|
11
10
|
const expected = process.env.SHIPPING_WEBHOOK_SECRET;
|
|
12
11
|
if (!expected)
|
|
@@ -40,143 +39,31 @@ async function applyCarrierWebhook(orderService, carrier, body, operationStore)
|
|
|
40
39
|
payload.StatusDate ??
|
|
41
40
|
nested(payload, "event", "timestamp"));
|
|
42
41
|
const eventId = text(payload.eventId ?? payload.event_id ?? payload.EventId);
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
.digest("hex");
|
|
46
|
-
const acquired = operationStore
|
|
47
|
-
? await (0, state_1.acquireOperation)(operationStore, {
|
|
48
|
-
provider: carrier,
|
|
49
|
-
operation_type: "status.webhook",
|
|
50
|
-
entity_type: "shipment",
|
|
51
|
-
entity_id: parcelId,
|
|
52
|
-
idempotency_key: `${carrier}:webhook:${fingerprint}`,
|
|
53
|
-
reference_data: {
|
|
54
|
-
replay_safe: true,
|
|
55
|
-
parcelId,
|
|
56
|
-
rawStatus,
|
|
57
|
-
eventTime: eventTime || null,
|
|
58
|
-
},
|
|
59
|
-
})
|
|
60
|
-
: null;
|
|
61
|
-
if (acquired && !acquired.acquired) {
|
|
62
|
-
return {
|
|
63
|
-
duplicate: true,
|
|
64
|
-
status: acquired.operation.reference_data?.status ?? rawStatus,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
let order;
|
|
68
|
-
if (operationStore) {
|
|
69
|
-
const [shipmentOperation] = await operationStore.listIntegrationOperations({
|
|
70
|
-
provider: carrier,
|
|
71
|
-
external_id: parcelId,
|
|
72
|
-
entity_type: "order",
|
|
73
|
-
status: "succeeded",
|
|
74
|
-
}, { take: 1, order: { updated_at: "DESC" } });
|
|
75
|
-
if (shipmentOperation?.entity_id) {
|
|
76
|
-
order = await orderService.retrieveOrder(shipmentOperation.entity_id);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// Compatibility fallback for parcels created before durable operation records existed.
|
|
80
|
-
for (let skip = 0; !order && skip < 1000; skip += 200) {
|
|
81
|
-
const orders = await orderService.listOrders({}, { take: 200, skip, order: { created_at: "DESC" } });
|
|
82
|
-
order = orders.find((candidate) => matches(candidate, carrier, parcelId));
|
|
83
|
-
if (orders.length < 200)
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
if (!order) {
|
|
87
|
-
if (acquired && operationStore) {
|
|
88
|
-
await (0, state_1.operationFailed)(operationStore, acquired.operation, new Error("Carrier webhook order is not available yet"), false, parcelId, {
|
|
89
|
-
replay_safe: true,
|
|
90
|
-
parcelId,
|
|
91
|
-
rawStatus,
|
|
92
|
-
eventTime: eventTime || null,
|
|
93
|
-
retry_reason: "order_not_found",
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
const currentValue = order.metadata?.[carrier];
|
|
99
|
-
const current = currentValue && typeof currentValue === "object"
|
|
100
|
-
? currentValue
|
|
101
|
-
: {};
|
|
102
|
-
const currentTime = Date.parse(text(current.statusUpdatedAt));
|
|
103
|
-
const incomingTime = Date.parse(eventTime);
|
|
104
|
-
if (Number.isFinite(currentTime) &&
|
|
105
|
-
Number.isFinite(incomingTime) &&
|
|
106
|
-
incomingTime < currentTime) {
|
|
107
|
-
if (acquired && operationStore) {
|
|
108
|
-
await (0, state_1.operationSucceeded)(operationStore, acquired.operation, parcelId, {
|
|
109
|
-
replay_safe: true,
|
|
110
|
-
parcelId,
|
|
111
|
-
rawStatus,
|
|
112
|
-
eventTime,
|
|
113
|
-
status: current.status,
|
|
114
|
-
orderId: order.id,
|
|
115
|
-
stale: true,
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
return { orderId: order.id, status: current.status, stale: true };
|
|
119
|
-
}
|
|
120
|
-
const shipment = carrier === "foxpost"
|
|
121
|
-
? {
|
|
122
|
-
...current,
|
|
123
|
-
status: (0, foxpost_1.mapFoxpostStatus)(rawStatus),
|
|
124
|
-
statusUpdatedAt: eventTime || new Date().toISOString(),
|
|
125
|
-
}
|
|
126
|
-
: {
|
|
127
|
-
...current,
|
|
128
|
-
status: (0, gls_1.mapGlsStatus)(rawStatus),
|
|
129
|
-
rawStatus,
|
|
130
|
-
statusDescription: text(payload.statusDescription ?? payload.StatusDescription) ||
|
|
131
|
-
current.statusDescription,
|
|
132
|
-
statusUpdatedAt: eventTime || new Date().toISOString(),
|
|
133
|
-
};
|
|
134
|
-
const response = carrier === "foxpost"
|
|
135
|
-
? { packageId: parcelId, status: shipment.status }
|
|
136
|
-
: { parcelNumber: parcelId, status: shipment.status, rawStatus };
|
|
137
|
-
const next = (0, operations_1.appendShippingOperation)({ ...(order.metadata ?? {}), [carrier]: shipment }, {
|
|
42
|
+
const statusText = text(payload.statusDescription ?? payload.StatusDescription);
|
|
43
|
+
const event = {
|
|
138
44
|
carrier,
|
|
139
|
-
|
|
140
|
-
status: "
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
45
|
+
shipmentIdentifiers: [parcelId],
|
|
46
|
+
status: carrier === "foxpost"
|
|
47
|
+
? canonicalFoxpostStatus((0, foxpost_1.mapFoxpostStatus)(rawStatus))
|
|
48
|
+
: (0, gls_1.mapGlsStatus)(rawStatus),
|
|
49
|
+
rawStatus,
|
|
50
|
+
statusText: statusText || null,
|
|
51
|
+
occurredAt: eventTime || null,
|
|
52
|
+
eventId: eventId || null,
|
|
53
|
+
source: "webhook",
|
|
54
|
+
};
|
|
55
|
+
return (0, tracking_1.applyNormalizedTrackingEvent)({
|
|
56
|
+
orderService,
|
|
57
|
+
event,
|
|
58
|
+
operationStore,
|
|
145
59
|
});
|
|
146
|
-
try {
|
|
147
|
-
await orderService.updateOrders([{ id: order.id, metadata: next.metadata }]);
|
|
148
|
-
if (acquired && operationStore) {
|
|
149
|
-
await (0, state_1.operationSucceeded)(operationStore, acquired.operation, parcelId, {
|
|
150
|
-
replay_safe: true,
|
|
151
|
-
parcelId,
|
|
152
|
-
rawStatus,
|
|
153
|
-
status: shipment.status,
|
|
154
|
-
orderId: order.id,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
catch (error) {
|
|
159
|
-
if (acquired && operationStore) {
|
|
160
|
-
await (0, state_1.operationFailed)(operationStore, acquired.operation, error, false, parcelId, {
|
|
161
|
-
replay_safe: true,
|
|
162
|
-
parcelId,
|
|
163
|
-
rawStatus,
|
|
164
|
-
status: shipment.status,
|
|
165
|
-
orderId: order.id,
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
throw error;
|
|
169
|
-
}
|
|
170
|
-
return { orderId: order.id, status: shipment.status };
|
|
171
60
|
}
|
|
172
|
-
function
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return
|
|
178
|
-
? [value.packageId, value.trackingNumber].some((candidate) => text(candidate) === parcelId)
|
|
179
|
-
: [value.parcelNumber, value.parcelId].some((candidate) => text(candidate) === parcelId);
|
|
61
|
+
function canonicalFoxpostStatus(status) {
|
|
62
|
+
if (status === "HANDED_OVER")
|
|
63
|
+
return "ACCEPTED";
|
|
64
|
+
if (status === "AT_LOCKER")
|
|
65
|
+
return "AT_PICKUP_POINT";
|
|
66
|
+
return status;
|
|
180
67
|
}
|
|
181
68
|
function nested(value, key, nestedKey) {
|
|
182
69
|
const child = value[key];
|
|
@@ -187,4 +74,4 @@ function nested(value, key, nestedKey) {
|
|
|
187
74
|
function text(value) {
|
|
188
75
|
return value == null ? "" : String(value).trim();
|
|
189
76
|
}
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9va3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL21vZHVsZXMvc2hpcHBpbmcvd2ViaG9va3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFhQSxzREFPQztBQUVELGtEQTZEQztBQW5GRCw2Q0FBNkM7QUFDN0Msd0RBQTZEO0FBQzdELGdEQUFxRDtBQUVyRCx5Q0FJbUI7QUFLbkIsU0FBZ0IscUJBQXFCLENBQUMsUUFBaUI7SUFDckQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQTtJQUNwRCxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQzNCLE1BQU0sTUFBTSxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDM0QsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM3QixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQy9CLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUEsNkJBQWUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDdkQsQ0FBQztBQUVNLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsWUFBa0MsRUFDbEMsT0FBK0IsRUFDL0IsSUFBYSxFQUNiLGNBQTBDO0lBRTFDLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQzlDLENBQUMsQ0FBQyxJQUErQjtRQUNqQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBRU4sTUFBTSxRQUFRLEdBQUcsT0FBTyxLQUFLLFNBQVM7UUFDcEMsQ0FBQyxDQUFDLElBQUksQ0FDRixPQUFPLENBQUMsT0FBTztZQUNiLE9BQU8sQ0FB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
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import BackInStockService from "./service";
|
|
2
|
+
export declare const BACK_IN_STOCK_MODULE = "backInStock";
|
|
3
|
+
declare const _default: import("@medusajs/types").ModuleExports<typeof BackInStockService> & {
|
|
4
|
+
linkable: {
|
|
5
|
+
readonly backInStockSubscription: {
|
|
6
|
+
id: {
|
|
7
|
+
serviceName: "backInStock";
|
|
8
|
+
field: "backInStockSubscription";
|
|
9
|
+
linkable: "back_in_stock_subscription_id";
|
|
10
|
+
primaryKey: "id";
|
|
11
|
+
};
|
|
12
|
+
toJSON: () => {
|
|
13
|
+
serviceName: "backInStock";
|
|
14
|
+
field: "backInStockSubscription";
|
|
15
|
+
linkable: "back_in_stock_subscription_id";
|
|
16
|
+
primaryKey: "id";
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export default _default;
|
|
22
|
+
export { BackInStockService };
|
|
23
|
+
export { BACK_IN_STOCK_STATUSES } from "./models/back-in-stock-subscription";
|