@legenki/print2medusa 0.9.4 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +12 -14
- package/.medusa/server/src/admin/index.mjs +12 -14
- package/.medusa/server/src/api/hooks/printful/[token]/route.js +21 -14
- package/.medusa/server/src/modules/printful/service.js +36 -12
- package/.medusa/server/src/subscribers/printful-webhook.js +25 -0
- package/.medusa/server/src/utils/webhook-events.js +9 -2
- package/.medusa/server/src/workflows/sync-products.js +364 -267
- package/package.json +9 -9
|
@@ -13,22 +13,12 @@ const stock_1 = require("../utils/stock");
|
|
|
13
13
|
const removed_1 = require("../utils/removed");
|
|
14
14
|
const design_1 = require("../utils/design");
|
|
15
15
|
const bundle_1 = require("../utils/bundle");
|
|
16
|
-
const
|
|
17
|
-
name: "printful-
|
|
18
|
-
// Runs past the HTTP response and completes on its own — no
|
|
19
|
-
// setStepSuccess needed, which is what backgroundExecution adds to async.
|
|
16
|
+
const fetchPrintfulProductsStep = (0, workflows_sdk_1.createStep)({
|
|
17
|
+
name: "printful-fetch-products",
|
|
20
18
|
async: true,
|
|
21
19
|
backgroundExecution: true,
|
|
22
|
-
// No timeout on purpose. Medusa schedules one only when the step sets it
|
|
23
|
-
// (TransactionStep.hasTimeout() returns !!definition.timeout, and
|
|
24
|
-
// transaction-orchestrator.js:637 guards on it), so omitting it is the
|
|
25
|
-
// safe state. Any value we picked could be exceeded by a large enough
|
|
26
|
-
// catalog, and the penalty is a SUCCESSFUL sync being reverted — deleting
|
|
27
|
-
// the orphans it was about to link.
|
|
28
20
|
}, async (input, { container }) => {
|
|
29
21
|
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
30
|
-
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
31
|
-
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
32
22
|
const client = await printful.getClient();
|
|
33
23
|
const options = await printful.getOptions();
|
|
34
24
|
const storeId = await printful.getStoreId();
|
|
@@ -36,49 +26,85 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
36
26
|
limit: 100,
|
|
37
27
|
});
|
|
38
28
|
const toProcess = input.limit != null ? summaries.slice(0, input.limit) : summaries;
|
|
39
|
-
const counters = {
|
|
40
|
-
created: 0,
|
|
41
|
-
updated: 0,
|
|
42
|
-
failed: 0,
|
|
43
|
-
errors: [],
|
|
44
|
-
};
|
|
45
|
-
// Products created but not yet linked. A crash leaves exactly these
|
|
46
|
-
// invisible to the next sync's findProductLink, so they are the only
|
|
47
|
-
// thing the compensation may delete.
|
|
48
|
-
const orphans = new orphans_1.OrphanTracker();
|
|
49
|
-
// One cache for the whole run, not one per product, so a blank two
|
|
50
|
-
// products share costs a single call across the catalogue. Inside a
|
|
51
|
-
// product it is what keeps a 756-variant tee at 84 calls instead of 756.
|
|
52
|
-
const catalogCache = new design_1.CatalogVariantCache((id) => client.getCatalogVariant(id));
|
|
53
|
-
let processed = 0;
|
|
54
29
|
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
55
30
|
products_total: toProcess.length,
|
|
56
31
|
});
|
|
32
|
+
const detailsMap = new Map();
|
|
33
|
+
let processed = 0;
|
|
34
|
+
const errors = [];
|
|
35
|
+
let failed = 0;
|
|
57
36
|
for (const summary of toProcess) {
|
|
58
37
|
if (summary.is_ignored) {
|
|
59
38
|
continue;
|
|
60
39
|
}
|
|
61
|
-
// Scoped to this iteration so the catch below knows which product, if
|
|
62
|
-
// any, this pass created. Set the moment the product exists in Medusa
|
|
63
|
-
// and cleared once its link row is written.
|
|
64
|
-
let pendingProductId;
|
|
65
40
|
try {
|
|
66
41
|
const detail = await client.getSyncProduct(summary.id);
|
|
67
42
|
if (!detail.sync_variants?.length) {
|
|
68
|
-
|
|
69
|
-
|
|
43
|
+
failed += 1;
|
|
44
|
+
errors.push(`Product ${summary.id} has no variants`);
|
|
70
45
|
continue;
|
|
71
46
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
47
|
+
detailsMap.set(String(summary.id), detail);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
failed += 1;
|
|
51
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
52
|
+
errors.push(`Product ${summary.id}: ${message}`);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
processed += 1;
|
|
56
|
+
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
57
|
+
products_processed: processed,
|
|
58
|
+
products_total: toProcess.length,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return new workflows_sdk_1.StepResponse({
|
|
63
|
+
toProcess,
|
|
64
|
+
details: Array.from(detailsMap.entries()),
|
|
65
|
+
options,
|
|
66
|
+
storeId,
|
|
67
|
+
initialCounters: {
|
|
68
|
+
created: 0,
|
|
69
|
+
updated: 0,
|
|
70
|
+
failed,
|
|
71
|
+
errors,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
const mapToMedusaProductsStep = (0, workflows_sdk_1.createStep)({
|
|
76
|
+
name: "printful-map-products",
|
|
77
|
+
async: true,
|
|
78
|
+
backgroundExecution: true,
|
|
79
|
+
}, async (input, { container }) => {
|
|
80
|
+
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
81
|
+
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
82
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
83
|
+
const client = await printful.getClient();
|
|
84
|
+
const counters = {
|
|
85
|
+
created: input.initialCounters.created,
|
|
86
|
+
updated: input.initialCounters.updated,
|
|
87
|
+
failed: input.initialCounters.failed,
|
|
88
|
+
errors: [...input.initialCounters.errors],
|
|
89
|
+
};
|
|
90
|
+
const detailsMap = new Map(input.details);
|
|
91
|
+
const catalogCache = new design_1.CatalogVariantCache((id) => client.getCatalogVariant(id));
|
|
92
|
+
const productsToCreate = [];
|
|
93
|
+
const productsToUpdate = [];
|
|
94
|
+
const variantsToCreate = [];
|
|
95
|
+
const variantsToUpdate = [];
|
|
96
|
+
const linksToCreate = [];
|
|
97
|
+
const linksToUpdate = [];
|
|
98
|
+
const reconcileItems = [];
|
|
99
|
+
let processed = 0;
|
|
100
|
+
for (const summary of input.toProcess) {
|
|
101
|
+
if (summary.is_ignored)
|
|
102
|
+
continue;
|
|
103
|
+
const detail = detailsMap.get(String(summary.id));
|
|
104
|
+
if (!detail)
|
|
105
|
+
continue;
|
|
106
|
+
try {
|
|
107
|
+
const mapped = (0, mappers_1.mapSyncProductToMedusa)(detail, input.options);
|
|
82
108
|
mapped.variants = await (0, design_1.enrichVariantsWithDesign)(mapped.variants, detail.sync_variants, {
|
|
83
109
|
syncProductId: String(summary.id),
|
|
84
110
|
getCatalogVariant: (id) => client.getCatalogVariant(id),
|
|
@@ -87,10 +113,6 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
87
113
|
const existingLink = await printful.findProductLink(String(summary.id));
|
|
88
114
|
if (existingLink?.medusa_product_id) {
|
|
89
115
|
const productId = existingLink.medusa_product_id;
|
|
90
|
-
// Retrieved before the update so the current status and metadata are
|
|
91
|
-
// the merchant's, not ours. `mapped.status` is derived from Printful
|
|
92
|
-
// stock alone; writing it directly is what republished a product the
|
|
93
|
-
// merchant had deliberately drafted.
|
|
94
116
|
const product = await productModule.retrieveProduct(productId, {
|
|
95
117
|
relations: ["variants"],
|
|
96
118
|
});
|
|
@@ -100,76 +122,52 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
100
122
|
currentMetadata: (product.metadata ?? {}),
|
|
101
123
|
mappedMetadata: mapped.metadata,
|
|
102
124
|
});
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
125
|
+
productsToUpdate.push({
|
|
126
|
+
productId,
|
|
127
|
+
data: {
|
|
128
|
+
title: mapped.title,
|
|
129
|
+
thumbnail: mapped.thumbnail,
|
|
130
|
+
metadata: publication.metadata,
|
|
131
|
+
status: publication.status,
|
|
132
|
+
},
|
|
109
133
|
});
|
|
110
|
-
// Upsert variants so price/assortment changes in Printful reach Medusa.
|
|
111
134
|
const { toCreate, toUpdate } = (0, mappers_1.diffVariantsForUpsert)(mapped.variants, (product.variants ?? []).map((pv) => ({
|
|
112
135
|
id: pv.id,
|
|
113
136
|
metadata: pv.metadata,
|
|
114
137
|
})));
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
prices: u.prices,
|
|
122
|
-
metadata: u.metadata,
|
|
123
|
-
})),
|
|
124
|
-
},
|
|
138
|
+
for (const u of toUpdate) {
|
|
139
|
+
variantsToUpdate.push({
|
|
140
|
+
id: u.id,
|
|
141
|
+
title: u.title,
|
|
142
|
+
prices: u.prices,
|
|
143
|
+
metadata: u.metadata,
|
|
125
144
|
});
|
|
126
145
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
manage_inventory: c.manage_inventory,
|
|
138
|
-
allow_backorder: c.allow_backorder,
|
|
139
|
-
})),
|
|
140
|
-
},
|
|
146
|
+
for (const c of toCreate) {
|
|
147
|
+
variantsToCreate.push({
|
|
148
|
+
product_id: productId,
|
|
149
|
+
title: c.title,
|
|
150
|
+
sku: c.sku,
|
|
151
|
+
options: c.options,
|
|
152
|
+
prices: c.prices,
|
|
153
|
+
metadata: c.metadata,
|
|
154
|
+
manage_inventory: c.manage_inventory,
|
|
155
|
+
allow_backorder: c.allow_backorder,
|
|
141
156
|
});
|
|
142
|
-
// No link loop here: the reconcile below re-reads the product, so
|
|
143
|
-
// these new variants are in its scope and get linked there.
|
|
144
157
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
// The refresh-only loop this replaces could never repair a link row
|
|
150
|
-
// that failed to write, because `diffVariantsForUpsert` matches on
|
|
151
|
-
// variant metadata rather than link rows — so the variant looked
|
|
152
|
-
// already-synced and its row was never written again.
|
|
153
|
-
const linked = await productModule.retrieveProduct(productId, {
|
|
154
|
-
relations: ["variants"],
|
|
158
|
+
linksToUpdate.push({
|
|
159
|
+
linkId: existingLink.id,
|
|
160
|
+
syncProductId: String(summary.id),
|
|
161
|
+
medusaProductId: productId,
|
|
155
162
|
});
|
|
156
|
-
|
|
157
|
-
storeId,
|
|
163
|
+
reconcileItems.push({
|
|
158
164
|
syncProductId: String(summary.id),
|
|
165
|
+
medusaProductId: productId,
|
|
159
166
|
syncVariantIds: detail.sync_variants.map((v) => v.id),
|
|
160
|
-
|
|
161
|
-
id: pv.id,
|
|
162
|
-
metadata: pv.metadata,
|
|
163
|
-
})),
|
|
164
|
-
});
|
|
165
|
-
await printful.updatePrintfulProductLinks({
|
|
166
|
-
id: existingLink.id,
|
|
167
|
-
last_synced_at: new Date(),
|
|
167
|
+
isCreate: false,
|
|
168
168
|
});
|
|
169
|
-
counters.updated += 1;
|
|
170
169
|
}
|
|
171
170
|
else {
|
|
172
|
-
// Ensure unique handle if collision
|
|
173
171
|
let handle = mapped.handle;
|
|
174
172
|
try {
|
|
175
173
|
const existing = await productModule.listProducts({ handle: [handle] }, { take: 1 });
|
|
@@ -178,11 +176,8 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
178
176
|
}
|
|
179
177
|
}
|
|
180
178
|
catch {
|
|
181
|
-
// ignore
|
|
179
|
+
// ignore
|
|
182
180
|
}
|
|
183
|
-
// A product created already sold out is drafted by the mapper, but
|
|
184
|
-
// the mapper writes no marker — so without this the restock path
|
|
185
|
-
// would read it as a merchant's own draft and never republish it.
|
|
186
181
|
const createStock = (0, stock_1.planStockActions)(detail.sync_variants);
|
|
187
182
|
const createMetadata = {
|
|
188
183
|
...mapped.metadata,
|
|
@@ -190,152 +185,226 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
190
185
|
? { [stock_1.STOCK_MARKER_KEY]: "unavailable" }
|
|
191
186
|
: {}),
|
|
192
187
|
};
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
})),
|
|
212
|
-
metadata: createMetadata,
|
|
213
|
-
external_id: mapped.external_id,
|
|
214
|
-
},
|
|
215
|
-
],
|
|
216
|
-
},
|
|
217
|
-
});
|
|
218
|
-
const created = result[0];
|
|
219
|
-
orphans.track(created.id);
|
|
220
|
-
pendingProductId = created.id;
|
|
221
|
-
await printful.createPrintfulProductLinks({
|
|
222
|
-
printful_store_id: storeId,
|
|
223
|
-
printful_sync_product_id: String(summary.id),
|
|
224
|
-
medusa_product_id: created.id,
|
|
225
|
-
last_synced_at: new Date(),
|
|
188
|
+
productsToCreate.push({
|
|
189
|
+
title: mapped.title,
|
|
190
|
+
handle,
|
|
191
|
+
status: mapped.status,
|
|
192
|
+
thumbnail: mapped.thumbnail,
|
|
193
|
+
images: mapped.images,
|
|
194
|
+
options: mapped.options,
|
|
195
|
+
variants: mapped.variants.map((v) => ({
|
|
196
|
+
title: v.title,
|
|
197
|
+
sku: v.sku,
|
|
198
|
+
options: v.options,
|
|
199
|
+
prices: v.prices,
|
|
200
|
+
metadata: v.metadata,
|
|
201
|
+
manage_inventory: v.manage_inventory,
|
|
202
|
+
allow_backorder: v.allow_backorder,
|
|
203
|
+
})),
|
|
204
|
+
metadata: createMetadata,
|
|
205
|
+
external_id: mapped.external_id,
|
|
226
206
|
});
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
pendingProductId = undefined;
|
|
230
|
-
// Resumable rather than best-effort: a throw here used to abandon
|
|
231
|
-
// every remaining variant, and because the product link row above
|
|
232
|
-
// already exists, the next sync took the update path and never went
|
|
233
|
-
// back for them. Now one unwritable row costs only that row, and the
|
|
234
|
-
// next sync's reconcile picks it up.
|
|
235
|
-
await (0, variant_links_1.reconcileVariantLinks)(printful, {
|
|
236
|
-
storeId,
|
|
207
|
+
linksToCreate.push({ syncProductId: String(summary.id) });
|
|
208
|
+
reconcileItems.push({
|
|
237
209
|
syncProductId: String(summary.id),
|
|
238
210
|
syncVariantIds: detail.sync_variants.map((v) => v.id),
|
|
239
|
-
|
|
240
|
-
id: variant.id,
|
|
241
|
-
metadata: variant.metadata,
|
|
242
|
-
})),
|
|
211
|
+
isCreate: true,
|
|
243
212
|
});
|
|
244
|
-
counters.created += 1;
|
|
245
213
|
}
|
|
246
214
|
}
|
|
247
215
|
catch (err) {
|
|
248
216
|
counters.failed += 1;
|
|
249
217
|
const message = err instanceof Error ? err.message : String(err);
|
|
250
218
|
counters.errors.push(`Product ${summary.id}: ${message}`);
|
|
251
|
-
// The product was created but its link write never landed. The loop
|
|
252
|
-
// continues and the step still SUCCEEDS, so compensation — which runs
|
|
253
|
-
// only on step failure — will never see this. Left alone it is a
|
|
254
|
-
// product stranded in Medusa with no link row: invisible to the next
|
|
255
|
-
// sync's findProductLink, which duplicates it.
|
|
256
|
-
if (pendingProductId) {
|
|
257
|
-
const orphanId = pendingProductId;
|
|
258
|
-
try {
|
|
259
|
-
await productModule.deleteProducts([orphanId]);
|
|
260
|
-
// Released only after a delete that actually happened, so a
|
|
261
|
-
// failure here still leaves it for the compensation to retry.
|
|
262
|
-
orphans.release(orphanId);
|
|
263
|
-
}
|
|
264
|
-
catch (deleteErr) {
|
|
265
|
-
// Must not mask the original error — that is what gets reported.
|
|
266
|
-
logger.error(`Printful sync: could not delete orphaned product ${orphanId} after a failed link write: ${deleteErr instanceof Error
|
|
267
|
-
? deleteErr.message
|
|
268
|
-
: String(deleteErr)}`);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
219
|
}
|
|
272
220
|
finally {
|
|
273
|
-
pendingProductId = undefined;
|
|
274
|
-
// In `finally` so it runs however the product exited — success, an
|
|
275
|
-
// early `continue`, or a throw. The heartbeat is what keeps the claim
|
|
276
|
-
// from being reaped, so a catalog of failures must not starve it.
|
|
277
221
|
processed += 1;
|
|
278
222
|
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
279
223
|
products_processed: processed,
|
|
280
|
-
products_total: toProcess.length,
|
|
224
|
+
products_total: input.toProcess.length,
|
|
281
225
|
});
|
|
282
226
|
}
|
|
283
227
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
228
|
+
logger.info(`Printful sync: ${catalogCache.calls} catalog variant call(s) for design parameters`);
|
|
229
|
+
return new workflows_sdk_1.StepResponse({
|
|
230
|
+
productsToCreate,
|
|
231
|
+
productsToUpdate,
|
|
232
|
+
variantsToCreate,
|
|
233
|
+
variantsToUpdate,
|
|
234
|
+
linksToCreate,
|
|
235
|
+
linksToUpdate,
|
|
236
|
+
reconcileItems,
|
|
237
|
+
counters,
|
|
238
|
+
catalogCacheCalls: catalogCache.calls,
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
const updateMedusaProductsStep = (0, workflows_sdk_1.createStep)("printful-update-medusa-products", async (productsToUpdate, { container }) => {
|
|
242
|
+
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
243
|
+
for (const update of productsToUpdate) {
|
|
244
|
+
await productModule.updateProducts(update.productId, update.data);
|
|
245
|
+
}
|
|
246
|
+
return new workflows_sdk_1.StepResponse(null);
|
|
247
|
+
});
|
|
248
|
+
const syncLinksStep = (0, workflows_sdk_1.createStep)("printful-sync-links", async (input, { container }) => {
|
|
249
|
+
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
250
|
+
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
251
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
252
|
+
const counters = {
|
|
253
|
+
created: input.counters.created,
|
|
254
|
+
updated: input.counters.updated,
|
|
255
|
+
failed: input.counters.failed,
|
|
256
|
+
errors: [...input.counters.errors],
|
|
257
|
+
};
|
|
258
|
+
const orphans = new orphans_1.OrphanTracker();
|
|
259
|
+
const createdBySyncId = new Map();
|
|
260
|
+
if (input.createdProducts && Array.isArray(input.createdProducts)) {
|
|
261
|
+
for (const cp of input.createdProducts) {
|
|
262
|
+
if (cp.external_id) {
|
|
263
|
+
createdBySyncId.set(cp.external_id, cp);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
for (const lc of input.linksToCreate) {
|
|
268
|
+
const created = createdBySyncId.get(lc.syncProductId);
|
|
269
|
+
if (!created) {
|
|
270
|
+
counters.failed += 1;
|
|
271
|
+
counters.errors.push(`Product ${lc.syncProductId} created but not found in output`);
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
orphans.track(created.id);
|
|
275
|
+
try {
|
|
276
|
+
await printful.createPrintfulProductLinks({
|
|
277
|
+
printful_store_id: input.storeId,
|
|
278
|
+
printful_sync_product_id: lc.syncProductId,
|
|
279
|
+
medusa_product_id: created.id,
|
|
280
|
+
last_synced_at: new Date(),
|
|
281
|
+
});
|
|
282
|
+
orphans.release(created.id);
|
|
283
|
+
counters.created += 1;
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
counters.failed += 1;
|
|
287
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
288
|
+
counters.errors.push(`Product ${lc.syncProductId}: ${message}`);
|
|
291
289
|
try {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
290
|
+
await productModule.deleteProducts([created.id]);
|
|
291
|
+
orphans.release(created.id);
|
|
292
|
+
}
|
|
293
|
+
catch (deleteErr) {
|
|
294
|
+
logger.error(`Printful sync: could not delete orphaned product ${created.id} after a failed link write: ${deleteErr instanceof Error ? deleteErr.message : String(deleteErr)}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
for (const lu of input.linksToUpdate) {
|
|
299
|
+
try {
|
|
300
|
+
await printful.updatePrintfulProductLinks({
|
|
301
|
+
id: lu.linkId,
|
|
302
|
+
last_synced_at: new Date(),
|
|
303
|
+
});
|
|
304
|
+
counters.updated += 1;
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
counters.failed += 1;
|
|
308
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
309
|
+
counters.errors.push(`Product update link ${lu.syncProductId}: ${message}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
for (const item of input.reconcileItems) {
|
|
313
|
+
try {
|
|
314
|
+
const medusaProductId = item.isCreate
|
|
315
|
+
? createdBySyncId.get(item.syncProductId)?.id
|
|
316
|
+
: item.medusaProductId;
|
|
317
|
+
if (!medusaProductId)
|
|
318
|
+
continue;
|
|
319
|
+
const linked = await productModule.retrieveProduct(medusaProductId, {
|
|
320
|
+
relations: ["variants"],
|
|
321
|
+
});
|
|
322
|
+
await (0, variant_links_1.reconcileVariantLinks)(printful, {
|
|
323
|
+
storeId: input.storeId,
|
|
324
|
+
syncProductId: item.syncProductId,
|
|
325
|
+
syncVariantIds: item.syncVariantIds,
|
|
326
|
+
medusaVariants: (linked.variants ?? []).map((pv) => ({
|
|
327
|
+
id: pv.id,
|
|
328
|
+
metadata: pv.metadata,
|
|
329
|
+
})),
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
catch (err) {
|
|
333
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
334
|
+
logger.error(`Failed to reconcile variant links for ${item.syncProductId}: ${message}`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return new workflows_sdk_1.StepResponse({ counters, orphanProductIds: orphans.toDelete() }, { orphanProductIds: orphans.toDelete() });
|
|
338
|
+
}, async (compensateInput, { container }) => {
|
|
339
|
+
if (!compensateInput?.orphanProductIds?.length) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
343
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
344
|
+
for (const id of compensateInput.orphanProductIds) {
|
|
345
|
+
try {
|
|
346
|
+
await productModule.deleteProducts([id]);
|
|
347
|
+
}
|
|
348
|
+
catch (err) {
|
|
349
|
+
logger.error(`Printful sync rollback: could not delete orphaned product ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
logger.info(`Printful sync rolled back ${compensateInput.orphanProductIds.length} orphaned product(s)`);
|
|
353
|
+
});
|
|
354
|
+
const removalsAndBundlesStep = (0, workflows_sdk_1.createStep)({
|
|
355
|
+
name: "printful-removals-bundles",
|
|
356
|
+
async: true,
|
|
357
|
+
backgroundExecution: true,
|
|
358
|
+
}, async (input, { container }) => {
|
|
359
|
+
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
360
|
+
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
361
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
362
|
+
const counters = {
|
|
363
|
+
created: input.counters.created,
|
|
364
|
+
updated: input.counters.updated,
|
|
365
|
+
failed: input.counters.failed,
|
|
366
|
+
errors: [...input.counters.errors],
|
|
367
|
+
};
|
|
368
|
+
const removalPolicy = input.options.onRemovedFromPrintful ?? "unpublish";
|
|
369
|
+
if ((0, removed_1.shouldRunRemovalPass)({ policy: removalPolicy, limit: input.limit })) {
|
|
370
|
+
try {
|
|
371
|
+
const seenIds = input.summaries.map((s) => String(s.id));
|
|
372
|
+
const links = await printful.listPrintfulProductLinks({ printful_store_id: input.storeId }, { take: 100_000 });
|
|
373
|
+
const missing = (0, removed_1.findMissingSyncProductLinks)(links, seenIds);
|
|
374
|
+
for (const link of missing) {
|
|
375
|
+
try {
|
|
376
|
+
const product = await productModule.retrieveProduct(link.medusa_product_id);
|
|
377
|
+
const plan = (0, removed_1.planRemovedProductWrite)({
|
|
378
|
+
policy: removalPolicy,
|
|
379
|
+
currentStatus: product.status === "published" ? "published" : "draft",
|
|
380
|
+
currentMetadata: (product.metadata ?? {}),
|
|
381
|
+
});
|
|
382
|
+
if (plan.action === "unpublish") {
|
|
383
|
+
await productModule.updateProducts(link.medusa_product_id, {
|
|
384
|
+
status: plan.status,
|
|
385
|
+
metadata: plan.metadata,
|
|
303
386
|
});
|
|
304
|
-
|
|
305
|
-
await productModule.updateProducts(link.medusa_product_id, {
|
|
306
|
-
status: plan.status,
|
|
307
|
-
metadata: plan.metadata,
|
|
308
|
-
});
|
|
309
|
-
counters.updated += 1;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
catch (err) {
|
|
313
|
-
counters.failed += 1;
|
|
314
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
315
|
-
counters.errors.push(`Removed product ${link.printful_sync_product_id}: ${message}`);
|
|
387
|
+
counters.updated += 1;
|
|
316
388
|
}
|
|
317
|
-
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
318
|
-
products_processed: processed,
|
|
319
|
-
products_total: toProcess.length,
|
|
320
|
-
});
|
|
321
389
|
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
counters.failed += 1;
|
|
392
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
393
|
+
counters.errors.push(`Removed product ${link.printful_sync_product_id}: ${message}`);
|
|
394
|
+
}
|
|
395
|
+
await printful.heartbeatSyncLog(input.sync_log_id, {
|
|
396
|
+
products_processed: input.summaries.length,
|
|
397
|
+
products_total: input.summaries.length,
|
|
398
|
+
});
|
|
322
399
|
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
}
|
|
400
|
+
}
|
|
401
|
+
catch (err) {
|
|
402
|
+
counters.failed += 1;
|
|
403
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
404
|
+
counters.errors.push(`Removal pass failed: ${message}`);
|
|
405
|
+
logger.error(`Printful sync removal pass failed: ${message}`);
|
|
329
406
|
}
|
|
330
407
|
}
|
|
331
|
-
// Bundles. They have no Printful product of their own, so the loop above
|
|
332
|
-
// never reaches them: nothing in `summaries` names a bundle. Without this
|
|
333
|
-
// pass a bundle stays on sale after a member sells out, and every order
|
|
334
|
-
// containing it fails at Printful.
|
|
335
|
-
//
|
|
336
|
-
// Only after a full pass, for the same reason the removal pass is gated: a
|
|
337
|
-
// `limit` leaves most members unrefreshed, and deciding availability from
|
|
338
|
-
// stale metadata would draft bundles on last week's stock.
|
|
339
408
|
if (!input.limit) {
|
|
340
409
|
try {
|
|
341
410
|
const products = await productModule.listProducts({}, { take: 100_000, relations: ["variants"] });
|
|
@@ -367,63 +436,91 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
367
436
|
}
|
|
368
437
|
}
|
|
369
438
|
catch (err) {
|
|
370
|
-
// Isolated like the removal pass: bundles are a small part of the
|
|
371
|
-
// catalogue, and failing to reconcile them must not fail a sync that
|
|
372
|
-
// otherwise imported every product correctly.
|
|
373
439
|
counters.failed += 1;
|
|
374
440
|
const message = err instanceof Error ? err.message : String(err);
|
|
375
441
|
counters.errors.push(`Bundle pass failed: ${message}`);
|
|
376
442
|
logger.error(`Printful sync bundle pass failed: ${message}`);
|
|
377
443
|
}
|
|
378
444
|
}
|
|
379
|
-
|
|
380
|
-
// than the distinct product-and-colour count, the probe key has regressed.
|
|
381
|
-
logger.info(`Printful sync: ${catalogCache.calls} catalog variant call(s) for design parameters`);
|
|
382
|
-
return new workflows_sdk_1.StepResponse(counters, { orphanProductIds: orphans.toDelete() });
|
|
383
|
-
}, async (compensateInput, { container }) => {
|
|
384
|
-
if (!compensateInput?.orphanProductIds?.length) {
|
|
385
|
-
return;
|
|
386
|
-
}
|
|
387
|
-
const productModule = container.resolve(utils_1.Modules.PRODUCT);
|
|
388
|
-
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
389
|
-
// Delete through the product module so variants, prices, and images go
|
|
390
|
-
// with the product rather than being orphaned a second time.
|
|
391
|
-
for (const id of compensateInput.orphanProductIds) {
|
|
392
|
-
try {
|
|
393
|
-
await productModule.deleteProducts([id]);
|
|
394
|
-
}
|
|
395
|
-
catch (err) {
|
|
396
|
-
logger.error(`Printful sync rollback: could not delete orphaned product ${id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
logger.info(`Printful sync rolled back ${compensateInput.orphanProductIds.length} orphaned product(s)`);
|
|
445
|
+
return new workflows_sdk_1.StepResponse(counters);
|
|
400
446
|
});
|
|
401
447
|
const finalizeSyncLogStep = (0, workflows_sdk_1.createStep)("printful-finalize-sync-log", async (input, { container }) => {
|
|
402
448
|
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
status
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
:
|
|
413
|
-
|
|
414
|
-
|
|
449
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
450
|
+
try {
|
|
451
|
+
const status = (0, sync_status_1.planSyncLogStatus)(input.counters);
|
|
452
|
+
const log = await printful.updatePrintfulSyncLogs({
|
|
453
|
+
id: input.logId,
|
|
454
|
+
status,
|
|
455
|
+
finished_at: new Date(),
|
|
456
|
+
products_created: input.counters.created,
|
|
457
|
+
products_updated: input.counters.updated,
|
|
458
|
+
products_failed: input.counters.failed,
|
|
459
|
+
error_message: input.counters.errors.length > 0
|
|
460
|
+
? input.counters.errors.slice(0, 20).join("\n")
|
|
461
|
+
: null,
|
|
462
|
+
});
|
|
463
|
+
logger.info(`Printful sync completed with status ${status}: ` +
|
|
464
|
+
`${input.counters.created} created, ` +
|
|
465
|
+
`${input.counters.updated} updated, ` +
|
|
466
|
+
`${input.counters.failed} failed`);
|
|
467
|
+
return new workflows_sdk_1.StepResponse(log);
|
|
468
|
+
}
|
|
469
|
+
catch (err) {
|
|
470
|
+
logger.error(`Printful sync could not finalize log ${input.logId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
471
|
+
throw err;
|
|
472
|
+
}
|
|
415
473
|
});
|
|
416
474
|
exports.syncProductsWorkflow = (0, workflows_sdk_1.createWorkflow)("printful-sync-products", (input) => {
|
|
417
|
-
const
|
|
418
|
-
const
|
|
475
|
+
const fetchRes = fetchPrintfulProductsStep(input);
|
|
476
|
+
const mapRes = mapToMedusaProductsStep({
|
|
477
|
+
sync_log_id: input.sync_log_id,
|
|
478
|
+
toProcess: fetchRes.toProcess,
|
|
479
|
+
details: fetchRes.details,
|
|
480
|
+
options: fetchRes.options,
|
|
481
|
+
storeId: fetchRes.storeId,
|
|
482
|
+
initialCounters: fetchRes.initialCounters,
|
|
483
|
+
});
|
|
484
|
+
const createProductsInput = (0, workflows_sdk_1.transform)({ productsToCreate: mapRes.productsToCreate }, (data) => ({
|
|
485
|
+
input: { products: data.productsToCreate },
|
|
486
|
+
}));
|
|
487
|
+
const createdProducts = core_flows_1.createProductsWorkflow.runAsStep(createProductsInput);
|
|
488
|
+
updateMedusaProductsStep(mapRes.productsToUpdate);
|
|
489
|
+
const batchVariantsInput = (0, workflows_sdk_1.transform)({
|
|
490
|
+
variantsToCreate: mapRes.variantsToCreate,
|
|
491
|
+
variantsToUpdate: mapRes.variantsToUpdate,
|
|
492
|
+
}, (data) => ({
|
|
493
|
+
input: {
|
|
494
|
+
create: data.variantsToCreate,
|
|
495
|
+
update: data.variantsToUpdate,
|
|
496
|
+
},
|
|
497
|
+
}));
|
|
498
|
+
core_flows_1.batchProductVariantsWorkflow.runAsStep(batchVariantsInput);
|
|
499
|
+
const linkRes = syncLinksStep({
|
|
500
|
+
createdProducts,
|
|
501
|
+
linksToCreate: mapRes.linksToCreate,
|
|
502
|
+
linksToUpdate: mapRes.linksToUpdate,
|
|
503
|
+
reconcileItems: mapRes.reconcileItems,
|
|
504
|
+
storeId: fetchRes.storeId,
|
|
505
|
+
counters: mapRes.counters,
|
|
506
|
+
});
|
|
507
|
+
const finalCounters = removalsAndBundlesStep({
|
|
508
|
+
sync_log_id: input.sync_log_id,
|
|
509
|
+
limit: input.limit,
|
|
510
|
+
storeId: fetchRes.storeId,
|
|
511
|
+
options: fetchRes.options,
|
|
512
|
+
summaries: fetchRes.toProcess,
|
|
513
|
+
counters: linkRes.counters,
|
|
514
|
+
});
|
|
515
|
+
const finalizeInput = (0, workflows_sdk_1.transform)({ input, counters: finalCounters }, (data) => ({
|
|
419
516
|
logId: data.input.sync_log_id,
|
|
420
517
|
counters: data.counters,
|
|
421
518
|
}));
|
|
422
519
|
const finalLog = finalizeSyncLogStep(finalizeInput);
|
|
423
520
|
return new workflows_sdk_1.WorkflowResponse({
|
|
424
521
|
sync_log: finalLog,
|
|
425
|
-
counters,
|
|
522
|
+
counters: finalCounters,
|
|
426
523
|
});
|
|
427
524
|
});
|
|
428
525
|
exports.default = exports.syncProductsWorkflow;
|
|
429
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3luYy1wcm9kdWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFNMEM7QUFDMUMsNERBR29DO0FBQ3BDLHFEQUE4RTtBQUM5RSxrREFBcUQ7QUFFckQsOENBQWdGO0FBQ2hGLDhDQUFnRDtBQUNoRCwwREFBOEQ7QUFDOUQsc0RBQXdEO0FBQ3hELDBDQUl1QjtBQUN2Qiw4Q0FLeUI7QUFDekIsNENBQStFO0FBQy9FLDRDQUEyRTtBQWdCM0UsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDBCQUFVLEVBQ2pDO0lBQ0UsSUFBSSxFQUFFLHdCQUF3QjtJQUM5Qiw0REFBNEQ7SUFDNUQsMEVBQTBFO0lBQzFFLEtBQUssRUFBRSxJQUFJO0lBQ1gsbUJBQW1CLEVBQUUsSUFBSTtJQUN6Qix5RUFBeUU7SUFDekUsa0VBQWtFO0lBQ2xFLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLG9DQUFvQztDQUNyQyxFQUNELEtBQUssRUFBRSxLQUF3QixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUNoRCxNQUFNLFFBQVEsR0FBMEIsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBZSxDQUFDLENBQUE7SUFDMUUsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUs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
|
|
526
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3luYy1wcm9kdWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFNMEM7QUFDMUMsNERBR29DO0FBQ3BDLHFEQUE4RTtBQUM5RSxrREFBcUQ7QUFFckQsOENBQWdGO0FBQ2hGLDhDQUFnRDtBQUNoRCwwREFBOEQ7QUFDOUQsc0RBQXdEO0FBQ3hELDBDQUl1QjtBQUN2Qiw4Q0FLeUI7QUFDekIsNENBQStFO0FBQy9FLDRDQUEyRTtBQWlDM0UsTUFBTSx5QkFBeUIsR0FBRyxJQUFBLDBCQUFVLEVBQzFDO0lBQ0UsSUFBSSxFQUFFLHlCQUF5QjtJQUMvQixLQUFLLEVBQUUsSUFBSTtJQUNYLG1CQUFtQixFQUFFLElBQUk7Q0FDMUIsRUFDRCxLQUFLLEVBQUUsS0FBd0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDaEQsTUFBTSxRQUFRLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQUMsMEJBQWUsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBQzNDLE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBRTNDLE1BQU0sU0FBUyxHQUFHLE1BQU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDO1FBQ2pELEtBQUssRUFBRSxHQUFHO0tBQ1gsQ0FBQyxDQUFBO0lBRUYsTUFBTSxTQUFTLEdBQ2IsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBRW5FLE1BQU0sUUFB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
|