@legenki/print2medusa 0.9.4 → 0.9.6
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 +12 -14
- package/.medusa/server/src/admin/index.mjs +12 -14
- package/.medusa/server/src/api/hooks/printful/[token]/route.js +21 -14
- package/.medusa/server/src/modules/printful/service.js +36 -12
- package/.medusa/server/src/subscribers/printful-webhook.js +25 -0
- package/.medusa/server/src/utils/webhook-events.js +9 -2
- package/.medusa/server/src/workflows/sync-products.js +364 -267
- package/package.json +9 -9
|
@@ -195,12 +195,12 @@ const PrintfulSyncWidget = () => {
|
|
|
195
195
|
void loadWebhook();
|
|
196
196
|
}, []);
|
|
197
197
|
react.useEffect(() => {
|
|
198
|
-
if (!
|
|
198
|
+
if (!status?.running) {
|
|
199
199
|
return;
|
|
200
200
|
}
|
|
201
201
|
const t = setInterval(() => void loadStatus(), 3e3);
|
|
202
202
|
return () => clearInterval(t);
|
|
203
|
-
}, [status
|
|
203
|
+
}, [status?.running]);
|
|
204
204
|
const onRegisterWebhook = async () => {
|
|
205
205
|
setRegistering(true);
|
|
206
206
|
try {
|
|
@@ -259,8 +259,8 @@ const PrintfulSyncWidget = () => {
|
|
|
259
259
|
setSyncing(false);
|
|
260
260
|
}
|
|
261
261
|
};
|
|
262
|
-
const latest = status
|
|
263
|
-
const running =
|
|
262
|
+
const latest = status?.latest_sync;
|
|
263
|
+
const running = status?.running === true;
|
|
264
264
|
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
265
265
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
266
266
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
@@ -317,7 +317,7 @@ const PrintfulSyncWidget = () => {
|
|
|
317
317
|
variant: "secondary",
|
|
318
318
|
onClick: () => void onRegisterWebhook(),
|
|
319
319
|
isLoading: registering,
|
|
320
|
-
disabled: webhookLoading || registering || !
|
|
320
|
+
disabled: webhookLoading || registering || !webhook?.secret_set,
|
|
321
321
|
children: "Register webhook"
|
|
322
322
|
}
|
|
323
323
|
)
|
|
@@ -379,7 +379,6 @@ const minutesSince = (iso) => {
|
|
|
379
379
|
return Math.floor((Date.now() - new Date(iso).getTime()) / 6e4);
|
|
380
380
|
};
|
|
381
381
|
const PrintfulPage = () => {
|
|
382
|
-
var _a, _b, _c;
|
|
383
382
|
const [syncs, setSyncs] = react.useState([]);
|
|
384
383
|
const [health, setHealth] = react.useState(null);
|
|
385
384
|
const [stats, setStats] = react.useState(null);
|
|
@@ -392,7 +391,6 @@ const PrintfulPage = () => {
|
|
|
392
391
|
const [loading, setLoading] = react.useState(true);
|
|
393
392
|
const [clearing, setClearing] = react.useState(false);
|
|
394
393
|
const load = react.useCallback(async () => {
|
|
395
|
-
var _a2;
|
|
396
394
|
const [h, w, s, d, b] = await Promise.allSettled([
|
|
397
395
|
fetch("/admin/printful/history", { credentials: "include" }),
|
|
398
396
|
fetch("/admin/printful/health", { credentials: "include" }),
|
|
@@ -409,7 +407,7 @@ const PrintfulPage = () => {
|
|
|
409
407
|
}
|
|
410
408
|
if (s.status === "fulfilled" && s.value.ok) {
|
|
411
409
|
const body = await s.value.json();
|
|
412
|
-
setStats(
|
|
410
|
+
setStats(body.statistics?.[0] ?? null);
|
|
413
411
|
}
|
|
414
412
|
if (d.status === "fulfilled" && d.value.ok) {
|
|
415
413
|
const body = await d.value.json();
|
|
@@ -446,7 +444,7 @@ const PrintfulPage = () => {
|
|
|
446
444
|
void loadPrompts();
|
|
447
445
|
}, [loadPrompts]);
|
|
448
446
|
const latest = syncs[0];
|
|
449
|
-
const running =
|
|
447
|
+
const running = latest?.status === "running";
|
|
450
448
|
react.useEffect(() => {
|
|
451
449
|
if (!running) {
|
|
452
450
|
return;
|
|
@@ -484,8 +482,8 @@ const PrintfulPage = () => {
|
|
|
484
482
|
setClearing(false);
|
|
485
483
|
}
|
|
486
484
|
};
|
|
487
|
-
const stuck = looksStuck(latest,
|
|
488
|
-
const silentFor = minutesSince(
|
|
485
|
+
const stuck = looksStuck(latest, health?.window ?? 60);
|
|
486
|
+
const silentFor = minutesSince(latest?.heartbeat_at ?? latest?.started_at);
|
|
489
487
|
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
490
488
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
491
489
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h1", children: "Printful" }),
|
|
@@ -526,13 +524,13 @@ const PrintfulPage = () => {
|
|
|
526
524
|
stats ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
527
525
|
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
528
526
|
"Paid orders: ",
|
|
529
|
-
|
|
527
|
+
stats.total_paid_orders?.value ?? "—"
|
|
530
528
|
] }),
|
|
531
529
|
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
532
530
|
"Profit: ",
|
|
533
|
-
|
|
531
|
+
stats.profit?.value ?? "—",
|
|
534
532
|
" ",
|
|
535
|
-
|
|
533
|
+
stats.currency?.toUpperCase() ?? ""
|
|
536
534
|
] })
|
|
537
535
|
] }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: loading ? "Loading…" : "Printful reported no statistics." })
|
|
538
536
|
] }),
|
|
@@ -194,12 +194,12 @@ const PrintfulSyncWidget = () => {
|
|
|
194
194
|
void loadWebhook();
|
|
195
195
|
}, []);
|
|
196
196
|
useEffect(() => {
|
|
197
|
-
if (!
|
|
197
|
+
if (!status?.running) {
|
|
198
198
|
return;
|
|
199
199
|
}
|
|
200
200
|
const t = setInterval(() => void loadStatus(), 3e3);
|
|
201
201
|
return () => clearInterval(t);
|
|
202
|
-
}, [status
|
|
202
|
+
}, [status?.running]);
|
|
203
203
|
const onRegisterWebhook = async () => {
|
|
204
204
|
setRegistering(true);
|
|
205
205
|
try {
|
|
@@ -258,8 +258,8 @@ const PrintfulSyncWidget = () => {
|
|
|
258
258
|
setSyncing(false);
|
|
259
259
|
}
|
|
260
260
|
};
|
|
261
|
-
const latest = status
|
|
262
|
-
const running =
|
|
261
|
+
const latest = status?.latest_sync;
|
|
262
|
+
const running = status?.running === true;
|
|
263
263
|
return /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
|
|
264
264
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
265
265
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -316,7 +316,7 @@ const PrintfulSyncWidget = () => {
|
|
|
316
316
|
variant: "secondary",
|
|
317
317
|
onClick: () => void onRegisterWebhook(),
|
|
318
318
|
isLoading: registering,
|
|
319
|
-
disabled: webhookLoading || registering || !
|
|
319
|
+
disabled: webhookLoading || registering || !webhook?.secret_set,
|
|
320
320
|
children: "Register webhook"
|
|
321
321
|
}
|
|
322
322
|
)
|
|
@@ -378,7 +378,6 @@ const minutesSince = (iso) => {
|
|
|
378
378
|
return Math.floor((Date.now() - new Date(iso).getTime()) / 6e4);
|
|
379
379
|
};
|
|
380
380
|
const PrintfulPage = () => {
|
|
381
|
-
var _a, _b, _c;
|
|
382
381
|
const [syncs, setSyncs] = useState([]);
|
|
383
382
|
const [health, setHealth] = useState(null);
|
|
384
383
|
const [stats, setStats] = useState(null);
|
|
@@ -391,7 +390,6 @@ const PrintfulPage = () => {
|
|
|
391
390
|
const [loading, setLoading] = useState(true);
|
|
392
391
|
const [clearing, setClearing] = useState(false);
|
|
393
392
|
const load = useCallback(async () => {
|
|
394
|
-
var _a2;
|
|
395
393
|
const [h, w, s, d, b] = await Promise.allSettled([
|
|
396
394
|
fetch("/admin/printful/history", { credentials: "include" }),
|
|
397
395
|
fetch("/admin/printful/health", { credentials: "include" }),
|
|
@@ -408,7 +406,7 @@ const PrintfulPage = () => {
|
|
|
408
406
|
}
|
|
409
407
|
if (s.status === "fulfilled" && s.value.ok) {
|
|
410
408
|
const body = await s.value.json();
|
|
411
|
-
setStats(
|
|
409
|
+
setStats(body.statistics?.[0] ?? null);
|
|
412
410
|
}
|
|
413
411
|
if (d.status === "fulfilled" && d.value.ok) {
|
|
414
412
|
const body = await d.value.json();
|
|
@@ -445,7 +443,7 @@ const PrintfulPage = () => {
|
|
|
445
443
|
void loadPrompts();
|
|
446
444
|
}, [loadPrompts]);
|
|
447
445
|
const latest = syncs[0];
|
|
448
|
-
const running =
|
|
446
|
+
const running = latest?.status === "running";
|
|
449
447
|
useEffect(() => {
|
|
450
448
|
if (!running) {
|
|
451
449
|
return;
|
|
@@ -483,8 +481,8 @@ const PrintfulPage = () => {
|
|
|
483
481
|
setClearing(false);
|
|
484
482
|
}
|
|
485
483
|
};
|
|
486
|
-
const stuck = looksStuck(latest,
|
|
487
|
-
const silentFor = minutesSince(
|
|
484
|
+
const stuck = looksStuck(latest, health?.window ?? 60);
|
|
485
|
+
const silentFor = minutesSince(latest?.heartbeat_at ?? latest?.started_at);
|
|
488
486
|
return /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
|
|
489
487
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
490
488
|
/* @__PURE__ */ jsx(Heading, { level: "h1", children: "Printful" }),
|
|
@@ -525,13 +523,13 @@ const PrintfulPage = () => {
|
|
|
525
523
|
stats ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
526
524
|
/* @__PURE__ */ jsxs(Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
527
525
|
"Paid orders: ",
|
|
528
|
-
|
|
526
|
+
stats.total_paid_orders?.value ?? "—"
|
|
529
527
|
] }),
|
|
530
528
|
/* @__PURE__ */ jsxs(Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
531
529
|
"Profit: ",
|
|
532
|
-
|
|
530
|
+
stats.profit?.value ?? "—",
|
|
533
531
|
" ",
|
|
534
|
-
|
|
532
|
+
stats.currency?.toUpperCase() ?? ""
|
|
535
533
|
] })
|
|
536
534
|
] }) : /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: loading ? "Loading…" : "Printful reported no statistics." })
|
|
537
535
|
] }),
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.POST = POST;
|
|
7
4
|
const utils_1 = require("@medusajs/framework/utils");
|
|
8
5
|
const printful_1 = require("../../../../modules/printful");
|
|
9
6
|
const webhook_events_1 = require("../../../../utils/webhook-events");
|
|
10
|
-
const
|
|
7
|
+
const utils_2 = require("@medusajs/framework/utils");
|
|
11
8
|
/**
|
|
12
9
|
* Public Printful webhook endpoint.
|
|
13
10
|
*
|
|
@@ -65,16 +62,26 @@ async function POST(req, res) {
|
|
|
65
62
|
res.status(200).json({ received: true, event_id: eventId, duplicate: true });
|
|
66
63
|
return;
|
|
67
64
|
}
|
|
68
|
-
res.status(200).json({ received: true, event_id: eventId });
|
|
69
65
|
if (handled) {
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
66
|
+
// Emitted before the response, not after. Emitting afterwards means a
|
|
67
|
+
// failure here — an unresolvable Event Bus, a broken transport — throws
|
|
68
|
+
// with the 200 already sent: an unhandled rejection Printful reads as
|
|
69
|
+
// success, and the event waits for the retry job with nothing logged.
|
|
70
|
+
//
|
|
71
|
+
// Failing to emit is not failing the webhook, though. The durable row is
|
|
72
|
+
// already written and the retry job picks it up, so this logs and still
|
|
73
|
+
// answers 200 rather than asking Printful to redeliver an event we hold.
|
|
74
|
+
try {
|
|
75
|
+
const eventBus = req.scope.resolve(utils_2.Modules.EVENT_BUS);
|
|
76
|
+
await eventBus.emit({
|
|
77
|
+
name: webhook_events_1.PRINTFUL_WEBHOOK_RECEIVED,
|
|
78
|
+
data: { event_row_id: event.id },
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
logger.error(`Printful: could not emit ${webhook_events_1.PRINTFUL_WEBHOOK_RECEIVED} for event ${eventId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
83
|
+
}
|
|
78
84
|
}
|
|
85
|
+
res.status(200).json({ received: true, event_id: eventId });
|
|
79
86
|
}
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2hvb2tzL3ByaW50ZnVsL1t0b2tlbl0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF1QkEsb0JBeUZDO0FBL0dELHFEQUFxRTtBQUNyRSwyREFBOEQ7QUFFOUQscUVBUXlDO0FBQ3pDLHFEQUFtRDtBQUduRDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDaEUsTUFBTSxRQUFRLEdBQTBCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDBCQUFlLENBQUMsQ0FBQTtJQUMxRSxNQUFNLE1BQU0sR0FBcUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2hFLGlDQUF5QixDQUFDLE1BQU0sQ0FDakMsQ0FBQTtJQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBRTNDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFBO0lBQ2pDLElBQUksQ0FBQyxJQUFBLG1DQUFrQixFQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN6RCxzREFBc0Q7UUFDdEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUM5QyxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQTJCLENBQUE7SUFDMUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUE7SUFDdEMsTUFBTSxlQUFlLEdBQUcsSUFBQSwrQkFBYyxFQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRS9DLElBQUksQ0FBQyxlQUFlLEVB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
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.MAX_WEBHOOK_ATTEMPTS = exports.PENDING_PRINTFUL_ORDER_ID = void 0;
|
|
6
|
+
exports.MAX_WEBHOOK_ATTEMPTS = exports.MIN_WEBHOOK_SECRET_LENGTH = exports.PENDING_PRINTFUL_ORDER_ID = void 0;
|
|
7
7
|
exports.nextRetryDelayMs = nextRetryDelayMs;
|
|
8
8
|
exports.lockKeyFor = lockKeyFor;
|
|
9
9
|
exports.isUniqueViolation = isUniqueViolation;
|
|
@@ -23,6 +23,13 @@ const printful_webhook_event_1 = __importDefault(require("./models/printful-webh
|
|
|
23
23
|
* the concurrent-claim race; tests/order-link.test.ts guards the pairing.
|
|
24
24
|
*/
|
|
25
25
|
exports.PENDING_PRINTFUL_ORDER_ID = "pending";
|
|
26
|
+
/**
|
|
27
|
+
* Shortest webhook secret the module will start with.
|
|
28
|
+
*
|
|
29
|
+
* The secret is the sole authentication for the public webhook endpoint, so
|
|
30
|
+
* its length is what stands between a stranger and forged shipment events.
|
|
31
|
+
*/
|
|
32
|
+
exports.MIN_WEBHOOK_SECRET_LENGTH = 32;
|
|
26
33
|
/** Attempts before an event is parked as permanently failed. */
|
|
27
34
|
exports.MAX_WEBHOOK_ATTEMPTS = 20;
|
|
28
35
|
/** Backoff: 5 minutes doubling per attempt, capped at 6 hours. */
|
|
@@ -32,19 +39,21 @@ function nextRetryDelayMs(attempts) {
|
|
|
32
39
|
return Math.min(FIVE_MINUTES * Math.pow(2, attempts), SIX_HOURS);
|
|
33
40
|
}
|
|
34
41
|
/**
|
|
35
|
-
* Stable
|
|
42
|
+
* Stable 64-bit key for pg_advisory_xact_lock, derived from the order id.
|
|
36
43
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
44
|
+
* Returned as two signed 32-bit halves because that is the shape the
|
|
45
|
+
* two-argument form takes — `pg_advisory_xact_lock(int4, int4)` — and
|
|
46
|
+
* readInt32BE yields exactly that width. The order id itself never reaches
|
|
47
|
+
* SQL; only these two numbers do, as bind parameters.
|
|
40
48
|
*
|
|
41
|
-
* 32 bits
|
|
42
|
-
*
|
|
43
|
-
*
|
|
49
|
+
* The single-argument form was 32 bits, where distinct orders collided at
|
|
50
|
+
* roughly 2 per 200k ids. A collision only serialized two unrelated orders,
|
|
51
|
+
* which is slower rather than wrong — but 64 bits makes it not worth thinking
|
|
52
|
+
* about, for one extra bind parameter.
|
|
44
53
|
*/
|
|
45
54
|
function lockKeyFor(printfulOrderId) {
|
|
46
55
|
const digest = (0, crypto_1.createHash)("sha256").update(String(printfulOrderId)).digest();
|
|
47
|
-
return digest.readInt32BE(0);
|
|
56
|
+
return [digest.readInt32BE(0), digest.readInt32BE(4)];
|
|
48
57
|
}
|
|
49
58
|
/**
|
|
50
59
|
* Detect a Postgres unique-constraint violation (SQLSTATE 23505) regardless of
|
|
@@ -94,6 +103,21 @@ class PrintfulModuleService extends (0, utils_1.MedusaService)({
|
|
|
94
103
|
super(...arguments);
|
|
95
104
|
this.client_ = null;
|
|
96
105
|
this.options_ = options ?? {};
|
|
106
|
+
// The secret is the whole authentication for the public webhook endpoint:
|
|
107
|
+
// it sits in the URL path and anyone who guesses it can post forged
|
|
108
|
+
// shipment events. Verification is already constant-time, so length is
|
|
109
|
+
// what remains — 32 characters puts brute force out of reach.
|
|
110
|
+
//
|
|
111
|
+
// Refused at construction rather than at the first request. A too-short
|
|
112
|
+
// secret is a misconfiguration, and failing at boot surfaces it while
|
|
113
|
+
// someone is watching, instead of leaving a weak endpoint live.
|
|
114
|
+
//
|
|
115
|
+
// Only checked when set: the option is optional, and a deployment that
|
|
116
|
+
// never registers a webhook is entitled to omit it.
|
|
117
|
+
const secret = this.options_.webhookSecret;
|
|
118
|
+
if (secret !== undefined && secret.length < exports.MIN_WEBHOOK_SECRET_LENGTH) {
|
|
119
|
+
throw new Error(`Printful webhookSecret must be at least ${exports.MIN_WEBHOOK_SECRET_LENGTH} characters (got ${secret.length}).`);
|
|
120
|
+
}
|
|
97
121
|
}
|
|
98
122
|
async getOptions() {
|
|
99
123
|
return this.options_;
|
|
@@ -206,9 +230,9 @@ class PrintfulModuleService extends (0, utils_1.MedusaService)({
|
|
|
206
230
|
* pg_advisory_xact_lock is released by Postgres on commit or rollback.
|
|
207
231
|
*/
|
|
208
232
|
async withOrderLock(printfulOrderId, fn) {
|
|
209
|
-
const
|
|
233
|
+
const keys = lockKeyFor(printfulOrderId);
|
|
210
234
|
return this.baseRepository_.transaction(async (txManager) => {
|
|
211
|
-
await txManager.execute("select pg_advisory_xact_lock(?)",
|
|
235
|
+
await txManager.execute("select pg_advisory_xact_lock(?, ?)", keys);
|
|
212
236
|
return await fn();
|
|
213
237
|
});
|
|
214
238
|
}
|
|
@@ -347,4 +371,4 @@ class PrintfulModuleService extends (0, utils_1.MedusaService)({
|
|
|
347
371
|
}
|
|
348
372
|
}
|
|
349
373
|
exports.default = PrintfulModuleService;
|
|
350
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ByaW50ZnVsL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBZ0RBLDRDQUlDO0FBYUQsZ0NBR0M7QUFpQkQsOENBMkJDO0FBaEhELHFEQUF5RDtBQUN6RCxtQ0FBbUM7QUFDbkMsaUVBQTREO0FBRTVELHVGQUE0RDtBQUM1RCwyRkFBZ0U7QUFDaEUsbUZBQXdEO0FBQ3hELDJGQUFnRTtBQUNoRSw2RkFBa0U7QUEyQmxFOzs7Ozs7R0FNRztBQUNVLFFBQUEseUJBQXlCLEdBQUcsU0FBUyxDQUFBO0FBRWxELGdFQUFnRTtBQUNuRCxRQUFBLG9CQUFvQixHQUFHLEVBQUUsQ0FBQTtBQUV0QyxrRUFBa0U7QUFDbEUsU0FBZ0IsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDL0MsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7SUFDbEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBO0lBQ3BDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFDbEUsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixVQUFVLENBQUMsZUFBdUI7SUFDaEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUM1RSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsR0FB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
|
|
374
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ByaW50ZnVsL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBd0RBLDRDQUlDO0FBZUQsZ0NBR0M7QUFpQkQsOENBMkJDO0FBMUhELHFEQUF5RDtBQUN6RCxtQ0FBbUM7QUFDbkMsaUVBQTREO0FBRTVELHVGQUE0RDtBQUM1RCwyRkFBZ0U7QUFDaEUsbUZBQXdEO0FBQ3hELDJGQUFnRTtBQUNoRSw2RkFBa0U7QUEyQmxFOzs7Ozs7R0FNRztBQUNVLFFBQUEseUJBQXlCLEdBQUcsU0FBUyxDQUFBO0FBRWxEOzs7OztHQUtHO0FBQ1UsUUFBQSx5QkFBeUIsR0FBRyxFQUFFLENBQUE7QUFFM0MsZ0VBQWdFO0FBQ25ELFFBQUEsb0JBQW9CLEdBQUcsRUFBRSxDQUFBO0FBRXRDLGtFQUFrRTtBQUNsRSxTQUFnQixnQkFBZ0IsQ0FBQyxRQUFnQjtJQUMvQyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQTtJQUNsQyxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7SUFDcEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQTtBQUNsRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLGVBQXVCO0lBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDNUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxD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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = void 0;
|
|
7
|
+
exports.default = printfulWebhookReceivedHandler;
|
|
8
|
+
const apply_order_status_1 = __importDefault(require("../workflows/apply-order-status"));
|
|
9
|
+
const webhook_events_1 = require("../utils/webhook-events");
|
|
10
|
+
async function printfulWebhookReceivedHandler({ event: { data }, container, }) {
|
|
11
|
+
const logger = container.resolve("logger");
|
|
12
|
+
try {
|
|
13
|
+
await (0, apply_order_status_1.default)(container).run({
|
|
14
|
+
input: { event_row_id: data.event_row_id },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
logger.error(`Printful: apply failed for event_row_id ${data.event_row_id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
19
|
+
throw err;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.config = {
|
|
23
|
+
event: webhook_events_1.PRINTFUL_WEBHOOK_RECEIVED,
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRmdWwtd2ViaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9wcmludGZ1bC13ZWJob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUlBLGlEQWlCQztBQXBCRCx5RkFBc0U7QUFDdEUsNERBQW1FO0FBRXBELEtBQUssVUFBVSw4QkFBOEIsQ0FBQyxFQUMzRCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFDZixTQUFTLEdBQ2dDO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDMUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFBLDRCQUF3QixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUM1QyxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtTQUMzQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxLQUFLLENBQ1YsMkNBQTJDLElBQUksQ0FBQyxZQUFZLEtBQzFELEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2pELEVBQUUsQ0FDSCxDQUFBO1FBQ0QsTUFBTSxHQUFHLENBQUE7SUFDWCxDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsMENBQXlCO0NBQ2pDLENBQUEifQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PRINTFUL_WEBHOOK_TYPES = void 0;
|
|
3
|
+
exports.PRINTFUL_WEBHOOK_TYPES = exports.PRINTFUL_WEBHOOK_RECEIVED = void 0;
|
|
4
4
|
exports.verifyWebhookToken = verifyWebhookToken;
|
|
5
5
|
exports.payloadFingerprint = payloadFingerprint;
|
|
6
6
|
exports.extractOrderId = extractOrderId;
|
|
@@ -23,6 +23,13 @@ function verifyWebhookToken(configured, provided) {
|
|
|
23
23
|
const b = (0, crypto_1.createHash)("sha256").update(provided).digest();
|
|
24
24
|
return (0, crypto_1.timingSafeEqual)(a, b);
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* The internal Medusa event the webhook route emits and the subscriber listens
|
|
28
|
+
* for. Shared so the two cannot drift apart — a typo on either side would be
|
|
29
|
+
* silent: the route would answer 200, the subscriber would never fire, and the
|
|
30
|
+
* event would only be applied by the retry job.
|
|
31
|
+
*/
|
|
32
|
+
exports.PRINTFUL_WEBHOOK_RECEIVED = "printful.webhook.received";
|
|
26
33
|
/** Event types we register with Printful. order_updated is noisy and opt-in. */
|
|
27
34
|
exports.PRINTFUL_WEBHOOK_TYPES = [
|
|
28
35
|
"package_shipped",
|
|
@@ -114,4 +121,4 @@ function deriveEventId(payload) {
|
|
|
114
121
|
.update(`${type}|${orderId}|${discriminator}|${timeKey}`)
|
|
115
122
|
.digest("hex");
|
|
116
123
|
}
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay1ldmVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvd2ViaG9vay1ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsZ0RBYUM7QUF3REQsZ0RBRUM7QUFFRCx3Q0FHQztBQUVELDhDQVNDO0FBaUJELHNDQWlDQztBQWhKRCxtQ0FBb0Q7QUFFcEQ7Ozs7R0FJRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxVQUFxQyxFQUNyQyxRQUFtQztJQUVuQyxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuRSxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUMxRCxNQUFNLENBQUMsR0FBRyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ3hELE9BQU8sSUFBQSx3QkFBZSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUM5QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDVSxRQUFBLHlCQUF5QixHQUFHLDJCQUEyQixDQUFBO0FBRXBFLGdGQUFnRjtBQUNuRSxRQUFBLHNCQUFzQixHQUFHO0lBQ3BDLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtDQUNWLENBQUE7QUFVVjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUE7QUFFbEMsZ0ZBQWdGO0FBQ2hGLFNBQVMsWUFB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
|