@legenki/print2medusa 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/examples/basic-store/medusa-config.snippet.js +57 -0
- package/.medusa/server/src/admin/index.js +133 -0
- package/.medusa/server/src/admin/index.mjs +134 -0
- package/.medusa/server/src/api/admin/printful/status/route.js +15 -0
- package/.medusa/server/src/api/admin/printful/sync/route.js +25 -0
- package/.medusa/server/src/jobs/sync-products.js +31 -0
- package/.medusa/server/src/modules/printful/index.js +13 -0
- package/.medusa/server/src/modules/printful/migrations/Migration20260726000000.js +103 -0
- package/.medusa/server/src/modules/printful/models/printful-order-link.js +12 -0
- package/.medusa/server/src/modules/printful/models/printful-product-link.js +13 -0
- package/.medusa/server/src/modules/printful/models/printful-sync-log.js +15 -0
- package/.medusa/server/src/modules/printful/models/printful-variant-link.js +13 -0
- package/.medusa/server/src/modules/printful/service.js +126 -0
- package/.medusa/server/src/providers/printful-fulfillment/index.js +11 -0
- package/.medusa/server/src/providers/printful-fulfillment/service.js +97 -0
- package/.medusa/server/src/subscribers/order-placed.js +37 -0
- package/.medusa/server/src/subscribers/payment-captured.js +61 -0
- package/.medusa/server/src/utils/errors.js +24 -0
- package/.medusa/server/src/utils/index.js +21 -0
- package/.medusa/server/src/utils/mappers.js +250 -0
- package/.medusa/server/src/utils/printful-client.js +169 -0
- package/.medusa/server/src/utils/types.js +3 -0
- package/.medusa/server/src/workflows/create-printful-order.js +123 -0
- package/.medusa/server/src/workflows/index.js +13 -0
- package/.medusa/server/src/workflows/sync-products.js +227 -0
- package/LICENSE +21 -0
- package/README.md +127 -0
- package/package.json +87 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Example snippet — merge into your Medusa app's medusa-config.ts
|
|
5
|
+
*/
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
(0, utils_1.loadEnv)(process.env.NODE_ENV || "development", process.cwd());
|
|
8
|
+
module.exports = (0, utils_1.defineConfig)({
|
|
9
|
+
projectConfig: {
|
|
10
|
+
databaseUrl: process.env.DATABASE_URL,
|
|
11
|
+
http: {
|
|
12
|
+
storeCors: process.env.STORE_CORS,
|
|
13
|
+
adminCors: process.env.ADMIN_CORS,
|
|
14
|
+
authCors: process.env.AUTH_CORS,
|
|
15
|
+
jwtSecret: process.env.JWT_SECRET || "supersecret",
|
|
16
|
+
cookieSecret: process.env.COOKIE_SECRET || "supersecret",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
plugins: [
|
|
20
|
+
{
|
|
21
|
+
resolve: "@legenki/print2medusa",
|
|
22
|
+
options: {
|
|
23
|
+
apiToken: process.env.PRINTFUL_API_TOKEN,
|
|
24
|
+
storeId: process.env.PRINTFUL_STORE_ID,
|
|
25
|
+
// autoSubmitOrders: true,
|
|
26
|
+
// createOnOrderPlaced: false,
|
|
27
|
+
// allowPartialOrders: false,
|
|
28
|
+
// markupPercent: 30,
|
|
29
|
+
// defaultCurrency: "USD",
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
modules: [
|
|
34
|
+
{
|
|
35
|
+
resolve: "@medusajs/medusa/fulfillment",
|
|
36
|
+
options: {
|
|
37
|
+
providers: [
|
|
38
|
+
{
|
|
39
|
+
resolve: "@medusajs/medusa/fulfillment-manual",
|
|
40
|
+
id: "manual",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
resolve: "@legenki/print2medusa/providers/printful-fulfillment",
|
|
44
|
+
id: "printful",
|
|
45
|
+
options: {
|
|
46
|
+
apiToken: process.env.PRINTFUL_API_TOKEN,
|
|
47
|
+
storeId: process.env.PRINTFUL_STORE_ID,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
});
|
|
55
|
+
// silence unused import when copying
|
|
56
|
+
void utils_1.Modules;
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkdXNhLWNvbmZpZy5zbmlwcGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZXhhbXBsZXMvYmFzaWMtc3RvcmUvbWVkdXNhLWNvbmZpZy5zbmlwcGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7O0dBRUc7QUFDSCxxREFBMEU7QUFFMUUsSUFBQSxlQUFPLEVBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksYUFBYSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBRTdELE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBQSxvQkFBWSxFQUFDO0lBQzVCLGFBQWEsRUFBRTtRQUNiLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVk7UUFDckMsSUFBSSxFQUFFO1lBQ0osU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVztZQUNsQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFXO1lBQ2xDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVU7WUFDaEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLGFBQWE7WUFDbEQsWUFBWSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLGFBQWE7U0FDekQ7S0FDRjtJQUNELE9BQU8sRUFBRTtRQUNQO1lBQ0UsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxPQUFPLEVBQUU7Z0JBQ1AsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCO2dCQUN4QyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7Z0JBQ3RDLDBCQUEwQjtnQkFDMUIsOEJBQThCO2dCQUM5Qiw2QkFBNkI7Z0JBQzdCLHFCQUFxQjtnQkFDckIsMEJBQTBCO2FBQzNCO1NBQ0Y7S0FDRjtJQUNELE9BQU8sRUFBRTtRQUNQO1lBQ0UsT0FBTyxFQUFFLDhCQUE4QjtZQUN2QyxPQUFPLEVBQUU7Z0JBQ1AsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxxQ0FBcUM7d0JBQzlDLEVBQUUsRUFBRSxRQUFRO3FCQUNiO29CQUNEO3dCQUNFLE9BQU8sRUFBRSxzREFBc0Q7d0JBQy9ELEVBQUUsRUFBRSxVQUFVO3dCQUNkLE9BQU8sRUFBRTs0QkFDUCxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0I7NEJBQ3hDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQjt5QkFDdkM7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0Y7Q0FDRixDQUFDLENBQUE7QUFFRixxQ0FBcUM7QUFDckMsS0FBSyxlQUFPLENBQUEifQ==
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
3
|
+
const adminSdk = require("@medusajs/admin-sdk");
|
|
4
|
+
const ui = require("@medusajs/ui");
|
|
5
|
+
const react = require("react");
|
|
6
|
+
const PrintfulSyncWidget = () => {
|
|
7
|
+
const [status, setStatus] = react.useState(null);
|
|
8
|
+
const [loading, setLoading] = react.useState(false);
|
|
9
|
+
const [syncing, setSyncing] = react.useState(false);
|
|
10
|
+
const loadStatus = async () => {
|
|
11
|
+
setLoading(true);
|
|
12
|
+
try {
|
|
13
|
+
const res = await fetch("/admin/printful/status", {
|
|
14
|
+
credentials: "include"
|
|
15
|
+
});
|
|
16
|
+
if (!res.ok) {
|
|
17
|
+
throw new Error(`Status ${res.status}`);
|
|
18
|
+
}
|
|
19
|
+
const data = await res.json();
|
|
20
|
+
setStatus(data);
|
|
21
|
+
} catch (e) {
|
|
22
|
+
console.error(e);
|
|
23
|
+
} finally {
|
|
24
|
+
setLoading(false);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
react.useEffect(() => {
|
|
28
|
+
void loadStatus();
|
|
29
|
+
}, []);
|
|
30
|
+
const onSync = async () => {
|
|
31
|
+
var _a, _b, _c;
|
|
32
|
+
setSyncing(true);
|
|
33
|
+
try {
|
|
34
|
+
const res = await fetch("/admin/printful/sync", {
|
|
35
|
+
method: "POST",
|
|
36
|
+
credentials: "include",
|
|
37
|
+
headers: { "Content-Type": "application/json" },
|
|
38
|
+
body: JSON.stringify({})
|
|
39
|
+
});
|
|
40
|
+
if (!res.ok) {
|
|
41
|
+
const text = await res.text();
|
|
42
|
+
throw new Error(text || `Sync failed (${res.status})`);
|
|
43
|
+
}
|
|
44
|
+
const data = await res.json();
|
|
45
|
+
ui.toast.success("Printful sync finished", {
|
|
46
|
+
description: `Created ${((_a = data.counters) == null ? void 0 : _a.created) ?? 0}, updated ${((_b = data.counters) == null ? void 0 : _b.updated) ?? 0}, failed ${((_c = data.counters) == null ? void 0 : _c.failed) ?? 0}`
|
|
47
|
+
});
|
|
48
|
+
await loadStatus();
|
|
49
|
+
} catch (e) {
|
|
50
|
+
ui.toast.error("Printful sync failed", {
|
|
51
|
+
description: e instanceof Error ? e.message : String(e)
|
|
52
|
+
});
|
|
53
|
+
} finally {
|
|
54
|
+
setSyncing(false);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const latest = status == null ? void 0 : status.latest_sync;
|
|
58
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
59
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
60
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
61
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: "Printful" }),
|
|
62
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Sync store products from Printful into Medusa" })
|
|
63
|
+
] }),
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
65
|
+
ui.Button,
|
|
66
|
+
{
|
|
67
|
+
size: "small",
|
|
68
|
+
onClick: () => void onSync(),
|
|
69
|
+
isLoading: syncing,
|
|
70
|
+
disabled: loading || syncing,
|
|
71
|
+
children: "Sync Now"
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
] }),
|
|
75
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-6 py-4 flex flex-col gap-1", children: loading && !latest ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", children: "Loading status…" }) : latest ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
76
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", children: [
|
|
77
|
+
"Last status: ",
|
|
78
|
+
/* @__PURE__ */ jsxRuntime.jsx("strong", { children: latest.status })
|
|
79
|
+
] }),
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
81
|
+
"Started: ",
|
|
82
|
+
new Date(latest.started_at).toLocaleString(),
|
|
83
|
+
latest.finished_at ? ` · Finished: ${new Date(latest.finished_at).toLocaleString()}` : ""
|
|
84
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
86
|
+
"Created ",
|
|
87
|
+
latest.products_created ?? 0,
|
|
88
|
+
" · Updated",
|
|
89
|
+
" ",
|
|
90
|
+
latest.products_updated ?? 0,
|
|
91
|
+
" · Failed",
|
|
92
|
+
" ",
|
|
93
|
+
latest.products_failed ?? 0
|
|
94
|
+
] }),
|
|
95
|
+
latest.error_message ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-error", children: latest.error_message.slice(0, 300) }) : null
|
|
96
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "No sync runs yet." }) })
|
|
97
|
+
] });
|
|
98
|
+
};
|
|
99
|
+
adminSdk.defineWidgetConfig({
|
|
100
|
+
zone: "product.list.before"
|
|
101
|
+
});
|
|
102
|
+
const i18nTranslations0 = {};
|
|
103
|
+
const widgetModule = { widgets: [
|
|
104
|
+
{
|
|
105
|
+
Component: PrintfulSyncWidget,
|
|
106
|
+
zone: ["product.list.before"],
|
|
107
|
+
widgetId: "Widget-44c9"
|
|
108
|
+
}
|
|
109
|
+
] };
|
|
110
|
+
const routeModule = {
|
|
111
|
+
routes: []
|
|
112
|
+
};
|
|
113
|
+
const menuItemModule = {
|
|
114
|
+
menuItems: []
|
|
115
|
+
};
|
|
116
|
+
const formModule = { customFields: {} };
|
|
117
|
+
const displayModule = {
|
|
118
|
+
displays: {}
|
|
119
|
+
};
|
|
120
|
+
const i18nModule = { resources: i18nTranslations0 };
|
|
121
|
+
const cellRendererModule = {};
|
|
122
|
+
const layoutModule = { layouts: [] };
|
|
123
|
+
const plugin = {
|
|
124
|
+
widgetModule,
|
|
125
|
+
routeModule,
|
|
126
|
+
menuItemModule,
|
|
127
|
+
formModule,
|
|
128
|
+
displayModule,
|
|
129
|
+
i18nModule,
|
|
130
|
+
cellRendererModule,
|
|
131
|
+
layoutModule
|
|
132
|
+
};
|
|
133
|
+
module.exports = plugin;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { defineWidgetConfig } from "@medusajs/admin-sdk";
|
|
3
|
+
import { Container, Heading, Text, Button, toast } from "@medusajs/ui";
|
|
4
|
+
import { useState, useEffect } from "react";
|
|
5
|
+
const PrintfulSyncWidget = () => {
|
|
6
|
+
const [status, setStatus] = useState(null);
|
|
7
|
+
const [loading, setLoading] = useState(false);
|
|
8
|
+
const [syncing, setSyncing] = useState(false);
|
|
9
|
+
const loadStatus = async () => {
|
|
10
|
+
setLoading(true);
|
|
11
|
+
try {
|
|
12
|
+
const res = await fetch("/admin/printful/status", {
|
|
13
|
+
credentials: "include"
|
|
14
|
+
});
|
|
15
|
+
if (!res.ok) {
|
|
16
|
+
throw new Error(`Status ${res.status}`);
|
|
17
|
+
}
|
|
18
|
+
const data = await res.json();
|
|
19
|
+
setStatus(data);
|
|
20
|
+
} catch (e) {
|
|
21
|
+
console.error(e);
|
|
22
|
+
} finally {
|
|
23
|
+
setLoading(false);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
void loadStatus();
|
|
28
|
+
}, []);
|
|
29
|
+
const onSync = async () => {
|
|
30
|
+
var _a, _b, _c;
|
|
31
|
+
setSyncing(true);
|
|
32
|
+
try {
|
|
33
|
+
const res = await fetch("/admin/printful/sync", {
|
|
34
|
+
method: "POST",
|
|
35
|
+
credentials: "include",
|
|
36
|
+
headers: { "Content-Type": "application/json" },
|
|
37
|
+
body: JSON.stringify({})
|
|
38
|
+
});
|
|
39
|
+
if (!res.ok) {
|
|
40
|
+
const text = await res.text();
|
|
41
|
+
throw new Error(text || `Sync failed (${res.status})`);
|
|
42
|
+
}
|
|
43
|
+
const data = await res.json();
|
|
44
|
+
toast.success("Printful sync finished", {
|
|
45
|
+
description: `Created ${((_a = data.counters) == null ? void 0 : _a.created) ?? 0}, updated ${((_b = data.counters) == null ? void 0 : _b.updated) ?? 0}, failed ${((_c = data.counters) == null ? void 0 : _c.failed) ?? 0}`
|
|
46
|
+
});
|
|
47
|
+
await loadStatus();
|
|
48
|
+
} catch (e) {
|
|
49
|
+
toast.error("Printful sync failed", {
|
|
50
|
+
description: e instanceof Error ? e.message : String(e)
|
|
51
|
+
});
|
|
52
|
+
} finally {
|
|
53
|
+
setSyncing(false);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const latest = status == null ? void 0 : status.latest_sync;
|
|
57
|
+
return /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
|
|
58
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
59
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
60
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", children: "Printful" }),
|
|
61
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: "Sync store products from Printful into Medusa" })
|
|
62
|
+
] }),
|
|
63
|
+
/* @__PURE__ */ jsx(
|
|
64
|
+
Button,
|
|
65
|
+
{
|
|
66
|
+
size: "small",
|
|
67
|
+
onClick: () => void onSync(),
|
|
68
|
+
isLoading: syncing,
|
|
69
|
+
disabled: loading || syncing,
|
|
70
|
+
children: "Sync Now"
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
] }),
|
|
74
|
+
/* @__PURE__ */ jsx("div", { className: "px-6 py-4 flex flex-col gap-1", children: loading && !latest ? /* @__PURE__ */ jsx(Text, { size: "small", children: "Loading status…" }) : latest ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
75
|
+
/* @__PURE__ */ jsxs(Text, { size: "small", children: [
|
|
76
|
+
"Last status: ",
|
|
77
|
+
/* @__PURE__ */ jsx("strong", { children: latest.status })
|
|
78
|
+
] }),
|
|
79
|
+
/* @__PURE__ */ jsxs(Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
80
|
+
"Started: ",
|
|
81
|
+
new Date(latest.started_at).toLocaleString(),
|
|
82
|
+
latest.finished_at ? ` · Finished: ${new Date(latest.finished_at).toLocaleString()}` : ""
|
|
83
|
+
] }),
|
|
84
|
+
/* @__PURE__ */ jsxs(Text, { size: "small", className: "text-ui-fg-subtle", children: [
|
|
85
|
+
"Created ",
|
|
86
|
+
latest.products_created ?? 0,
|
|
87
|
+
" · Updated",
|
|
88
|
+
" ",
|
|
89
|
+
latest.products_updated ?? 0,
|
|
90
|
+
" · Failed",
|
|
91
|
+
" ",
|
|
92
|
+
latest.products_failed ?? 0
|
|
93
|
+
] }),
|
|
94
|
+
latest.error_message ? /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-error", children: latest.error_message.slice(0, 300) }) : null
|
|
95
|
+
] }) : /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: "No sync runs yet." }) })
|
|
96
|
+
] });
|
|
97
|
+
};
|
|
98
|
+
defineWidgetConfig({
|
|
99
|
+
zone: "product.list.before"
|
|
100
|
+
});
|
|
101
|
+
const i18nTranslations0 = {};
|
|
102
|
+
const widgetModule = { widgets: [
|
|
103
|
+
{
|
|
104
|
+
Component: PrintfulSyncWidget,
|
|
105
|
+
zone: ["product.list.before"],
|
|
106
|
+
widgetId: "Widget-44c9"
|
|
107
|
+
}
|
|
108
|
+
] };
|
|
109
|
+
const routeModule = {
|
|
110
|
+
routes: []
|
|
111
|
+
};
|
|
112
|
+
const menuItemModule = {
|
|
113
|
+
menuItems: []
|
|
114
|
+
};
|
|
115
|
+
const formModule = { customFields: {} };
|
|
116
|
+
const displayModule = {
|
|
117
|
+
displays: {}
|
|
118
|
+
};
|
|
119
|
+
const i18nModule = { resources: i18nTranslations0 };
|
|
120
|
+
const cellRendererModule = {};
|
|
121
|
+
const layoutModule = { layouts: [] };
|
|
122
|
+
const plugin = {
|
|
123
|
+
widgetModule,
|
|
124
|
+
routeModule,
|
|
125
|
+
menuItemModule,
|
|
126
|
+
formModule,
|
|
127
|
+
displayModule,
|
|
128
|
+
i18nModule,
|
|
129
|
+
cellRendererModule,
|
|
130
|
+
layoutModule
|
|
131
|
+
};
|
|
132
|
+
export {
|
|
133
|
+
plugin as default
|
|
134
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const printful_1 = require("../../../../modules/printful");
|
|
5
|
+
async function GET(req, res) {
|
|
6
|
+
const printful = req.scope.resolve(printful_1.PRINTFUL_MODULE);
|
|
7
|
+
const latest = await printful.getLatestSyncLog();
|
|
8
|
+
const storeId = await printful.getStoreId();
|
|
9
|
+
res.status(200).json({
|
|
10
|
+
store_id: storeId,
|
|
11
|
+
latest_sync: latest,
|
|
12
|
+
running: latest?.status === "running",
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3ByaW50ZnVsL3N0YXR1cy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLGtCQVVDO0FBYkQsMkRBQThEO0FBR3ZELEtBQUssVUFBVSxHQUFHLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLFFBQVEsR0FBMEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsMEJBQWUsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7SUFFM0MsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkIsUUFBUSxFQUFFLE9BQU87UUFDakIsV0FBVyxFQUFFLE1BQU07UUFDbkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEtBQUssU0FBUztLQUN0QyxDQUFDLENBQUE7QUFDSixDQUFDIn0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.POST = POST;
|
|
7
|
+
const sync_products_1 = __importDefault(require("../../../../workflows/sync-products"));
|
|
8
|
+
async function POST(req, res) {
|
|
9
|
+
const limit = typeof req.body === "object" &&
|
|
10
|
+
req.body &&
|
|
11
|
+
"limit" in req.body &&
|
|
12
|
+
req.body.limit != null
|
|
13
|
+
? Number(req.body.limit)
|
|
14
|
+
: undefined;
|
|
15
|
+
const { result } = await (0, sync_products_1.default)(req.scope).run({
|
|
16
|
+
input: {
|
|
17
|
+
limit: Number.isFinite(limit) ? limit : undefined,
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
res.status(200).json({
|
|
21
|
+
sync_log: result.sync_log,
|
|
22
|
+
counters: result.counters,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3ByaW50ZnVsL3N5bmMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSxvQkFtQkM7QUFyQkQsd0ZBQXNFO0FBRS9ELEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLEtBQUssR0FDVCxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUM1QixHQUFHLENBQUMsSUFBSTtRQUNSLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSTtRQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO1FBQ3BCLENBQUMsQ0FBQyxNQUFNLENBQUUsR0FBRyxDQUFDLElBQTJCLENBQUMsS0FBSyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxTQUFTLENBQUE7SUFFZixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHVCQUFvQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDM0QsS0FBSyxFQUFFO1lBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNsRDtLQUNGLENBQUMsQ0FBQTtJQUVGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25CLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = void 0;
|
|
7
|
+
exports.default = syncPrintfulProductsJob;
|
|
8
|
+
const sync_products_1 = __importDefault(require("../workflows/sync-products"));
|
|
9
|
+
/**
|
|
10
|
+
* Optional scheduled full sync.
|
|
11
|
+
* Enable by ensuring jobs are loaded (default in plugins).
|
|
12
|
+
* Schedule: daily at 03:00 UTC — adjust as needed.
|
|
13
|
+
*/
|
|
14
|
+
async function syncPrintfulProductsJob(container) {
|
|
15
|
+
const logger = container.resolve("logger");
|
|
16
|
+
logger.info("Printful scheduled sync starting");
|
|
17
|
+
try {
|
|
18
|
+
const { result } = await (0, sync_products_1.default)(container).run({
|
|
19
|
+
input: {},
|
|
20
|
+
});
|
|
21
|
+
logger.info(`Printful scheduled sync done: created=${result.counters.created} updated=${result.counters.updated} failed=${result.counters.failed}`);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
logger.error(`Printful scheduled sync failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.config = {
|
|
28
|
+
name: "printful-sync-products",
|
|
29
|
+
schedule: "0 3 * * *",
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9qb2JzL3N5bmMtcHJvZHVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBUUEsMENBdUJDO0FBOUJELCtFQUE2RDtBQUU3RDs7OztHQUlHO0FBQ1ksS0FBSyxVQUFVLHVCQUF1QixDQUNuRCxTQUEwQjtJQUUxQixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FHeEMsQ0FBQTtJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtJQUMvQyxJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHVCQUFvQixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMzRCxLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQ1QseUNBQXlDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxZQUFZLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxXQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQ3ZJLENBQUE7SUFDSCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxLQUFLLENBQ1YsbUNBQ0UsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDakQsRUFBRSxDQUNILENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsUUFBUSxFQUFFLFdBQVc7Q0FDdEIsQ0FBQSJ9
|
|
@@ -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.PRINTFUL_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const service_1 = __importDefault(require("./service"));
|
|
9
|
+
exports.PRINTFUL_MODULE = "printful";
|
|
10
|
+
exports.default = (0, utils_1.Module)(exports.PRINTFUL_MODULE, {
|
|
11
|
+
service: service_1.default,
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcmludGZ1bC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxREFBa0Q7QUFDbEQsd0RBQTZDO0FBRWhDLFFBQUEsZUFBZSxHQUFHLFVBQVUsQ0FBQTtBQUV6QyxrQkFBZSxJQUFBLGNBQU0sRUFBQyx1QkFBZSxFQUFFO0lBQ3JDLE9BQU8sRUFBRSxpQkFBcUI7Q0FDL0IsQ0FBQyxDQUFBIn0=
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20260726000000 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20260726000000 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`
|
|
8
|
+
create table if not exists "printful_product_link" (
|
|
9
|
+
"id" text not null,
|
|
10
|
+
"printful_store_id" text not null,
|
|
11
|
+
"printful_sync_product_id" text not null,
|
|
12
|
+
"medusa_product_id" text not null,
|
|
13
|
+
"last_synced_at" timestamptz null,
|
|
14
|
+
"sync_hash" text null,
|
|
15
|
+
"created_at" timestamptz not null default now(),
|
|
16
|
+
"updated_at" timestamptz not null default now(),
|
|
17
|
+
"deleted_at" timestamptz null,
|
|
18
|
+
constraint "printful_product_link_pkey" primary key ("id")
|
|
19
|
+
);
|
|
20
|
+
`);
|
|
21
|
+
this.addSql(`
|
|
22
|
+
create unique index if not exists "IDX_printful_product_link_store_sync"
|
|
23
|
+
on "printful_product_link" ("printful_store_id", "printful_sync_product_id")
|
|
24
|
+
where deleted_at is null;
|
|
25
|
+
`);
|
|
26
|
+
this.addSql(`
|
|
27
|
+
create index if not exists "IDX_printful_product_link_medusa"
|
|
28
|
+
on "printful_product_link" ("medusa_product_id")
|
|
29
|
+
where deleted_at is null;
|
|
30
|
+
`);
|
|
31
|
+
this.addSql(`
|
|
32
|
+
create table if not exists "printful_variant_link" (
|
|
33
|
+
"id" text not null,
|
|
34
|
+
"printful_store_id" text not null,
|
|
35
|
+
"printful_sync_product_id" text not null,
|
|
36
|
+
"printful_sync_variant_id" text not null,
|
|
37
|
+
"medusa_variant_id" text not null,
|
|
38
|
+
"last_synced_at" timestamptz null,
|
|
39
|
+
"created_at" timestamptz not null default now(),
|
|
40
|
+
"updated_at" timestamptz not null default now(),
|
|
41
|
+
"deleted_at" timestamptz null,
|
|
42
|
+
constraint "printful_variant_link_pkey" primary key ("id")
|
|
43
|
+
);
|
|
44
|
+
`);
|
|
45
|
+
this.addSql(`
|
|
46
|
+
create unique index if not exists "IDX_printful_variant_link_store_sync"
|
|
47
|
+
on "printful_variant_link" ("printful_store_id", "printful_sync_variant_id")
|
|
48
|
+
where deleted_at is null;
|
|
49
|
+
`);
|
|
50
|
+
this.addSql(`
|
|
51
|
+
create index if not exists "IDX_printful_variant_link_medusa"
|
|
52
|
+
on "printful_variant_link" ("medusa_variant_id")
|
|
53
|
+
where deleted_at is null;
|
|
54
|
+
`);
|
|
55
|
+
this.addSql(`
|
|
56
|
+
create table if not exists "printful_sync_log" (
|
|
57
|
+
"id" text not null,
|
|
58
|
+
"status" text not null default 'running',
|
|
59
|
+
"started_at" timestamptz not null,
|
|
60
|
+
"finished_at" timestamptz null,
|
|
61
|
+
"products_created" integer not null default 0,
|
|
62
|
+
"products_updated" integer not null default 0,
|
|
63
|
+
"products_failed" integer not null default 0,
|
|
64
|
+
"error_message" text null,
|
|
65
|
+
"created_at" timestamptz not null default now(),
|
|
66
|
+
"updated_at" timestamptz not null default now(),
|
|
67
|
+
"deleted_at" timestamptz null,
|
|
68
|
+
constraint "printful_sync_log_pkey" primary key ("id")
|
|
69
|
+
);
|
|
70
|
+
`);
|
|
71
|
+
this.addSql(`
|
|
72
|
+
create index if not exists "IDX_printful_sync_log_started"
|
|
73
|
+
on "printful_sync_log" ("started_at")
|
|
74
|
+
where deleted_at is null;
|
|
75
|
+
`);
|
|
76
|
+
this.addSql(`
|
|
77
|
+
create table if not exists "printful_order_link" (
|
|
78
|
+
"id" text not null,
|
|
79
|
+
"medusa_order_id" text not null,
|
|
80
|
+
"printful_order_id" text not null,
|
|
81
|
+
"external_id" text not null,
|
|
82
|
+
"status" text not null default 'created',
|
|
83
|
+
"created_at" timestamptz not null default now(),
|
|
84
|
+
"updated_at" timestamptz not null default now(),
|
|
85
|
+
"deleted_at" timestamptz null,
|
|
86
|
+
constraint "printful_order_link_pkey" primary key ("id")
|
|
87
|
+
);
|
|
88
|
+
`);
|
|
89
|
+
this.addSql(`
|
|
90
|
+
create unique index if not exists "IDX_printful_order_link_medusa"
|
|
91
|
+
on "printful_order_link" ("medusa_order_id")
|
|
92
|
+
where deleted_at is null;
|
|
93
|
+
`);
|
|
94
|
+
}
|
|
95
|
+
async down() {
|
|
96
|
+
this.addSql(`drop table if exists "printful_order_link" cascade;`);
|
|
97
|
+
this.addSql(`drop table if exists "printful_sync_log" cascade;`);
|
|
98
|
+
this.addSql(`drop table if exists "printful_variant_link" cascade;`);
|
|
99
|
+
this.addSql(`drop table if exists "printful_product_link" cascade;`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.Migration20260726000000 = Migration20260726000000;
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjA3MjYwMDAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcmludGZ1bC9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjYwNzI2MDAwMDAwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlFQUFvRTtBQUVwRSxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBQzNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7OztLQWFYLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7S0FJWCxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDOzs7O0tBSVgsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7OztLQWFYLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7S0FJWCxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDOzs7O0tBSVgsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0tBZVgsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7OztLQUlYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7Ozs7Ozs7OztLQVlYLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7S0FJWCxDQUFDLENBQUE7SUFDSixDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxREFBcUQsQ0FBQyxDQUFBO1FBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsbURBQW1ELENBQUMsQ0FBQTtRQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLHVEQUF1RCxDQUFDLENBQUE7UUFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO0lBQ3RFLENBQUM7Q0FDRjtBQXBHRCwwREFvR0MifQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const PrintfulOrderLink = utils_1.model.define("printful_order_link", {
|
|
5
|
+
id: utils_1.model.id().primaryKey(),
|
|
6
|
+
medusa_order_id: utils_1.model.text(),
|
|
7
|
+
printful_order_id: utils_1.model.text(),
|
|
8
|
+
external_id: utils_1.model.text(),
|
|
9
|
+
status: utils_1.model.text().default("created"),
|
|
10
|
+
});
|
|
11
|
+
exports.default = PrintfulOrderLink;
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRmdWwtb3JkZXItbGluay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3ByaW50ZnVsL21vZGVscy9wcmludGZ1bC1vcmRlci1saW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQWlEO0FBRWpELE1BQU0saUJBQWlCLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRTtJQUM1RCxFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRTtJQUMzQixlQUFlLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUM3QixpQkFBaUIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQy9CLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3pCLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztDQUN4QyxDQUFDLENBQUE7QUFFRixrQkFBZSxpQkFBaUIsQ0FBQSJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const PrintfulProductLink = utils_1.model.define("printful_product_link", {
|
|
5
|
+
id: utils_1.model.id().primaryKey(),
|
|
6
|
+
printful_store_id: utils_1.model.text(),
|
|
7
|
+
printful_sync_product_id: utils_1.model.text(),
|
|
8
|
+
medusa_product_id: utils_1.model.text(),
|
|
9
|
+
last_synced_at: utils_1.model.dateTime().nullable(),
|
|
10
|
+
sync_hash: utils_1.model.text().nullable(),
|
|
11
|
+
});
|
|
12
|
+
exports.default = PrintfulProductLink;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRmdWwtcHJvZHVjdC1saW5rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcHJpbnRmdWwvbW9kZWxzL3ByaW50ZnVsLXByb2R1Y3QtbGluay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFpRDtBQUVqRCxNQUFNLG1CQUFtQixHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUU7SUFDaEUsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsaUJBQWlCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUMvQix3QkFBd0IsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3RDLGlCQUFpQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDL0IsY0FBYyxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0MsU0FBUyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDbkMsQ0FBQyxDQUFBO0FBRUYsa0JBQWUsbUJBQW1CLENBQUEifQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const PrintfulSyncLog = utils_1.model.define("printful_sync_log", {
|
|
5
|
+
id: utils_1.model.id().primaryKey(),
|
|
6
|
+
status: utils_1.model.text().default("running"),
|
|
7
|
+
started_at: utils_1.model.dateTime(),
|
|
8
|
+
finished_at: utils_1.model.dateTime().nullable(),
|
|
9
|
+
products_created: utils_1.model.number().default(0),
|
|
10
|
+
products_updated: utils_1.model.number().default(0),
|
|
11
|
+
products_failed: utils_1.model.number().default(0),
|
|
12
|
+
error_message: utils_1.model.text().nullable(),
|
|
13
|
+
});
|
|
14
|
+
exports.default = PrintfulSyncLog;
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRmdWwtc3luYy1sb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcmludGZ1bC9tb2RlbHMvcHJpbnRmdWwtc3luYy1sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBaUQ7QUFFakQsTUFBTSxlQUFlLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRTtJQUN4RCxFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRTtJQUMzQixNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDdkMsVUFBVSxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUU7SUFDNUIsV0FBVyxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsZ0JBQWdCLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDM0MsZ0JBQWdCLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDM0MsZUFBZSxFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzFDLGFBQWEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3ZDLENBQUMsQ0FBQTtBQUVGLGtCQUFlLGVBQWUsQ0FBQSJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const PrintfulVariantLink = utils_1.model.define("printful_variant_link", {
|
|
5
|
+
id: utils_1.model.id().primaryKey(),
|
|
6
|
+
printful_store_id: utils_1.model.text(),
|
|
7
|
+
printful_sync_product_id: utils_1.model.text(),
|
|
8
|
+
printful_sync_variant_id: utils_1.model.text(),
|
|
9
|
+
medusa_variant_id: utils_1.model.text(),
|
|
10
|
+
last_synced_at: utils_1.model.dateTime().nullable(),
|
|
11
|
+
});
|
|
12
|
+
exports.default = PrintfulVariantLink;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRmdWwtdmFyaWFudC1saW5rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcHJpbnRmdWwvbW9kZWxzL3ByaW50ZnVsLXZhcmlhbnQtbGluay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFpRDtBQUVqRCxNQUFNLG1CQUFtQixHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUU7SUFDaEUsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsaUJBQWlCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUMvQix3QkFBd0IsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3RDLHdCQUF3QixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDdEMsaUJBQWlCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUMvQixjQUFjLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUM1QyxDQUFDLENBQUE7QUFFRixrQkFBZSxtQkFBbUIsQ0FBQSJ9
|