@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,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveStateCode = resolveStateCode;
|
|
4
|
+
exports.diffVariantsForUpsert = diffVariantsForUpsert;
|
|
5
|
+
exports.slugify = slugify;
|
|
6
|
+
exports.parsePriceToMinorUnits = parsePriceToMinorUnits;
|
|
7
|
+
exports.applyMarkup = applyMarkup;
|
|
8
|
+
exports.mapSyncProductToMedusa = mapSyncProductToMedusa;
|
|
9
|
+
const STATE_TABLES = {
|
|
10
|
+
US: {
|
|
11
|
+
alabama: "AL", alaska: "AK", arizona: "AZ", arkansas: "AR",
|
|
12
|
+
california: "CA", colorado: "CO", connecticut: "CT", delaware: "DE",
|
|
13
|
+
"district of columbia": "DC", florida: "FL", georgia: "GA", hawaii: "HI",
|
|
14
|
+
idaho: "ID", illinois: "IL", indiana: "IN", iowa: "IA", kansas: "KS",
|
|
15
|
+
kentucky: "KY", louisiana: "LA", maine: "ME", maryland: "MD",
|
|
16
|
+
massachusetts: "MA", michigan: "MI", minnesota: "MN", mississippi: "MS",
|
|
17
|
+
missouri: "MO", montana: "MT", nebraska: "NE", nevada: "NV",
|
|
18
|
+
"new hampshire": "NH", "new jersey": "NJ", "new mexico": "NM",
|
|
19
|
+
"new york": "NY", "north carolina": "NC", "north dakota": "ND",
|
|
20
|
+
ohio: "OH", oklahoma: "OK", oregon: "OR", pennsylvania: "PA",
|
|
21
|
+
"rhode island": "RI", "south carolina": "SC", "south dakota": "SD",
|
|
22
|
+
tennessee: "TN", texas: "TX", utah: "UT", vermont: "VT",
|
|
23
|
+
virginia: "VA", washington: "WA", "west virginia": "WV",
|
|
24
|
+
wisconsin: "WI", wyoming: "WY", "puerto rico": "PR",
|
|
25
|
+
},
|
|
26
|
+
CA: {
|
|
27
|
+
alberta: "AB", "british columbia": "BC", manitoba: "MB",
|
|
28
|
+
"new brunswick": "NB", "newfoundland and labrador": "NL",
|
|
29
|
+
"northwest territories": "NT", "nova scotia": "NS", nunavut: "NU",
|
|
30
|
+
ontario: "ON", "prince edward island": "PE", quebec: "QC",
|
|
31
|
+
québec: "QC", saskatchewan: "SK", yukon: "YT",
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Normalize a Medusa `province` into the 2-letter code Printful expects for
|
|
36
|
+
* `state_code`. Printful requires it for US/CA/AU; for other countries the code
|
|
37
|
+
* is optional and unknown values are dropped rather than sent raw.
|
|
38
|
+
*/
|
|
39
|
+
function resolveStateCode(province, countryCode) {
|
|
40
|
+
const raw = province?.trim();
|
|
41
|
+
if (!raw) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
const table = STATE_TABLES[(countryCode || "").toUpperCase()];
|
|
45
|
+
if (!table) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const codes = new Set(Object.values(table));
|
|
49
|
+
const upper = raw.toUpperCase();
|
|
50
|
+
if (upper.length === 2 && codes.has(upper)) {
|
|
51
|
+
return upper;
|
|
52
|
+
}
|
|
53
|
+
return table[raw.toLowerCase()] ?? undefined;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Reconcile freshly-mapped Printful variants against the variants already on a
|
|
57
|
+
* Medusa product, matching by `printful_sync_variant_id` in metadata.
|
|
58
|
+
*
|
|
59
|
+
* - New sync variants → `toCreate` (added to the product).
|
|
60
|
+
* - Known sync variants → `toUpdate` (price/title refreshed from Printful).
|
|
61
|
+
*
|
|
62
|
+
* Existing variants without a sync id are ignored (never touched or deleted),
|
|
63
|
+
* so manually-added Medusa variants survive a re-sync.
|
|
64
|
+
*/
|
|
65
|
+
function diffVariantsForUpsert(mapped, existing) {
|
|
66
|
+
const existingBySyncId = new Map();
|
|
67
|
+
for (const v of existing) {
|
|
68
|
+
const syncId = v.metadata?.printful_sync_variant_id;
|
|
69
|
+
if (syncId != null && syncId !== "") {
|
|
70
|
+
existingBySyncId.set(String(syncId), v);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const toCreate = [];
|
|
74
|
+
const toUpdate = [];
|
|
75
|
+
for (const m of mapped) {
|
|
76
|
+
const syncId = m.metadata?.printful_sync_variant_id;
|
|
77
|
+
const match = syncId != null ? existingBySyncId.get(String(syncId)) : undefined;
|
|
78
|
+
if (match) {
|
|
79
|
+
toUpdate.push({
|
|
80
|
+
id: match.id,
|
|
81
|
+
title: m.title,
|
|
82
|
+
sku: m.sku,
|
|
83
|
+
prices: m.prices,
|
|
84
|
+
metadata: m.metadata,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
toCreate.push(m);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return { toCreate, toUpdate };
|
|
92
|
+
}
|
|
93
|
+
function slugify(value) {
|
|
94
|
+
return (value
|
|
95
|
+
.toLowerCase()
|
|
96
|
+
.normalize("NFKD")
|
|
97
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
98
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
99
|
+
.replace(/^-+|-+$/g, "")
|
|
100
|
+
.slice(0, 120) || "product");
|
|
101
|
+
}
|
|
102
|
+
function parsePriceToMinorUnits(price) {
|
|
103
|
+
if (!price) {
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
const n = Number.parseFloat(price);
|
|
107
|
+
if (Number.isNaN(n)) {
|
|
108
|
+
return 0;
|
|
109
|
+
}
|
|
110
|
+
return Math.round(n * 100);
|
|
111
|
+
}
|
|
112
|
+
function applyMarkup(amountMinor, markupPercent) {
|
|
113
|
+
if (!markupPercent || markupPercent === 0) {
|
|
114
|
+
return amountMinor;
|
|
115
|
+
}
|
|
116
|
+
return Math.round(amountMinor * (1 + markupPercent / 100));
|
|
117
|
+
}
|
|
118
|
+
function optionValuesFromVariants(variants) {
|
|
119
|
+
const sizes = new Set();
|
|
120
|
+
const colors = new Set();
|
|
121
|
+
const perVariant = [];
|
|
122
|
+
for (const v of variants) {
|
|
123
|
+
const opts = {};
|
|
124
|
+
const size = v.size?.trim();
|
|
125
|
+
const color = v.color?.trim();
|
|
126
|
+
if (size) {
|
|
127
|
+
sizes.add(size);
|
|
128
|
+
opts.Size = size;
|
|
129
|
+
}
|
|
130
|
+
if (color) {
|
|
131
|
+
colors.add(color);
|
|
132
|
+
opts.Color = color;
|
|
133
|
+
}
|
|
134
|
+
if (!size && !color) {
|
|
135
|
+
const parsed = parseNameOptions(v.name);
|
|
136
|
+
if (parsed.Color) {
|
|
137
|
+
colors.add(parsed.Color);
|
|
138
|
+
opts.Color = parsed.Color;
|
|
139
|
+
}
|
|
140
|
+
if (parsed.Size) {
|
|
141
|
+
sizes.add(parsed.Size);
|
|
142
|
+
opts.Size = parsed.Size;
|
|
143
|
+
}
|
|
144
|
+
if (!opts.Size && !opts.Color) {
|
|
145
|
+
opts.Title = v.name;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
perVariant.push(opts);
|
|
149
|
+
}
|
|
150
|
+
const options = [];
|
|
151
|
+
if (sizes.size) {
|
|
152
|
+
options.push({ title: "Size", values: Array.from(sizes) });
|
|
153
|
+
}
|
|
154
|
+
if (colors.size) {
|
|
155
|
+
options.push({ title: "Color", values: Array.from(colors) });
|
|
156
|
+
}
|
|
157
|
+
const hasOnlyTitle = perVariant.every((o) => o.Title && !o.Size && !o.Color);
|
|
158
|
+
if (hasOnlyTitle || options.length === 0) {
|
|
159
|
+
const titles = Array.from(new Set(perVariant.map((o) => o.Title || "Default")));
|
|
160
|
+
return {
|
|
161
|
+
options: [{ title: "Title", values: titles }],
|
|
162
|
+
perVariant: perVariant.map((o) => ({ Title: o.Title || "Default" })),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
for (const o of perVariant) {
|
|
166
|
+
for (const opt of options) {
|
|
167
|
+
if (!o[opt.title]) {
|
|
168
|
+
o[opt.title] = "Default";
|
|
169
|
+
if (!opt.values.includes("Default")) {
|
|
170
|
+
opt.values.push("Default");
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return { options, perVariant };
|
|
176
|
+
}
|
|
177
|
+
function parseNameOptions(name) {
|
|
178
|
+
const dash = name.split(" - ").pop()?.trim() ?? name;
|
|
179
|
+
if (dash.includes(" / ")) {
|
|
180
|
+
const [color, size] = dash.split(" / ").map((s) => s.trim());
|
|
181
|
+
return {
|
|
182
|
+
...(color ? { Color: color } : {}),
|
|
183
|
+
...(size ? { Size: size } : {}),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return {};
|
|
187
|
+
}
|
|
188
|
+
function collectImages(detail) {
|
|
189
|
+
const urls = new Set();
|
|
190
|
+
if (detail.sync_product.thumbnail_url) {
|
|
191
|
+
urls.add(detail.sync_product.thumbnail_url);
|
|
192
|
+
}
|
|
193
|
+
for (const v of detail.sync_variants) {
|
|
194
|
+
for (const f of v.files ?? []) {
|
|
195
|
+
const url = f.preview_url || f.thumbnail_url || f.url;
|
|
196
|
+
if (url) {
|
|
197
|
+
urls.add(url);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (v.product?.image) {
|
|
201
|
+
urls.add(v.product.image);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return Array.from(urls);
|
|
205
|
+
}
|
|
206
|
+
function mapSyncProductToMedusa(detail, options = {}) {
|
|
207
|
+
const { sync_product, sync_variants } = detail;
|
|
208
|
+
const storeId = options.storeId ?? "default";
|
|
209
|
+
const currency = (sync_variants[0]?.currency ||
|
|
210
|
+
options.defaultCurrency ||
|
|
211
|
+
"USD").toLowerCase();
|
|
212
|
+
const { options: productOptions, perVariant } = optionValuesFromVariants(sync_variants);
|
|
213
|
+
const variants = sync_variants.map((v, i) => {
|
|
214
|
+
const base = parsePriceToMinorUnits(v.retail_price);
|
|
215
|
+
const amount = applyMarkup(base, options.markupPercent);
|
|
216
|
+
return {
|
|
217
|
+
title: v.name,
|
|
218
|
+
sku: v.sku || `pf-${v.id}`,
|
|
219
|
+
options: perVariant[i] ?? { Title: v.name },
|
|
220
|
+
prices: [{ amount, currency_code: currency }],
|
|
221
|
+
manage_inventory: false,
|
|
222
|
+
allow_backorder: true,
|
|
223
|
+
metadata: {
|
|
224
|
+
printful_store_id: storeId,
|
|
225
|
+
printful_sync_product_id: String(sync_product.id),
|
|
226
|
+
printful_sync_variant_id: String(v.id),
|
|
227
|
+
printful_catalog_variant_id: v.variant_id
|
|
228
|
+
? String(v.variant_id)
|
|
229
|
+
: undefined,
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
});
|
|
233
|
+
const images = collectImages(detail);
|
|
234
|
+
return {
|
|
235
|
+
title: sync_product.name,
|
|
236
|
+
handle: slugify(sync_product.name),
|
|
237
|
+
status: "published",
|
|
238
|
+
thumbnail: images[0],
|
|
239
|
+
images: images.map((url) => ({ url })),
|
|
240
|
+
options: productOptions,
|
|
241
|
+
variants,
|
|
242
|
+
external_id: String(sync_product.id),
|
|
243
|
+
metadata: {
|
|
244
|
+
printful_store_id: storeId,
|
|
245
|
+
printful_sync_product_id: String(sync_product.id),
|
|
246
|
+
printful_external_id: sync_product.external_id ?? undefined,
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9tYXBwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0VBLDRDQXFCQztBQTBCRCxzREFrQ0M7QUFFRCwwQkFVQztBQUVELHdEQVdDO0FBRUQsa0NBUUM7QUEwR0Qsd0RBd0RDO0FBclRELE1BQU0sWUFBWSxHQUEyQztJQUMzRCxFQUFFLEVBQUU7UUFDRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSTtRQUMxRCxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSTtRQUNuRSxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJO1FBQ3hFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUk7UUFDcEUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUk7UUFDNUQsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUk7UUFDdkUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUk7UUFDM0QsZUFBZSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJO1FBQzdELFVBQVUsRUFBRSxJQUFJ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
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrintfulClient = void 0;
|
|
4
|
+
const errors_1 = require("./errors");
|
|
5
|
+
const DEFAULT_BASE_URL = "https://api.printful.com";
|
|
6
|
+
class PrintfulClient {
|
|
7
|
+
constructor(options) {
|
|
8
|
+
if (!options.apiToken) {
|
|
9
|
+
throw new errors_1.PrintfulConfigError("Printful apiToken is required");
|
|
10
|
+
}
|
|
11
|
+
this.apiToken = options.apiToken;
|
|
12
|
+
this.storeId = options.storeId;
|
|
13
|
+
this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
|
|
14
|
+
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
15
|
+
this.maxRetries = options.maxRetries ?? 3;
|
|
16
|
+
this.retryBaseMs = options.retryBaseMs ?? 500;
|
|
17
|
+
}
|
|
18
|
+
async listSyncProducts(params = {}) {
|
|
19
|
+
const search = new URLSearchParams();
|
|
20
|
+
if (params.offset != null) {
|
|
21
|
+
search.set("offset", String(params.offset));
|
|
22
|
+
}
|
|
23
|
+
if (params.limit != null) {
|
|
24
|
+
search.set("limit", String(params.limit));
|
|
25
|
+
}
|
|
26
|
+
if (params.status) {
|
|
27
|
+
search.set("status", params.status);
|
|
28
|
+
}
|
|
29
|
+
const qs = search.toString();
|
|
30
|
+
const path = qs ? `/store/products?${qs}` : "/store/products";
|
|
31
|
+
const data = await this.request(path);
|
|
32
|
+
return {
|
|
33
|
+
items: data.result ?? [],
|
|
34
|
+
paging: data.paging,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async listAllSyncProducts(params = {}) {
|
|
38
|
+
const limit = params.limit ?? 100;
|
|
39
|
+
let offset = 0;
|
|
40
|
+
const all = [];
|
|
41
|
+
for (;;) {
|
|
42
|
+
const page = await this.listSyncProducts({
|
|
43
|
+
...params,
|
|
44
|
+
offset,
|
|
45
|
+
limit,
|
|
46
|
+
});
|
|
47
|
+
all.push(...page.items);
|
|
48
|
+
const total = page.paging?.total;
|
|
49
|
+
offset += page.items.length;
|
|
50
|
+
if (page.items.length === 0) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
if (total != null && offset >= total) {
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
if (page.items.length < limit) {
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return all;
|
|
61
|
+
}
|
|
62
|
+
async getSyncProduct(id) {
|
|
63
|
+
const data = await this.request(`/store/products/${id}`);
|
|
64
|
+
return data.result;
|
|
65
|
+
}
|
|
66
|
+
async createOrder(input) {
|
|
67
|
+
const confirm = input.confirm === true;
|
|
68
|
+
const path = confirm ? "/orders?confirm=1" : "/orders";
|
|
69
|
+
const { confirm: _confirm, ...body } = input;
|
|
70
|
+
const data = await this.request(path, {
|
|
71
|
+
method: "POST",
|
|
72
|
+
body: JSON.stringify(body),
|
|
73
|
+
});
|
|
74
|
+
return data.result;
|
|
75
|
+
}
|
|
76
|
+
async getOrder(id) {
|
|
77
|
+
const data = await this.request(`/orders/${id}`);
|
|
78
|
+
return data.result;
|
|
79
|
+
}
|
|
80
|
+
async cancelOrder(id) {
|
|
81
|
+
const data = await this.request(`/orders/${id}`, {
|
|
82
|
+
method: "DELETE",
|
|
83
|
+
});
|
|
84
|
+
return data.result;
|
|
85
|
+
}
|
|
86
|
+
async request(path, init = {}) {
|
|
87
|
+
const url = `${this.baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
|
|
88
|
+
const headers = {
|
|
89
|
+
Authorization: `Bearer ${this.apiToken}`,
|
|
90
|
+
"Content-Type": "application/json",
|
|
91
|
+
Accept: "application/json",
|
|
92
|
+
...init.headers,
|
|
93
|
+
};
|
|
94
|
+
if (this.storeId) {
|
|
95
|
+
headers["X-PF-Store-Id"] = this.storeId;
|
|
96
|
+
}
|
|
97
|
+
let lastError;
|
|
98
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
99
|
+
try {
|
|
100
|
+
const response = await this.fetchImpl(url, {
|
|
101
|
+
...init,
|
|
102
|
+
headers,
|
|
103
|
+
});
|
|
104
|
+
const text = await response.text();
|
|
105
|
+
let json = null;
|
|
106
|
+
if (text) {
|
|
107
|
+
try {
|
|
108
|
+
json = JSON.parse(text);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
json = null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!response.ok) {
|
|
115
|
+
const message = json?.error?.message ||
|
|
116
|
+
(typeof json?.result === "string" ? json.result : null) ||
|
|
117
|
+
`Printful API error ${response.status}`;
|
|
118
|
+
const error = new errors_1.PrintfulApiError(String(message), {
|
|
119
|
+
status: response.status,
|
|
120
|
+
reason: json?.error?.reason,
|
|
121
|
+
body: json ?? text,
|
|
122
|
+
});
|
|
123
|
+
if (error.isRetryable && attempt < this.maxRetries) {
|
|
124
|
+
await this.sleep(this.retryDelay(attempt, response));
|
|
125
|
+
lastError = error;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
if (!json) {
|
|
131
|
+
throw new errors_1.PrintfulApiError("Empty or invalid JSON from Printful", {
|
|
132
|
+
status: response.status,
|
|
133
|
+
body: text,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return json;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
lastError = err;
|
|
140
|
+
if (err instanceof errors_1.PrintfulApiError && !err.isRetryable) {
|
|
141
|
+
throw err;
|
|
142
|
+
}
|
|
143
|
+
if (attempt < this.maxRetries) {
|
|
144
|
+
await this.sleep(this.retryDelay(attempt));
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
throw err;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
throw lastError instanceof Error
|
|
151
|
+
? lastError
|
|
152
|
+
: new errors_1.PrintfulApiError("Printful request failed", { status: 0 });
|
|
153
|
+
}
|
|
154
|
+
retryDelay(attempt, response) {
|
|
155
|
+
const retryAfter = response?.headers?.get?.("retry-after");
|
|
156
|
+
if (retryAfter) {
|
|
157
|
+
const seconds = Number(retryAfter);
|
|
158
|
+
if (!Number.isNaN(seconds) && seconds > 0) {
|
|
159
|
+
return seconds * 1000;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return this.retryBaseMs * Math.pow(2, attempt);
|
|
163
|
+
}
|
|
164
|
+
sleep(ms) {
|
|
165
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.PrintfulClient = PrintfulClient;
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRmdWwtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3ByaW50ZnVsLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBZ0U7QUFvQmhFLE1BQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUE7QUFFbkQsTUFBYSxjQUFjO0lBUXpCLFlBQVksT0FBOEI7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksNEJBQW1CLENBQUMsK0JBQStCLENBQUMsQ0FBQTtRQUNoRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFBO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQTtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDdkUsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQTtRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFBO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUE7SUFDL0MsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFpQyxFQUFFO1FBSXhELE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUE7UUFDcEMsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUM3QyxDQUFD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
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPrintfulOrderWorkflow = void 0;
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const printful_1 = require("../modules/printful");
|
|
7
|
+
const mappers_1 = require("../utils/mappers");
|
|
8
|
+
const createPrintfulOrderStep = (0, workflows_sdk_1.createStep)("printful-create-order", async (input, { container }) => {
|
|
9
|
+
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
10
|
+
const orderModule = container.resolve(utils_1.Modules.ORDER);
|
|
11
|
+
const options = await printful.getOptions();
|
|
12
|
+
const client = await printful.getClient();
|
|
13
|
+
const existing = await printful.findOrderLink(input.order_id);
|
|
14
|
+
if (existing) {
|
|
15
|
+
return new workflows_sdk_1.StepResponse({
|
|
16
|
+
skipped: true,
|
|
17
|
+
reason: "already_linked",
|
|
18
|
+
printful_order_id: existing.printful_order_id,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const order = await orderModule.retrieveOrder(input.order_id, {
|
|
22
|
+
relations: ["items", "shipping_address"],
|
|
23
|
+
});
|
|
24
|
+
const items = [];
|
|
25
|
+
const unresolved = [];
|
|
26
|
+
for (const item of order.items ?? []) {
|
|
27
|
+
const variantId = item.variant_id;
|
|
28
|
+
if (!variantId) {
|
|
29
|
+
unresolved.push(item.id);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
let syncVariantId;
|
|
33
|
+
const link = await printful.findVariantLinkByMedusaId(variantId);
|
|
34
|
+
if (link) {
|
|
35
|
+
syncVariantId = link.printful_sync_variant_id;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const meta = (item.metadata || {});
|
|
39
|
+
if (meta.printful_sync_variant_id) {
|
|
40
|
+
syncVariantId = String(meta.printful_sync_variant_id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!syncVariantId) {
|
|
44
|
+
unresolved.push(item.title || item.id);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
items.push({
|
|
48
|
+
sync_variant_id: Number(syncVariantId),
|
|
49
|
+
quantity: Number(item.quantity),
|
|
50
|
+
name: item.title,
|
|
51
|
+
external_id: item.id,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (!items.length) {
|
|
55
|
+
return new workflows_sdk_1.StepResponse({
|
|
56
|
+
skipped: true,
|
|
57
|
+
reason: "no_printful_items",
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (unresolved.length && !options.allowPartialOrders) {
|
|
61
|
+
throw new Error(`Order ${input.order_id} has non-Printful items: ${unresolved.join(", ")}`);
|
|
62
|
+
}
|
|
63
|
+
const addr = order.shipping_address;
|
|
64
|
+
if (!addr) {
|
|
65
|
+
throw new Error(`Order ${input.order_id} has no shipping address`);
|
|
66
|
+
}
|
|
67
|
+
const countryCode = (addr.country_code || "").toUpperCase();
|
|
68
|
+
const recipient = {
|
|
69
|
+
name: [addr.first_name, addr.last_name].filter(Boolean).join(" ") || "Customer",
|
|
70
|
+
address1: addr.address_1 || "",
|
|
71
|
+
address2: addr.address_2 || undefined,
|
|
72
|
+
city: addr.city || "",
|
|
73
|
+
state_code: (0, mappers_1.resolveStateCode)(addr.province, countryCode),
|
|
74
|
+
country_code: countryCode,
|
|
75
|
+
zip: addr.postal_code || "",
|
|
76
|
+
phone: addr.phone || undefined,
|
|
77
|
+
email: order.email || undefined,
|
|
78
|
+
};
|
|
79
|
+
// Insert-first: atomically claim the order before hitting the Printful API.
|
|
80
|
+
// Two concurrent payment.captured events cannot both pass this point — the
|
|
81
|
+
// unique index on medusa_order_id makes the loser return null → skip,
|
|
82
|
+
// preventing a duplicate Printful order.
|
|
83
|
+
const claim = await printful.claimOrderLink(order.id);
|
|
84
|
+
if (!claim) {
|
|
85
|
+
return new workflows_sdk_1.StepResponse({
|
|
86
|
+
skipped: true,
|
|
87
|
+
reason: "already_linked",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
const payload = {
|
|
91
|
+
external_id: order.id,
|
|
92
|
+
recipient,
|
|
93
|
+
items,
|
|
94
|
+
confirm: options.autoSubmitOrders !== false,
|
|
95
|
+
};
|
|
96
|
+
let pfOrder;
|
|
97
|
+
try {
|
|
98
|
+
pfOrder = await client.createOrder(payload);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
// Printful failed after we claimed the order — release the placeholder so
|
|
102
|
+
// a later retry (or manual re-fire) can create the order instead of being
|
|
103
|
+
// permanently blocked by a "pending" link.
|
|
104
|
+
await printful.deletePrintfulOrderLinks(claim.id);
|
|
105
|
+
throw err;
|
|
106
|
+
}
|
|
107
|
+
await printful.updatePrintfulOrderLinks({
|
|
108
|
+
id: claim.id,
|
|
109
|
+
printful_order_id: String(pfOrder.id),
|
|
110
|
+
status: pfOrder.status || "created",
|
|
111
|
+
});
|
|
112
|
+
return new workflows_sdk_1.StepResponse({
|
|
113
|
+
skipped: false,
|
|
114
|
+
printful_order_id: String(pfOrder.id),
|
|
115
|
+
status: pfOrder.status,
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
exports.createPrintfulOrderWorkflow = (0, workflows_sdk_1.createWorkflow)("printful-create-order", (input) => {
|
|
119
|
+
const result = createPrintfulOrderStep(input);
|
|
120
|
+
return new workflows_sdk_1.WorkflowResponse(result);
|
|
121
|
+
});
|
|
122
|
+
exports.default = exports.createPrintfulOrderWorkflow;
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXByaW50ZnVsLW9yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9jcmVhdGUtcHJpbnRmdWwtb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBQzFDLHFEQUFtRDtBQUNuRCxrREFBcUQ7QUFPckQsOENBQW1EO0FBa0JuRCxNQUFNLHVCQUF1QixHQUFHLElBQUEsMEJBQVUsRUFDeEMsdUJBQXVCLEVBQ3ZCLEtBQUssRUFBRSxLQUErQixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUN2RCxNQUFNLFFBQVEsR0FBMEIsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBZSxDQUFDLENBQUE7SUFDMUUsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDcEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUE7SUFFekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM3RCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLDRCQUFZLENBQWU7WUFDcEMsT0FBTyxFQUFFLElBQUk7WUFDYixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUI7U0FDOUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1FBQzVELFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQztLQUN6QyxDQUFDLENBQUE7SUFFRixNQUFNLEtBQUssR0FB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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.createPrintfulOrder = exports.createPrintfulOrderWorkflow = exports.syncProducts = exports.syncProductsWorkflow = void 0;
|
|
7
|
+
var sync_products_1 = require("./sync-products");
|
|
8
|
+
Object.defineProperty(exports, "syncProductsWorkflow", { enumerable: true, get: function () { return __importDefault(sync_products_1).default; } });
|
|
9
|
+
Object.defineProperty(exports, "syncProducts", { enumerable: true, get: function () { return sync_products_1.syncProductsWorkflow; } });
|
|
10
|
+
var create_printful_order_1 = require("./create-printful-order");
|
|
11
|
+
Object.defineProperty(exports, "createPrintfulOrderWorkflow", { enumerable: true, get: function () { return __importDefault(create_printful_order_1).default; } });
|
|
12
|
+
Object.defineProperty(exports, "createPrintfulOrder", { enumerable: true, get: function () { return create_printful_order_1.createPrintfulOrderWorkflow; } });
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGlEQUF1RztBQUE5RixzSUFBQSxPQUFPLE9BQXdCO0FBQUUsNkdBQUEsb0JBQW9CLE9BQWdCO0FBRTlFLGlFQUdnQztBQUY5QixxSkFBQSxPQUFPLE9BQStCO0FBQ3RDLDRIQUFBLDJCQUEyQixPQUF1QiJ9
|