medusa-plugin-printify 0.1.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.
Files changed (39) hide show
  1. package/.medusa/server/jest.config.js +20 -0
  2. package/.medusa/server/jest.setup.js +4 -0
  3. package/.medusa/server/src/admin/index.js +472 -0
  4. package/.medusa/server/src/admin/index.mjs +473 -0
  5. package/.medusa/server/src/api/admin/plugin/route.js +7 -0
  6. package/.medusa/server/src/api/admin/printify/orders/[id]/submit/route.js +19 -0
  7. package/.medusa/server/src/api/admin/printify/orders/route.js +18 -0
  8. package/.medusa/server/src/api/admin/printify/products/[id]/route.js +113 -0
  9. package/.medusa/server/src/api/admin/printify/products/route.js +35 -0
  10. package/.medusa/server/src/api/admin/printify/shops/route.js +18 -0
  11. package/.medusa/server/src/api/middlewares.js +12 -0
  12. package/.medusa/server/src/api/store/plugin/route.js +7 -0
  13. package/.medusa/server/src/api/webhooks/printify/route.js +102 -0
  14. package/.medusa/server/src/jobs/auto-submit-orders-job.js +31 -0
  15. package/.medusa/server/src/jobs/sync-products-job.js +23 -0
  16. package/.medusa/server/src/lib/webhook-utils.js +13 -0
  17. package/.medusa/server/src/links/printify-order-medusa-order.js +10 -0
  18. package/.medusa/server/src/links/printify-product-medusa-product.js +10 -0
  19. package/.medusa/server/src/modules/printify/api-client.js +67 -0
  20. package/.medusa/server/src/modules/printify/index.js +13 -0
  21. package/.medusa/server/src/modules/printify/migrations/Migration20260305115907.js +21 -0
  22. package/.medusa/server/src/modules/printify/migrations/Migration20260313185144.js +14 -0
  23. package/.medusa/server/src/modules/printify/models/order.js +18 -0
  24. package/.medusa/server/src/modules/printify/models/product.js +22 -0
  25. package/.medusa/server/src/modules/printify/models/shop.js +11 -0
  26. package/.medusa/server/src/modules/printify/service.js +38 -0
  27. package/.medusa/server/src/modules/printify/types.js +3 -0
  28. package/.medusa/server/src/subscribers/order-placed.js +55 -0
  29. package/.medusa/server/src/subscribers/plugin-registered.js +37 -0
  30. package/.medusa/server/src/utils/build-variant-prices.js +17 -0
  31. package/.medusa/server/src/utils/currency-converter.js +46 -0
  32. package/.medusa/server/src/workflows/create-printify-order.js +86 -0
  33. package/.medusa/server/src/workflows/index.js +12 -0
  34. package/.medusa/server/src/workflows/option-mapper.js +64 -0
  35. package/.medusa/server/src/workflows/submit-printify-order.js +29 -0
  36. package/.medusa/server/src/workflows/sync-products.js +313 -0
  37. package/.medusa/server/src/workflows/sync-shops.js +30 -0
  38. package/README.md +253 -0
  39. package/package.json +78 -0
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ exports.POST = POST;
5
+ const printify_1 = require("../../../../modules/printify");
6
+ // GET /admin/printify/products
7
+ async function GET(req, res) {
8
+ const service = req.scope.resolve(printify_1.PRINTIFY_MODULE);
9
+ const { shop_id, is_published, limit = "50", offset = "0" } = req.query;
10
+ const filters = {};
11
+ if (shop_id)
12
+ filters.shop_id = shop_id;
13
+ if (is_published !== undefined)
14
+ filters.is_published = is_published === "true";
15
+ const products = await service.listPrintifyProducts(filters);
16
+ const paginated = products.slice(Number(offset), Number(offset) + Number(limit));
17
+ res.json({
18
+ products: paginated,
19
+ count: products.length,
20
+ offset: Number(offset),
21
+ limit: Number(limit),
22
+ });
23
+ }
24
+ // POST /admin/printify/products — trigger product sync
25
+ async function POST(req, res) {
26
+ const service = req.scope.resolve(printify_1.PRINTIFY_MODULE);
27
+ const { shopId } = service.getOptions();
28
+ if (!shopId) {
29
+ return res.status(400).json({ error: "No shopId configured in plugin options" });
30
+ }
31
+ const { syncProductsWorkflow } = await import("../../../../workflows/sync-products.js");
32
+ const { result } = await syncProductsWorkflow(req.scope).run({ input: { shopId } });
33
+ res.json(result);
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3ByaW50aWZ5L3Byb2R1Y3RzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBS0Esa0JBb0JDO0FBR0Qsb0JBV0M7QUF0Q0QsMkRBQThEO0FBRzlELCtCQUErQjtBQUN4QixLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQWtCLEVBQUUsR0FBbUI7SUFDL0QsTUFBTSxPQUFPLEdBQTBCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDBCQUFlLENBQUMsQ0FBQTtJQUN6RSxNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEdBQUcsSUFBSSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FHakUsQ0FBQTtJQUVELE1BQU0sT0FBTyxHQUE0QixFQUFFLENBQUE7SUFDM0MsSUFBSSxPQUFPO1FBQUUsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7SUFDdEMsSUFBSSxZQUFZLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxZQUFZLEdBQUcsWUFBWSxLQUFLLE1BQU0sQ0FBQTtJQUU5RSxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM1RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFFaEYsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLFFBQVEsRUFBRSxTQUFTO1FBQ25CLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN0QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN0QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztLQUNyQixDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsdURBQXVEO0FBQ2hELEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLE9BQU8sR0FBMEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsMEJBQWUsQ0FBQyxDQUFBO0lBQ3pFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUE7SUFFdkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSx3Q0FBd0MsRUFBRSxDQUFDLENBQUE7SUFDbEYsQ0FBQztJQUVELE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHdDQUF3QyxDQUFDLENBQUE7SUFDdkYsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNuRixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ2xCLENBQUMifQ==
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ exports.POST = POST;
5
+ const printify_1 = require("../../../../modules/printify");
6
+ // GET /admin/printify/shops — list synced shops
7
+ async function GET(req, res) {
8
+ const service = req.scope.resolve(printify_1.PRINTIFY_MODULE);
9
+ const shops = await service.listPrintifyShops();
10
+ res.json({ shops });
11
+ }
12
+ // POST /admin/printify/shops — trigger shop sync from Printify API
13
+ async function POST(req, res) {
14
+ const { syncShopsWorkflow } = await import("../../../../workflows/sync-shops.js");
15
+ const { result } = await syncShopsWorkflow(req.scope).run({ input: {} });
16
+ res.json(result);
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3ByaW50aWZ5L3Nob3BzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBS0Esa0JBSUM7QUFHRCxvQkFJQztBQWZELDJEQUE4RDtBQUc5RCxnREFBZ0Q7QUFDekMsS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQy9ELE1BQU0sT0FBTyxHQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQywwQkFBZSxDQUFDLENBQUE7SUFDekUsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtJQUMvQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtBQUNyQixDQUFDO0FBRUQsbUVBQW1FO0FBQzVELEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBQ2pGLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN4RSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQ2xCLENBQUMifQ==
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.config = {
5
+ routes: [
6
+ {
7
+ matcher: "/webhooks/printify",
8
+ bodyParser: { preserveRawBody: true },
9
+ },
10
+ ],
11
+ };
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVhLFFBQUEsTUFBTSxHQUFzQjtJQUN2QyxNQUFNLEVBQUU7UUFDTjtZQUNFLE9BQU8sRUFBRSxvQkFBb0I7WUFDN0IsVUFBVSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRTtTQUN0QztLQUNGO0NBQ0YsQ0FBQSJ9
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = GET;
4
+ async function GET(req, res) {
5
+ res.sendStatus(200);
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BsdWdpbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLGtCQUtDO0FBTE0sS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixDQUFDIn0=
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = POST;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const printify_1 = require("../../../modules/printify");
6
+ const webhook_utils_1 = require("../../../lib/webhook-utils");
7
+ const sync_products_1 = require("../../../workflows/sync-products");
8
+ async function POST(req, res) {
9
+ const service = req.scope.resolve(printify_1.PRINTIFY_MODULE);
10
+ const { webhookSecret } = service.getOptions();
11
+ const signature = req.headers["x-pfy-signature"];
12
+ // Prefer the raw body captured by the bodyParser middleware (preserveRawBody: true)
13
+ // to ensure HMAC verification uses the exact bytes Printify signed.
14
+ // Fall back to re-serialized JSON only if rawBody was not captured.
15
+ const rawBody = req.rawBody ?? JSON.stringify(req.body);
16
+ if (!(0, webhook_utils_1.verifyPrintifySignature)(rawBody, signature ?? "", webhookSecret)) {
17
+ return res.status(401).json({ error: "Invalid signature" });
18
+ }
19
+ const body = req.body;
20
+ try {
21
+ switch (body.type) {
22
+ case "order:status-changed":
23
+ case "order:sent-to-production":
24
+ case "order:shipped":
25
+ case "order:shipment:delivered":
26
+ await handleOrderEvent(body, service);
27
+ break;
28
+ case "product:updated":
29
+ case "product:deleted":
30
+ await handleProductEvent(body, service, req.scope);
31
+ break;
32
+ case "shop:disconnected":
33
+ await handleShopDisconnected(body, service);
34
+ break;
35
+ default:
36
+ console.warn(`[printify] webhook: unhandled event type: ${body.type}`);
37
+ }
38
+ res.sendStatus(200);
39
+ }
40
+ catch (err) {
41
+ console.error("[printify] webhook handler error:", err);
42
+ res.status(500).json({ error: "Internal error" });
43
+ }
44
+ }
45
+ async function handleOrderEvent(body, service) {
46
+ const printifyOrderId = String(body.resource.id);
47
+ const status = body.resource.data?.status ??
48
+ body.type.split(":").pop() ??
49
+ "unknown";
50
+ const orders = await service.listPrintifyOrders({ printify_id: printifyOrderId });
51
+ if (orders.length > 0) {
52
+ await service.updatePrintifyOrders({ selector: { printify_id: printifyOrderId }, data: { status } });
53
+ }
54
+ }
55
+ async function handleProductEvent(body, service, container) {
56
+ if (body.type === "product:deleted") {
57
+ const printifyId = String(body.resource.id);
58
+ await service.updatePrintifyProducts({
59
+ selector: { printify_id: printifyId },
60
+ data: { is_published: false },
61
+ });
62
+ // Also draft the linked Medusa product so it's removed from the storefront
63
+ try {
64
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
65
+ const { data } = await query.graph({
66
+ entity: "printify_product",
67
+ fields: ["product.id"],
68
+ filters: { printify_id: printifyId },
69
+ });
70
+ if (data.length > 0 && data[0].product?.id) {
71
+ const productModuleService = container.resolve(utils_1.Modules.PRODUCT);
72
+ await productModuleService.updateProducts(data[0].product.id, { status: "draft" });
73
+ console.log(`[printify] webhook: drafted Medusa product ${data[0].product.id} after Printify deletion`);
74
+ }
75
+ }
76
+ catch (err) {
77
+ console.warn(`[printify] webhook: failed to draft Medusa product for printify_id ${printifyId}: ${err}`);
78
+ }
79
+ console.log(`[printify] webhook: product deleted: ${body.resource.id}`);
80
+ return;
81
+ }
82
+ // product:updated — re-sync this single product via the full workflow
83
+ // This fetches latest data from Printify, upserts the printify_product,
84
+ // and creates/updates the linked Medusa product
85
+ console.log(`[printify] webhook: product updated: ${body.resource.id}, triggering sync`);
86
+ try {
87
+ await (0, sync_products_1.syncProductsWorkflow)(container).run({
88
+ input: { shopId: body.shop_id },
89
+ });
90
+ }
91
+ catch (err) {
92
+ console.error(`[printify] webhook: failed to sync after product:updated: ${err}`);
93
+ }
94
+ }
95
+ async function handleShopDisconnected(body, service) {
96
+ console.warn(`[printify] webhook: shop disconnected: ${body.shop_id}`);
97
+ await service.updatePrintifyShops({
98
+ selector: { printify_id: String(body.shop_id) },
99
+ data: { sales_channel_id: null },
100
+ });
101
+ }
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3dlYmhvb2tzL3ByaW50aWZ5L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa0JBLG9CQTJDQztBQTNERCxxREFBOEU7QUFDOUUsd0RBQTJEO0FBRTNELDhEQUFvRTtBQUNwRSxvRUFBdUU7QUFZaEUsS0FBSyxVQUFVLElBQUksQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQ2hFLE1BQU0sT0FBTyxHQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQywwQkFBZSxDQUFDLENBQUE7SUFDekUsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUU5QyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFXLENBQUE7SUFDMUQsb0ZBQW9GO0lBQ3BGLG9FQUFvRTtJQUNwRSxvRUFBb0U7SUFDcEUsTUFBTSxPQUFPLEdBQUksR0FBRyxDQUFDLE9BQThCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFL0UsSUFBSSxDQUFDLElBQUEsdUNBQXVCLEVBQUMsT0FBTyxFQUFFLFNBQVMsSUFBSSxFQUFFLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN0RSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQTtJQUM3RCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQTJCLENBQUE7SUFFNUMsSUFBSSxDQUFDO1FBQ0gsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsS0FBSyxzQkFBc0IsQ0FBQztZQUM1QixLQUFLLDBCQUEwQixDQUFDO1lBQ2hDLEtBQUssZUFBZSxDQUFD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
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = autoSubmitOrdersJob;
5
+ const printify_1 = require("../modules/printify");
6
+ const submit_printify_order_1 = require("../workflows/submit-printify-order");
7
+ async function autoSubmitOrdersJob(container) {
8
+ const service = container.resolve(printify_1.PRINTIFY_MODULE);
9
+ const { shopId } = service.getOptions();
10
+ if (!shopId) {
11
+ console.warn("[printify] auto-submit-orders-job: no shopId configured, skipping");
12
+ return;
13
+ }
14
+ const pendingOrders = await service.listPrintifyOrders({ status: "pending" });
15
+ for (const order of pendingOrders) {
16
+ try {
17
+ await (0, submit_printify_order_1.submitPrintifyOrderWorkflow)(container).run({
18
+ input: { localOrderId: order.id, shopId },
19
+ });
20
+ console.log(`[printify] auto-submit-orders-job: submitted order ${order.id}`);
21
+ }
22
+ catch (err) {
23
+ console.error(`[printify] auto-submit-orders-job: failed for order ${order.id}:`, err);
24
+ }
25
+ }
26
+ }
27
+ exports.config = {
28
+ name: "printify-auto-submit-orders",
29
+ schedule: "*/5 * * * *",
30
+ };
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1zdWJtaXQtb3JkZXJzLWpvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL2F1dG8tc3VibWl0LW9yZGVycy1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0Esc0NBd0JDO0FBNUJELGtEQUFxRDtBQUVyRCw4RUFBZ0Y7QUFFakUsS0FBSyxVQUFVLG1CQUFtQixDQUFDLFNBQTBCO0lBQzFFLE1BQU0sT0FBTyxHQUEwQixTQUFTLENBQUMsT0FBTyxDQUFDLDBCQUFlLENBQUMsQ0FBQTtJQUN6RSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBRXZDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUVBQW1FLENBQUMsQ0FBQTtRQUNqRixPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFFN0UsS0FBSyxNQUFNLEtBQUssSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUEsbURBQTJCLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUMvQyxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQVksRUFBRSxNQUFNLEVBQUU7YUFDcEQsQ0FBQyxDQUFBO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzREFBc0QsS0FBSyxDQUFDLEVBQVksRUFBRSxDQUFDLENBQUE7UUFDekYsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsS0FBSyxDQUNYLHVEQUF1RCxLQUFLLENBQUMsRUFBWSxHQUFHLEVBQzVFLEdBQUcsQ0FDSixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFLDZCQUE2QjtJQUNuQyxRQUFRLEVBQUUsYUFBYTtDQUN4QixDQUFBIn0=
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = syncProductsJob;
5
+ const sync_products_1 = require("../workflows/sync-products");
6
+ const printify_1 = require("../modules/printify");
7
+ async function syncProductsJob(container) {
8
+ const service = container.resolve(printify_1.PRINTIFY_MODULE);
9
+ const { shopId } = service.getOptions();
10
+ if (!shopId) {
11
+ console.warn("[printify] sync-products-job: no shopId configured, skipping");
12
+ return;
13
+ }
14
+ const { result } = await (0, sync_products_1.syncProductsWorkflow)(container).run({
15
+ input: { shopId },
16
+ });
17
+ console.log(`[printify] sync-products-job: created ${result.created}, updated ${result.updated} Medusa products`);
18
+ }
19
+ exports.config = {
20
+ name: "printify-sync-products",
21
+ schedule: "0 * * * *",
22
+ };
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0cy1qb2IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9zeW5jLXByb2R1Y3RzLWpvYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxrQ0FjQztBQWxCRCw4REFBaUU7QUFDakUsa0RBQXFEO0FBR3RDLEtBQUssVUFBVSxlQUFlLENBQUMsU0FBMEI7SUFDdEUsTUFBTSxPQUFPLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQUMsMEJBQWUsQ0FBQyxDQUFBO0lBQ3pFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUE7SUFFdkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyw4REFBOEQsQ0FBQyxDQUFBO1FBQzVFLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSxvQ0FBb0IsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDM0QsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFO0tBQ2xCLENBQUMsQ0FBQTtJQUVGLE9BQU8sQ0FBQyxHQUFHLENBQUMseUNBQXlDLE1BQU0sQ0FBQyxPQUFPLGFBQWEsTUFBTSxDQUFDLE9BQU8sa0JBQWtCLENBQUMsQ0FBQTtBQUNuSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFLHdCQUF3QjtJQUM5QixRQUFRLEVBQUUsV0FBVztDQUN0QixDQUFBIn0=
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyPrintifySignature = verifyPrintifySignature;
4
+ const crypto_1 = require("crypto");
5
+ function verifyPrintifySignature(payload, signature, secret) {
6
+ const expected = (0, crypto_1.createHmac)("sha256", secret).update(payload).digest("hex");
7
+ // Guard against RangeError: timingSafeEqual requires equal-length buffers
8
+ if (signature.length !== expected.length) {
9
+ return false;
10
+ }
11
+ return (0, crypto_1.timingSafeEqual)(Buffer.from(signature), Buffer.from(expected));
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvd2ViaG9vay11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLDBEQWFDO0FBZkQsbUNBQW9EO0FBRXBELFNBQWdCLHVCQUF1QixDQUNyQyxPQUFlLEVBQ2YsU0FBaUIsRUFDakIsTUFBYztJQUVkLE1BQU0sUUFBUSxHQUFHLElBQUEsbUJBQVUsRUFBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUUzRSwwRUFBMEU7SUFDMUUsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxPQUFPLElBQUEsd0JBQWUsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtBQUN2RSxDQUFDIn0=
@@ -0,0 +1,10 @@
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
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const printify_1 = __importDefault(require("../modules/printify"));
8
+ const order_1 = __importDefault(require("@medusajs/medusa/order"));
9
+ exports.default = (0, utils_1.defineLink)(printify_1.default.linkable.printifyOrder, order_1.default.linkable.order);
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRpZnktb3JkZXItbWVkdXNhLW9yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpbmtzL3ByaW50aWZ5LW9yZGVyLW1lZHVzYS1vcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUFzRDtBQUN0RCxtRUFBZ0Q7QUFDaEQsbUVBQWdEO0FBRWhELGtCQUFlLElBQUEsa0JBQVUsRUFDdkIsa0JBQWMsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUNyQyxlQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FDM0IsQ0FBQSJ9
@@ -0,0 +1,10 @@
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
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const printify_1 = __importDefault(require("../modules/printify"));
8
+ const product_1 = __importDefault(require("@medusajs/medusa/product"));
9
+ exports.default = (0, utils_1.defineLink)(printify_1.default.linkable.printifyProduct, product_1.default.linkable.product);
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRpZnktcHJvZHVjdC1tZWR1c2EtcHJvZHVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saW5rcy9wcmludGlmeS1wcm9kdWN0LW1lZHVzYS1wcm9kdWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQXNEO0FBQ3RELG1FQUFnRDtBQUNoRCx1RUFBb0Q7QUFFcEQsa0JBQWUsSUFBQSxrQkFBVSxFQUN2QixrQkFBYyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQ3ZDLGlCQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FDL0IsQ0FBQSJ9
@@ -0,0 +1,67 @@
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.PrintifyApiClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ class PrintifyApiClient {
9
+ constructor(apiKey) {
10
+ this.client = axios_1.default.create({
11
+ baseURL: "https://api.printify.com/v1",
12
+ headers: {
13
+ Authorization: `Bearer ${apiKey}`,
14
+ "Content-Type": "application/json",
15
+ },
16
+ });
17
+ this.client.interceptors.response.use((response) => response, (error) => {
18
+ const status = error.response?.status ?? 0;
19
+ const detail = error.response?.data;
20
+ const message = `Printify API error ${status}: ${JSON.stringify(detail)}`;
21
+ return Promise.reject(new Error(message));
22
+ });
23
+ }
24
+ async getShops() {
25
+ const { data } = await this.client.get("/shops.json");
26
+ return data;
27
+ }
28
+ async getProducts(shopId, page = 1, limit = 50) {
29
+ const { data } = await this.client.get(`/shops/${shopId}/products.json`, {
30
+ params: { page, limit },
31
+ });
32
+ return data;
33
+ }
34
+ async getProduct(shopId, productId) {
35
+ const { data } = await this.client.get(`/shops/${shopId}/products/${productId}.json`);
36
+ return data;
37
+ }
38
+ async createOrder(shopId, payload) {
39
+ const { data } = await this.client.post(`/shops/${shopId}/orders.json`, payload);
40
+ return data;
41
+ }
42
+ async submitOrder(shopId, orderId) {
43
+ const { data } = await this.client.post(`/shops/${shopId}/orders/${orderId}/send_to_production.json`);
44
+ return data;
45
+ }
46
+ async getOrder(shopId, orderId) {
47
+ const { data } = await this.client.get(`/shops/${shopId}/orders/${orderId}.json`);
48
+ return data;
49
+ }
50
+ async calculateShipping(shopId, payload) {
51
+ const { data } = await this.client.post(`/shops/${shopId}/orders/shipping.json`, payload);
52
+ return data;
53
+ }
54
+ async getWebhooks(shopId) {
55
+ const { data } = await this.client.get(`/shops/${shopId}/webhooks.json`);
56
+ return data;
57
+ }
58
+ async createWebhook(shopId, topic, url) {
59
+ const { data } = await this.client.post(`/shops/${shopId}/webhooks.json`, { topic, url });
60
+ return data;
61
+ }
62
+ async deleteWebhook(shopId, webhookId) {
63
+ await this.client.delete(`/shops/${shopId}/webhooks/${webhookId}.json`);
64
+ }
65
+ }
66
+ exports.PrintifyApiClient = PrintifyApiClient;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ByaW50aWZ5L2FwaS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTRDO0FBeUc1QyxNQUFhLGlCQUFpQjtJQUc1QixZQUFZLE1BQWM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSw2QkFBNkI7WUFDdEMsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxVQUFVLE1BQU0sRUFBRTtnQkFDakMsY0FBYyxFQUFFLGtCQUFrQjthQUNuQztTQUNGLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQ25DLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQ3RCLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixNQUFNLE1BQU0sR0FBSSxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQWlCLElBQUksQ0FBQyxDQUFBO1lBQ3RELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFBO1lBQ25DLE1BQU0sT0FBTyxHQUFHLHNCQUFzQixNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFBO1lBQ3pFLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQzNDLENBQUMsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDckQsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsS0FBSyxDQUFDLFdB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
@@ -0,0 +1,13 @@
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.PRINTIFY_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const service_1 = __importDefault(require("./service"));
9
+ exports.PRINTIFY_MODULE = "printify";
10
+ exports.default = (0, utils_1.Module)(exports.PRINTIFY_MODULE, {
11
+ service: service_1.default,
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcmludGlmeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxREFBa0Q7QUFDbEQsd0RBQTZDO0FBRWhDLFFBQUEsZUFBZSxHQUFHLFVBQVUsQ0FBQTtBQUV6QyxrQkFBZSxJQUFBLGNBQU0sRUFBQyx1QkFBZSxFQUFFO0lBQ3JDLE9BQU8sRUFBRSxpQkFBcUI7Q0FDL0IsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260305115907 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260305115907 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "printify_order" ("id" text not null, "printify_id" text null, "shop_id" text not null, "medusa_order_id" text null, "status" text not null default 'pending', "shipping_method" text null, "line_items" jsonb not null, "address_to" jsonb not null, "total_cost" integer null, "cost_per_item" jsonb null, "submitted_at" timestamptz null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "printify_order_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_printify_order_deleted_at" ON "printify_order" ("deleted_at") WHERE deleted_at IS NULL;`);
9
+ this.addSql(`create table if not exists "printify_product" ("id" text not null, "printify_id" text not null, "shop_id" text not null, "title" text not null, "description" text not null, "variants" jsonb not null, "images" jsonb not null, "print_areas" jsonb not null, "is_published" boolean not null default false, "printify_data" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "printify_product_pkey" primary key ("id"));`);
10
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_printify_product_deleted_at" ON "printify_product" ("deleted_at") WHERE deleted_at IS NULL;`);
11
+ this.addSql(`create table if not exists "printify_shop" ("id" text not null, "printify_id" text not null, "title" text not null, "sales_channel_id" text null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "printify_shop_pkey" primary key ("id"));`);
12
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_printify_shop_deleted_at" ON "printify_shop" ("deleted_at") WHERE deleted_at IS NULL;`);
13
+ }
14
+ async down() {
15
+ this.addSql(`drop table if exists "printify_order" cascade;`);
16
+ this.addSql(`drop table if exists "printify_product" cascade;`);
17
+ this.addSql(`drop table if exists "printify_shop" cascade;`);
18
+ }
19
+ }
20
+ exports.Migration20260305115907 = Migration20260305115907;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjAzMDUxMTU5MDcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcmludGlmeS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwMzA1MTE1OTA3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpaUJBQWlpQixDQUFDLENBQUM7UUFDL2lCLElBQUksQ0FBQyxNQUFNLENBQUMseUhBQXlILENBQUMsQ0FBQztRQUV2SSxJQUFJLENBQUMsTUFBTSxDQUFDLG9nQkFBb2dCLENBQUMsQ0FBQztRQUNsaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyw2SEFBNkgsQ0FBQyxDQUFDO1FBRTNJLElBQUksQ0FBQyxNQUFNLENBQUMseVVBQXlVLENBQUMsQ0FBQztRQUN2VixJQUFJLENBQUMsTUFBTSxDQUFDLHVIQUF1SCxDQUFDLENBQUM7SUFDdkksQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUMsTUFBTSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQy9ELENBQUM7Q0FFRjtBQXJCRCwwREFxQkMifQ==
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260313185144 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260313185144 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "printify_product" add column if not exists "visibility_override" boolean null;`);
8
+ }
9
+ async down() {
10
+ this.addSql(`alter table if exists "printify_product" drop column if exists "visibility_override";`);
11
+ }
12
+ }
13
+ exports.Migration20260313185144 = Migration20260313185144;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjAzMTMxODUxNDQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcmludGlmeS9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwMzEzMTg1MTQ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFxRTtBQUVyRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1R0FBdUcsQ0FBQyxDQUFDO0lBQ3ZILENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVGQUF1RixDQUFDLENBQUM7SUFDdkcsQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const PrintifyOrder = utils_1.model.define("printify_order", {
5
+ id: utils_1.model.id().primaryKey(),
6
+ printify_id: utils_1.model.text().nullable(),
7
+ shop_id: utils_1.model.text(),
8
+ medusa_order_id: utils_1.model.text().nullable(),
9
+ status: utils_1.model.text().default("pending"),
10
+ shipping_method: utils_1.model.text().nullable(),
11
+ line_items: utils_1.model.json(),
12
+ address_to: utils_1.model.json(),
13
+ total_cost: utils_1.model.number().nullable(),
14
+ cost_per_item: utils_1.model.json().nullable(),
15
+ submitted_at: utils_1.model.dateTime().nullable(),
16
+ });
17
+ exports.default = PrintifyOrder;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcmludGlmeS9tb2RlbHMvb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBaUQ7QUFFakQsTUFBTSxhQUFhLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtJQUNuRCxFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRTtJQUMzQixXQUFXLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNwQyxPQUFPLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUNyQixlQUFlLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN4QyxNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDdkMsZUFBZSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsVUFBVSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDeEIsVUFBVSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDeEIsVUFBVSxFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDckMsYUFBYSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdEMsWUFBWSxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDMUMsQ0FBQyxDQUFBO0FBRUYsa0JBQWUsYUFBYSxDQUFBIn0=
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const PrintifyProduct = utils_1.model.define("printify_product", {
5
+ id: utils_1.model.id().primaryKey(),
6
+ printify_id: utils_1.model.text(),
7
+ shop_id: utils_1.model.text(),
8
+ title: utils_1.model.text(),
9
+ description: utils_1.model.text(),
10
+ variants: utils_1.model.json(),
11
+ images: utils_1.model.json(),
12
+ print_areas: utils_1.model.json(),
13
+ is_published: utils_1.model.boolean().default(false),
14
+ // Three-state intent:
15
+ // null = follow Printify's is_locked flag (default, set on sync)
16
+ // true = admin force-published (sync will not overwrite is_published)
17
+ // false = admin force-hidden (sync will not overwrite is_published)
18
+ visibility_override: utils_1.model.boolean().nullable(),
19
+ printify_data: utils_1.model.json().nullable(),
20
+ });
21
+ exports.default = PrintifyProduct;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ByaW50aWZ5L21vZGVscy9wcm9kdWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQWlEO0FBRWpELE1BQU0sZUFBZSxHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUU7SUFDdkQsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsV0FBVyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDekIsT0FBTyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDckIsS0FBSyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDbkIsV0FBVyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDekIsUUFBUSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDdEIsTUFBTSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDcEIsV0FBVyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDekIsWUFBWSxFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVDLHNCQUFzQjtJQUN0QixvRUFBb0U7SUFDcEUseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSxtQkFBbUIsRUFBRSxhQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQy9DLGFBQWEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3ZDLENBQUMsQ0FBQTtBQUVGLGtCQUFlLGVBQWUsQ0FBQSJ9
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const PrintifyShop = utils_1.model.define("printify_shop", {
5
+ id: utils_1.model.id().primaryKey(),
6
+ printify_id: utils_1.model.text(),
7
+ title: utils_1.model.text(),
8
+ sales_channel_id: utils_1.model.text().nullable(),
9
+ });
10
+ exports.default = PrintifyShop;
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ByaW50aWZ5L21vZGVscy9zaG9wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQWlEO0FBRWpELE1BQU0sWUFBWSxHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO0lBQ2pELEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3pCLEtBQUssRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ25CLGdCQUFnQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDMUMsQ0FBQyxDQUFBO0FBRUYsa0JBQWUsWUFBWSxDQUFBIn0=
@@ -0,0 +1,38 @@
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.PrintifyModuleService = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const api_client_1 = require("./api-client");
9
+ const shop_1 = __importDefault(require("./models/shop"));
10
+ const product_1 = __importDefault(require("./models/product"));
11
+ const order_1 = __importDefault(require("./models/order"));
12
+ class PrintifyModuleService extends (0, utils_1.MedusaService)({
13
+ PrintifyShop: shop_1.default,
14
+ PrintifyProduct: product_1.default,
15
+ PrintifyOrder: order_1.default,
16
+ }) {
17
+ constructor(container, moduleOptions) {
18
+ super(container, moduleOptions);
19
+ const options = "options" in moduleOptions && moduleOptions.options != null
20
+ ? moduleOptions.options
21
+ : moduleOptions;
22
+ if (!options?.apiKey) {
23
+ throw new Error("[medusa-plugin-printify] Missing required option: apiKey. " +
24
+ "Ensure the plugin is configured with { apiKey, webhookSecret } in your medusa-config.");
25
+ }
26
+ this.options = options;
27
+ this.apiClient = new api_client_1.PrintifyApiClient(options.apiKey);
28
+ }
29
+ getApiClient() {
30
+ return this.apiClient;
31
+ }
32
+ getOptions() {
33
+ return this.options;
34
+ }
35
+ }
36
+ exports.PrintifyModuleService = PrintifyModuleService;
37
+ exports.default = PrintifyModuleService;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ByaW50aWZ5L3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQXlEO0FBQ3pELDZDQUFnRDtBQUVoRCx5REFBd0M7QUFDeEMsK0RBQThDO0FBQzlDLDJEQUEwQztBQUkxQyxNQUFNLHFCQUFzQixTQUFRLElBQUEscUJBQWEsRUFBQztJQUNoRCxZQUFZLEVBQVosY0FBWTtJQUNaLGVBQWUsRUFBZixpQkFBZTtJQUNmLGFBQWEsRUFBYixlQUFhO0NBQ2QsQ0FBQztJQUlBLFlBQ0UsU0FBK0IsRUFDL0IsYUFBeUU7UUFFekUsS0FBSyxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUMvQixNQUFNLE9BQU8sR0FDWCxTQUFTLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxPQUFPLElBQUksSUFBSTtZQUN6RCxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU87WUFDdkIsQ0FBQyxDQUFFLGFBQXVDLENBQUE7UUFDOUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksS0FBSyxDQUNiLDREQUE0RDtnQkFDMUQsdUZBQXVGLENBQzFGLENBQUE7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLDhCQUFpQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN4RCxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQTtJQUN2QixDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUNyQixDQUFDO0NBQ0Y7QUFFUSxzREFBcUI7QUFDOUIsa0JBQWUscUJBQXFCLENBQUEifQ==
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcmludGlmeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = orderPlacedHandler;
5
+ const printify_1 = require("../modules/printify");
6
+ const create_printify_order_1 = require("../workflows/create-printify-order");
7
+ async function orderPlacedHandler({ event: { data }, container, }) {
8
+ const service = container.resolve(printify_1.PRINTIFY_MODULE);
9
+ const { shopId } = service.getOptions();
10
+ if (!shopId) {
11
+ console.warn("[printify] order-placed: no shopId configured, skipping");
12
+ return;
13
+ }
14
+ const orderService = container.resolve("order");
15
+ const order = await orderService.retrieveOrder(data.id, {
16
+ relations: ["items", "shipping_methods", "shipping_address"],
17
+ });
18
+ const items = (order.items ?? []);
19
+ // Only process items that have Printify metadata
20
+ const printifyItems = items.filter((item) => item.metadata?.printify_product_id);
21
+ if (printifyItems.length === 0) {
22
+ return;
23
+ }
24
+ const shippingMethod = order.shipping_methods?.[0]?.data?.printify_shipping_method ?? 1;
25
+ const addr = (order.shipping_address ?? {});
26
+ await (0, create_printify_order_1.createPrintifyOrderWorkflow)(container).run({
27
+ input: {
28
+ medusaOrderId: order.id,
29
+ shopId,
30
+ lineItems: printifyItems.map((item) => ({
31
+ product_id: String(item.metadata.printify_product_id),
32
+ variant_id: Number(item.metadata.printify_variant_id),
33
+ quantity: item.quantity,
34
+ printify_product_id: String(item.metadata.printify_product_id),
35
+ })),
36
+ shippingMethod: Number(shippingMethod),
37
+ address: {
38
+ firstName: String(addr.first_name ?? ""),
39
+ lastName: String(addr.last_name ?? ""),
40
+ email: String(addr.email ?? order.email ?? ""),
41
+ phone: String(addr.phone ?? ""),
42
+ address1: String(addr.address_1 ?? ""),
43
+ address2: addr.address_2 != null ? String(addr.address_2) : undefined,
44
+ city: String(addr.city ?? ""),
45
+ province: String(addr.province ?? ""),
46
+ postalCode: String(addr.postal_code ?? ""),
47
+ countryCode: String(addr.country_code ?? ""),
48
+ },
49
+ },
50
+ });
51
+ }
52
+ exports.config = {
53
+ event: "order.placed",
54
+ };
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcGxhY2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLXBsYWNlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxxQ0E2REM7QUFqRUQsa0RBQXFEO0FBRXJELDhFQUFnRjtBQUVqRSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsRUFDL0MsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2YsU0FBUyxHQUNzQjtJQUMvQixNQUFNLE9BQU8sR0FBMEIsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBZSxDQUFDLENBQUE7SUFDekUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUV2QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxDQUFDLENBQUE7UUFDdkUsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQy9DLE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ3RELFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQztLQUM3RCxDQUFDLENBQUE7SUFFRixNQUFNLEtBQUssR0FBbUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBOEMsQ0FBQTtJQUU5RyxpREFBaUQ7SUFDakQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FDaEMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNOLElBQUksQ0FBQyxRQUFvQyxFQUFFLG1CQUFtQixDQUNsRSxDQUFBO0lBRUQsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQ2xCLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSx3QkFBd0IsSUFBSSxDQUFDLENBQUE7SUFFbEUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUE0QixDQUFBO0lBRXRFLE1BQU0sSUFBQSxtREFBMkIsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDL0MsS0FBSyxFQUFFO1lBQ0wsYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFZO1lBQ2pDLE1BQU07WUFDTixTQUFTLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdEMsVUFBVSxFQUFFLE1BQU0sQ0FBRSxJQUFJLENBQUMsUUFBb0MsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbEYsVUFBVSxFQUFFLE1BQU0sQ0FBRSxJQUFJLENBQUMsUUFBb0MsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbEYsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFrQjtnQkFDakMsbUJBQW1CLEVBQUUsTUFBTSxDQUN4QixJQUFJLENBQUMsUUFBb0MsQ0FBQyxtQkFBbUIsQ0FDL0Q7YUFDRixDQUFDLENBQUM7WUFDSCxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQztZQUN0QyxPQUFPLEVBQUU7Z0JBQ1AsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztnQkFDeEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztnQkFDdEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM5QyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMvQixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO2dCQUN0QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ3JFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzdCLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7Z0JBQ3JDLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7Z0JBQzFDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7YUFDN0M7U0FDRjtLQUNGLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLGNBQWM7Q0FDdEIsQ0FBQSJ9
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = registerWebhooksHandler;
5
+ const printify_1 = require("../modules/printify");
6
+ const WEBHOOK_TOPICS = [
7
+ "order:status-changed",
8
+ "order:shipped",
9
+ "order:sent-to-production",
10
+ "order:shipment:delivered",
11
+ "product:updated",
12
+ "product:deleted",
13
+ "shop:disconnected",
14
+ ];
15
+ async function registerWebhooksHandler({ container, }) {
16
+ const service = container.resolve(printify_1.PRINTIFY_MODULE);
17
+ const options = service.getOptions();
18
+ const { shopId, webhookBaseUrl } = options;
19
+ if (!shopId || !webhookBaseUrl) {
20
+ console.warn("[printify] webhook registration skipped: missing shopId or webhookBaseUrl");
21
+ return;
22
+ }
23
+ const client = service.getApiClient();
24
+ const webhookUrl = `${webhookBaseUrl}/webhooks/printify`;
25
+ const existing = await client.getWebhooks(shopId);
26
+ const existingTopics = existing.map(w => w.topic);
27
+ for (const topic of WEBHOOK_TOPICS) {
28
+ if (!existingTopics.includes(topic)) {
29
+ await client.createWebhook(shopId, topic, webhookUrl);
30
+ console.log(`[printify] registered webhook: ${topic}`);
31
+ }
32
+ }
33
+ }
34
+ exports.config = {
35
+ event: "app.started",
36
+ };
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlZ2lzdGVyZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvcGx1Z2luLXJlZ2lzdGVyZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBY0EsMENBd0JDO0FBckNELGtEQUFxRDtBQUdyRCxNQUFNLGNBQWMsR0FBRztJQUNyQixzQkFBc0I7SUFDdEIsZUFBZTtJQUNmLDBCQUEwQjtJQUMxQiwwQkFBMEI7SUFDMUIsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixtQkFBbUI7Q0FDcEIsQ0FBQTtBQUVjLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxFQUNwRCxTQUFTLEdBQ2U7SUFDeEIsTUFBTSxPQUFPLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQUMsMEJBQWUsQ0FBQyxDQUFBO0lBQ3pFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNwQyxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUUxQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQywyRUFBMkUsQ0FBQyxDQUFBO1FBQ3pGLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFBO0lBQ3JDLE1BQU0sVUFBVSxHQUFHLEdBQUcsY0FBYyxvQkFBb0IsQ0FBQTtJQUV4RCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDakQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVqRCxLQUFLLE1BQU0sS0FBSyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUE7WUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUN4RCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLGFBQWE7Q0FDckIsQ0FBQSJ9