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.
- package/.medusa/server/jest.config.js +20 -0
- package/.medusa/server/jest.setup.js +4 -0
- package/.medusa/server/src/admin/index.js +472 -0
- package/.medusa/server/src/admin/index.mjs +473 -0
- package/.medusa/server/src/api/admin/plugin/route.js +7 -0
- package/.medusa/server/src/api/admin/printify/orders/[id]/submit/route.js +19 -0
- package/.medusa/server/src/api/admin/printify/orders/route.js +18 -0
- package/.medusa/server/src/api/admin/printify/products/[id]/route.js +113 -0
- package/.medusa/server/src/api/admin/printify/products/route.js +35 -0
- package/.medusa/server/src/api/admin/printify/shops/route.js +18 -0
- package/.medusa/server/src/api/middlewares.js +12 -0
- package/.medusa/server/src/api/store/plugin/route.js +7 -0
- package/.medusa/server/src/api/webhooks/printify/route.js +102 -0
- package/.medusa/server/src/jobs/auto-submit-orders-job.js +31 -0
- package/.medusa/server/src/jobs/sync-products-job.js +23 -0
- package/.medusa/server/src/lib/webhook-utils.js +13 -0
- package/.medusa/server/src/links/printify-order-medusa-order.js +10 -0
- package/.medusa/server/src/links/printify-product-medusa-product.js +10 -0
- package/.medusa/server/src/modules/printify/api-client.js +67 -0
- package/.medusa/server/src/modules/printify/index.js +13 -0
- package/.medusa/server/src/modules/printify/migrations/Migration20260305115907.js +21 -0
- package/.medusa/server/src/modules/printify/migrations/Migration20260313185144.js +14 -0
- package/.medusa/server/src/modules/printify/models/order.js +18 -0
- package/.medusa/server/src/modules/printify/models/product.js +22 -0
- package/.medusa/server/src/modules/printify/models/shop.js +11 -0
- package/.medusa/server/src/modules/printify/service.js +38 -0
- package/.medusa/server/src/modules/printify/types.js +3 -0
- package/.medusa/server/src/subscribers/order-placed.js +55 -0
- package/.medusa/server/src/subscribers/plugin-registered.js +37 -0
- package/.medusa/server/src/utils/build-variant-prices.js +17 -0
- package/.medusa/server/src/utils/currency-converter.js +46 -0
- package/.medusa/server/src/workflows/create-printify-order.js +86 -0
- package/.medusa/server/src/workflows/index.js +12 -0
- package/.medusa/server/src/workflows/option-mapper.js +64 -0
- package/.medusa/server/src/workflows/submit-printify-order.js +29 -0
- package/.medusa/server/src/workflows/sync-products.js +313 -0
- package/.medusa/server/src/workflows/sync-shops.js +30 -0
- package/README.md +253 -0
- 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
|