@legenki/print2medusa 0.5.1 → 0.5.3
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/utils/costs.js +48 -4
- package/.medusa/server/src/utils/sync-status.js +26 -0
- package/.medusa/server/src/utils/variant-links.js +116 -0
- package/.medusa/server/src/workflows/create-printful-order.js +24 -12
- package/.medusa/server/src/workflows/sync-products.js +41 -42
- package/package.json +1 -1
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.MARGIN_KEY = exports.RETAIL_TOTAL_KEY = exports.RETAIL_CURRENCY_KEY = exports.COST_TOTAL_KEY = exports.COST_CURRENCY_KEY = void 0;
|
|
4
4
|
exports.toMinorUnits = toMinorUnits;
|
|
5
5
|
exports.planCostMetadata = planCostMetadata;
|
|
6
|
+
exports.planCreatedOrderMetadata = planCreatedOrderMetadata;
|
|
6
7
|
/**
|
|
7
8
|
* Printful reports money as JSON numbers in major units (12.34), and Medusa
|
|
8
9
|
* stores integer minor units (1234). Everything crossing that boundary goes
|
|
@@ -58,6 +59,22 @@ const COST_FIELDS = [
|
|
|
58
59
|
* Every amount is in minor units. A field that could not be parsed is omitted
|
|
59
60
|
* rather than defaulted, so a partial Printful response never turns into a
|
|
60
61
|
* confidently wrong margin.
|
|
62
|
+
*
|
|
63
|
+
* Fee keys are a namespace, not a set of independent values: both call sites
|
|
64
|
+
* merge the result over the order's existing metadata, so a fee this response
|
|
65
|
+
* does not carry is emitted as an explicit `undefined` to overwrite whatever a
|
|
66
|
+
* previous response left there. Without it a refresh that dropped `shipping`
|
|
67
|
+
* would leave the old shipping fee sitting beside a brand new total.
|
|
68
|
+
*
|
|
69
|
+
* `undefined` rather than `null` is deliberate and was checked against a real
|
|
70
|
+
* Postgres: the `undefined` survives the object spread (so it does overwrite
|
|
71
|
+
* the stale value) and is then dropped by JSON serialization into the jsonb
|
|
72
|
+
* metadata column, so the key disappears entirely. `null` would instead
|
|
73
|
+
* persist as a literal null sitting in the metadata forever.
|
|
74
|
+
*
|
|
75
|
+
* The one case that clears nothing is an order with no cost data at all: an
|
|
76
|
+
* empty patch means "we learned nothing", which must not wipe fees an earlier,
|
|
77
|
+
* better-informed response legitimately stored.
|
|
61
78
|
*/
|
|
62
79
|
function planCostMetadata(order) {
|
|
63
80
|
const metadata = {};
|
|
@@ -78,9 +95,11 @@ function planCostMetadata(order) {
|
|
|
78
95
|
}
|
|
79
96
|
for (const field of COST_FIELDS) {
|
|
80
97
|
const value = toMinorUnits(costs[field]);
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
98
|
+
// Assigned unconditionally: a zero, unparseable, or absent fee has to
|
|
99
|
+
// land as `undefined` so the spread clears any stale value rather than
|
|
100
|
+
// leaving it beside a fresher total.
|
|
101
|
+
metadata[`printful_cost_${field}`] =
|
|
102
|
+
value !== undefined && value !== 0 ? value : undefined;
|
|
84
103
|
}
|
|
85
104
|
}
|
|
86
105
|
if (retail) {
|
|
@@ -106,4 +125,29 @@ function planCostMetadata(order) {
|
|
|
106
125
|
}
|
|
107
126
|
return metadata;
|
|
108
127
|
}
|
|
109
|
-
|
|
128
|
+
/**
|
|
129
|
+
* Build the order-metadata patch for an order Printful has just created.
|
|
130
|
+
*
|
|
131
|
+
* The identity keys matter as much as the costs: the admin order widget gates
|
|
132
|
+
* its entire render on `printful_order_id`, so without them a freshly created
|
|
133
|
+
* order shows the merchant no Printful panel at all until the first webhook
|
|
134
|
+
* arrives — even though the order exists in Printful and its costs are stored.
|
|
135
|
+
*
|
|
136
|
+
* The key names deliberately match `planOrderStateActions`, so the webhook path
|
|
137
|
+
* later overwrites these values rather than writing a parallel set.
|
|
138
|
+
*
|
|
139
|
+
* `printful_status_updated_at` is *not* stamped here. It is the "Last synced"
|
|
140
|
+
* breadcrumb, meaning "when we last re-read the order from Printful". Creation
|
|
141
|
+
* is not a re-read, and claiming it was would date a status that no webhook has
|
|
142
|
+
* yet confirmed. The first real sync sets it.
|
|
143
|
+
*/
|
|
144
|
+
function planCreatedOrderMetadata(order) {
|
|
145
|
+
return {
|
|
146
|
+
// Spread first so an identity key always wins a name collision rather than
|
|
147
|
+
// being silently overwritten by a cost key.
|
|
148
|
+
...planCostMetadata(order),
|
|
149
|
+
printful_order_id: String(order.id),
|
|
150
|
+
printful_status: order.status,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvY29zdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBV0Esb0NBdUJDO0FBOENELDRDQTBEQztBQWtCRCw0REFVQztBQXBLRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLFlBQVksQ0FDMUIsS0FBeUM7SUFFekMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzFELE9BQU8sQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQUVELElBQUksQ0FBUyxDQUFBO0lBQ2IsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixDQUFDLEdBQUcsS0FBSyxDQUFBO0lBQ1gsQ0FBQztTQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckMsMkVBQTJFO1FBQzNFLDJEQUEyRDtRQUMzRCxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ25CLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEIsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUE7QUFDNUIsQ0FBQztBQUVZLFFBQUEsaUJBQWlCLEdBQUcsd0JBQXdCLENBQUE7QUFDNUMsUUFBQSxjQUFjLEdBQUcscUJBQXFCLENBQUE7QUFDdEMsUUFBQSxtQkFBbUIsR0FBRywwQkFBMEIsQ0FBQTtBQUNoRCxRQUFBLGdCQUFnQixHQUFHLHVCQUF1QixDQUFBO0FBQzFDLFFBQUEsVUFBVSxHQUFHLGlCQUFpQixDQUFBO0FBRTNDLG1GQUFtRjtB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
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.planSyncLogStatus = planSyncLogStatus;
|
|
4
|
+
/**
|
|
5
|
+
* Decide how a finished sync run should be reported.
|
|
6
|
+
*
|
|
7
|
+
* The distinction that matters is between "nothing worked" and "some of it
|
|
8
|
+
* worked". Collapsing the second into `success` is operationally misleading:
|
|
9
|
+
* a run with 100 failures and one successful update used to show the merchant
|
|
10
|
+
* a green sync while most of the catalog never imported.
|
|
11
|
+
*
|
|
12
|
+
* - nothing succeeded and something failed → `failed`
|
|
13
|
+
* - something failed but something succeeded → `partial`
|
|
14
|
+
* - nothing failed → `success`
|
|
15
|
+
*
|
|
16
|
+
* A run that created and updated nothing without failing is still `success` —
|
|
17
|
+
* an empty Printful store is not an error, there was simply nothing to do.
|
|
18
|
+
*/
|
|
19
|
+
function planSyncLogStatus(counters) {
|
|
20
|
+
if (counters.failed <= 0) {
|
|
21
|
+
return "success";
|
|
22
|
+
}
|
|
23
|
+
const succeeded = counters.created > 0 || counters.updated > 0;
|
|
24
|
+
return succeeded ? "partial" : "failed";
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1zdGF0dXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvc3luYy1zdGF0dXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF3QkEsOENBU0M7QUF4QkQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FDL0IsUUFBNkI7SUFFN0IsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQTtJQUM5RCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7QUFDekMsQ0FBQyJ9
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reconcile a Printful product's sync variants against the variant link rows
|
|
4
|
+
* that should exist for them.
|
|
5
|
+
*
|
|
6
|
+
* Why this needs to repair and not just refresh: a variant link row can go
|
|
7
|
+
* missing without the product link row going missing. The create path writes
|
|
8
|
+
* the product link first, then loops writing variant links; a throw partway
|
|
9
|
+
* through that loop leaves a product that the next sync correctly finds and
|
|
10
|
+
* takes the *update* path for, with some of its variants unlinked. Nothing
|
|
11
|
+
* else closes that gap — `diffVariantsForUpsert` matches on variant metadata
|
|
12
|
+
* (`printful_sync_variant_id`), not on link rows, so a stranded variant looks
|
|
13
|
+
* already-synced and is never re-created.
|
|
14
|
+
*
|
|
15
|
+
* The stakes are order creation: `findVariantLinkByMedusaId` resolves the
|
|
16
|
+
* `sync_variant_id` Printful needs through these rows, so a stranded variant
|
|
17
|
+
* can fail to map when a customer orders it.
|
|
18
|
+
*
|
|
19
|
+
* Pure: decides intent, writes nothing. That keeps the boundary testable
|
|
20
|
+
* without a container or a database, the same way OrphanTracker is.
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.planVariantLinkRepair = planVariantLinkRepair;
|
|
24
|
+
exports.reconcileVariantLinks = reconcileVariantLinks;
|
|
25
|
+
function planVariantLinkRepair(input) {
|
|
26
|
+
const linkBySyncId = new Map();
|
|
27
|
+
for (const link of input.existingLinks) {
|
|
28
|
+
linkBySyncId.set(String(link.printful_sync_variant_id), link);
|
|
29
|
+
}
|
|
30
|
+
// Only variants carrying a sync id are candidates. A manually-added Medusa
|
|
31
|
+
// variant has none, and must never be linked to Printful.
|
|
32
|
+
const variantBySyncId = new Map();
|
|
33
|
+
for (const variant of input.medusaVariants) {
|
|
34
|
+
const syncId = variant.metadata?.printful_sync_variant_id;
|
|
35
|
+
if (syncId != null && syncId !== "") {
|
|
36
|
+
variantBySyncId.set(String(syncId), variant);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const toRefresh = [];
|
|
40
|
+
const toCreate = [];
|
|
41
|
+
for (const rawSyncId of input.syncVariantIds) {
|
|
42
|
+
const syncId = String(rawSyncId);
|
|
43
|
+
const existing = linkBySyncId.get(syncId);
|
|
44
|
+
if (existing) {
|
|
45
|
+
toRefresh.push({ id: existing.id });
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// No link row. Repair it only when there is a Medusa variant to point at —
|
|
49
|
+
// inventing a row for a variant that does not exist would send order
|
|
50
|
+
// creation to a dangling id, which is worse than the missing row.
|
|
51
|
+
const variant = variantBySyncId.get(syncId);
|
|
52
|
+
if (!variant) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
toCreate.push({
|
|
56
|
+
printful_sync_variant_id: syncId,
|
|
57
|
+
medusa_variant_id: variant.id,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return { toRefresh, toCreate };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Bring a product's variant link rows up to date, creating any that are
|
|
64
|
+
* missing.
|
|
65
|
+
*
|
|
66
|
+
* Each link is written independently and a failure on one does not abort the
|
|
67
|
+
* rest. That is deliberate: an all-or-nothing loop is exactly what stranded
|
|
68
|
+
* these rows to begin with, and a partial repair still strictly improves on
|
|
69
|
+
* leaving every later variant unlinked. Whatever this pass could not write is
|
|
70
|
+
* simply retried by the next sync, because the plan is recomputed from the
|
|
71
|
+
* rows that actually exist rather than from anything this run recorded.
|
|
72
|
+
*/
|
|
73
|
+
async function reconcileVariantLinks(store, input) {
|
|
74
|
+
// Read the current rows through the same lookup the workflow used before, so
|
|
75
|
+
// the store filter (`printful_store_id`) keeps applying.
|
|
76
|
+
const existingLinks = [];
|
|
77
|
+
for (const rawSyncId of input.syncVariantIds) {
|
|
78
|
+
const syncId = String(rawSyncId);
|
|
79
|
+
const link = await store.findVariantLink(syncId);
|
|
80
|
+
if (link) {
|
|
81
|
+
existingLinks.push({ id: link.id, printful_sync_variant_id: syncId });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const plan = planVariantLinkRepair({
|
|
85
|
+
syncVariantIds: input.syncVariantIds,
|
|
86
|
+
existingLinks,
|
|
87
|
+
medusaVariants: input.medusaVariants,
|
|
88
|
+
});
|
|
89
|
+
let created = 0;
|
|
90
|
+
let refreshed = 0;
|
|
91
|
+
for (const link of plan.toRefresh) {
|
|
92
|
+
await store.updatePrintfulVariantLinks({
|
|
93
|
+
id: link.id,
|
|
94
|
+
last_synced_at: new Date(),
|
|
95
|
+
});
|
|
96
|
+
refreshed += 1;
|
|
97
|
+
}
|
|
98
|
+
for (const link of plan.toCreate) {
|
|
99
|
+
try {
|
|
100
|
+
await store.createPrintfulVariantLinks({
|
|
101
|
+
printful_store_id: input.storeId,
|
|
102
|
+
printful_sync_product_id: input.syncProductId,
|
|
103
|
+
printful_sync_variant_id: link.printful_sync_variant_id,
|
|
104
|
+
medusa_variant_id: link.medusa_variant_id,
|
|
105
|
+
last_synced_at: new Date(),
|
|
106
|
+
});
|
|
107
|
+
created += 1;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Swallowed so one unwritable row cannot strand the ones after it. The
|
|
111
|
+
// next sync recomputes the plan from the table and tries again.
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return { created, refreshed };
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFudC1saW5rcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy92YXJpYW50LWxpbmtzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRzs7QUFzQkgsc0RBK0NDO0FBbUNELHNEQXNEQztBQXhJRCxTQUFnQixxQkFBcUIsQ0FBQyxLQUlyQztJQUNDLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUErQixDQUFBO0lBQzNELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsMERBQTBEO0lBQzFELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFBO0lBQ2hFLEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLENBQUE7UUFDekQsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUEwQixFQUFFLENBQUE7SUFDM0MsTUFBTSxRQUFRLEdBQXNDLEVBQUUsQ0FBQTtJQUV0RCxLQUFLLE1BQU0sU0FBUyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFaEMsTUFBTSxRQUFRLEdBQUcsWUFBWSxD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
|
|
@@ -113,24 +113,36 @@ const createPrintfulOrderStep = (0, workflows_sdk_1.createStep)("printful-create
|
|
|
113
113
|
status: pfOrder.status || "created",
|
|
114
114
|
});
|
|
115
115
|
// Printful returns the real costs with the created order, so no separate
|
|
116
|
-
// estimate call is needed.
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
116
|
+
// estimate call is needed. The identity keys ride along unconditionally —
|
|
117
|
+
// the admin widget gates on `printful_order_id`, so a costless order that
|
|
118
|
+
// wrote only costs would stay invisible until the first webhook.
|
|
119
|
+
//
|
|
120
|
+
// Written best-effort: the order exists in Printful either way, and losing
|
|
121
|
+
// the margin figure must never fail the workflow and roll back a real
|
|
122
|
+
// order. Both the Printful order and the link row exist by this point, so
|
|
123
|
+
// failing the step would trigger compensation and release the link for an
|
|
124
|
+
// order Printful is already fulfilling.
|
|
125
|
+
const orderMetadata = (0, costs_1.planCreatedOrderMetadata)(pfOrder);
|
|
126
|
+
try {
|
|
127
|
+
// Under the same advisory lock the webhook path takes. Both do a
|
|
128
|
+
// read-modify-write of `metadata`, and the link became resolvable a few
|
|
129
|
+
// lines above — so a webhook arriving in that window could re-read the
|
|
130
|
+
// order, write a newer `printful_status`, and have this write clobber it
|
|
131
|
+
// back to the status captured at creation. Serializing the two makes the
|
|
132
|
+
// last writer win on a value it actually read.
|
|
133
|
+
await printful.withOrderLock(String(pfOrder.id), async () => {
|
|
122
134
|
// `orderRow` rather than `existing` — that name is taken by the
|
|
123
135
|
// order-link lookup earlier in this step.
|
|
124
136
|
const orderRow = await orderModule.retrieveOrder(input.order_id, {
|
|
125
137
|
select: ["id", "metadata"],
|
|
126
138
|
});
|
|
127
139
|
await orderModule.updateOrders(input.order_id, {
|
|
128
|
-
metadata: { ...(orderRow.metadata ?? {}), ...
|
|
140
|
+
metadata: { ...(orderRow.metadata ?? {}), ...orderMetadata },
|
|
129
141
|
});
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
logger.error(`Printful order ${pfOrder.id}: could not store order metadata: ${err instanceof Error ? err.message : String(err)}`);
|
|
134
146
|
}
|
|
135
147
|
return new workflows_sdk_1.StepResponse({
|
|
136
148
|
skipped: false,
|
|
@@ -143,4 +155,4 @@ exports.createPrintfulOrderWorkflow = (0, workflows_sdk_1.createWorkflow)("print
|
|
|
143
155
|
return new workflows_sdk_1.WorkflowResponse(result);
|
|
144
156
|
});
|
|
145
157
|
exports.default = exports.createPrintfulOrderWorkflow;
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXByaW50ZnVsLW9yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9jcmVhdGUtcHJpbnRmdWwtb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBSzBDO0FBQzFDLHFEQUE4RTtBQUM5RSxrREFBcUQ7QUFPckQsOENBQW1EO0FBQ25ELDBDQUF5RDtBQWtCekQsTUFBTSx1QkFBdUIsR0FBRyxJQUFBLDBCQUFVLEVBQ3hDLHVCQUF1QixFQUN2QixLQUFLLEVBQUUsS0FBK0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdkQsTUFBTSxRQUFRLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQUMsMEJBQWUsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUE7SUFFekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM3RCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLDRCQUFZLENBQWU7WUFDcEMsT0FBTyxFQUFFLElBQUk7WUFDYixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUI7U0FDOUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxF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
|
|
@@ -7,6 +7,8 @@ const utils_1 = require("@medusajs/framework/utils");
|
|
|
7
7
|
const printful_1 = require("../modules/printful");
|
|
8
8
|
const mappers_1 = require("../utils/mappers");
|
|
9
9
|
const orphans_1 = require("../utils/orphans");
|
|
10
|
+
const variant_links_1 = require("../utils/variant-links");
|
|
11
|
+
const sync_status_1 = require("../utils/sync-status");
|
|
10
12
|
const stock_1 = require("../utils/stock");
|
|
11
13
|
const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
12
14
|
name: "printful-sync-products",
|
|
@@ -106,7 +108,7 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
106
108
|
});
|
|
107
109
|
}
|
|
108
110
|
if (toCreate.length) {
|
|
109
|
-
|
|
111
|
+
await (0, core_flows_1.batchProductVariantsWorkflow)(container).run({
|
|
110
112
|
input: {
|
|
111
113
|
create: toCreate.map((c) => ({
|
|
112
114
|
product_id: productId,
|
|
@@ -120,30 +122,29 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
120
122
|
})),
|
|
121
123
|
},
|
|
122
124
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (!syncVariantId) {
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
await printful.createPrintfulVariantLinks({
|
|
129
|
-
printful_store_id: storeId,
|
|
130
|
-
printful_sync_product_id: String(summary.id),
|
|
131
|
-
printful_sync_variant_id: String(syncVariantId),
|
|
132
|
-
medusa_variant_id: variant.id,
|
|
133
|
-
last_synced_at: new Date(),
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
// Refresh timestamps on existing variant links.
|
|
138
|
-
for (const v of detail.sync_variants) {
|
|
139
|
-
const existingVariant = await printful.findVariantLink(String(v.id));
|
|
140
|
-
if (existingVariant) {
|
|
141
|
-
await printful.updatePrintfulVariantLinks({
|
|
142
|
-
id: existingVariant.id,
|
|
143
|
-
last_synced_at: new Date(),
|
|
144
|
-
});
|
|
145
|
-
}
|
|
125
|
+
// No link loop here: the reconcile below re-reads the product, so
|
|
126
|
+
// these new variants are in its scope and get linked there.
|
|
146
127
|
}
|
|
128
|
+
// Refresh existing variant links AND create any that are missing.
|
|
129
|
+
// Re-read the variants so freshly-created ones are in scope; the
|
|
130
|
+
// copy fetched for the diff predates the batch create above.
|
|
131
|
+
//
|
|
132
|
+
// The refresh-only loop this replaces could never repair a link row
|
|
133
|
+
// that failed to write, because `diffVariantsForUpsert` matches on
|
|
134
|
+
// variant metadata rather than link rows — so the variant looked
|
|
135
|
+
// already-synced and its row was never written again.
|
|
136
|
+
const linked = await productModule.retrieveProduct(productId, {
|
|
137
|
+
relations: ["variants"],
|
|
138
|
+
});
|
|
139
|
+
await (0, variant_links_1.reconcileVariantLinks)(printful, {
|
|
140
|
+
storeId,
|
|
141
|
+
syncProductId: String(summary.id),
|
|
142
|
+
syncVariantIds: detail.sync_variants.map((v) => v.id),
|
|
143
|
+
medusaVariants: (linked.variants ?? []).map((pv) => ({
|
|
144
|
+
id: pv.id,
|
|
145
|
+
metadata: pv.metadata,
|
|
146
|
+
})),
|
|
147
|
+
});
|
|
147
148
|
await printful.updatePrintfulProductLinks({
|
|
148
149
|
id: existingLink.id,
|
|
149
150
|
last_synced_at: new Date(),
|
|
@@ -209,19 +210,20 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
209
210
|
// Linked — no longer an orphan, and never to be deleted.
|
|
210
211
|
orphans.release(created.id);
|
|
211
212
|
pendingProductId = undefined;
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
213
|
+
// Resumable rather than best-effort: a throw here used to abandon
|
|
214
|
+
// every remaining variant, and because the product link row above
|
|
215
|
+
// already exists, the next sync took the update path and never went
|
|
216
|
+
// back for them. Now one unwritable row costs only that row, and the
|
|
217
|
+
// next sync's reconcile picks it up.
|
|
218
|
+
await (0, variant_links_1.reconcileVariantLinks)(printful, {
|
|
219
|
+
storeId,
|
|
220
|
+
syncProductId: String(summary.id),
|
|
221
|
+
syncVariantIds: detail.sync_variants.map((v) => v.id),
|
|
222
|
+
medusaVariants: (created.variants ?? []).map((variant) => ({
|
|
223
|
+
id: variant.id,
|
|
224
|
+
metadata: variant.metadata,
|
|
225
|
+
})),
|
|
226
|
+
});
|
|
225
227
|
counters.created += 1;
|
|
226
228
|
}
|
|
227
229
|
}
|
|
@@ -283,12 +285,9 @@ const syncProductsStep = (0, workflows_sdk_1.createStep)({
|
|
|
283
285
|
});
|
|
284
286
|
const finalizeSyncLogStep = (0, workflows_sdk_1.createStep)("printful-finalize-sync-log", async (input, { container }) => {
|
|
285
287
|
const printful = container.resolve(printful_1.PRINTFUL_MODULE);
|
|
286
|
-
const failedHard = input.counters.failed > 0 &&
|
|
287
|
-
input.counters.created === 0 &&
|
|
288
|
-
input.counters.updated === 0;
|
|
289
288
|
const log = await printful.updatePrintfulSyncLogs({
|
|
290
289
|
id: input.logId,
|
|
291
|
-
status:
|
|
290
|
+
status: (0, sync_status_1.planSyncLogStatus)(input.counters),
|
|
292
291
|
finished_at: new Date(),
|
|
293
292
|
products_created: input.counters.created,
|
|
294
293
|
products_updated: input.counters.updated,
|
|
@@ -312,4 +311,4 @@ exports.syncProductsWorkflow = (0, workflows_sdk_1.createWorkflow)("printful-syn
|
|
|
312
311
|
});
|
|
313
312
|
});
|
|
314
313
|
exports.default = exports.syncProductsWorkflow;
|
|
315
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3luYy1wcm9kdWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFNMEM7QUFDMUMsNERBR29DO0FBQ3BDLHFEQUE4RTtBQUM5RSxrREFBcUQ7QUFFckQsOENBQWdGO0FBQ2hGLDhDQUFnRDtBQUNoRCwwQ0FJdUI7QUFnQnZCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSwwQkFBVSxFQUNqQztJQUNFLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsNERBQTREO0lBQzVELDBFQUEwRTtJQUMxRSxLQUFLLEVBQUUsSUFBSTtJQUNYLG1CQUFtQixFQUFFLElBQUk7SUFDekIseUVBQXlFO0lBQ3pFLGtFQUFrRTtJQUNsRSx1RUFBdUU7SUFDdkUsc0VBQXNFO0lBQ3RFLDBFQUEwRTtJQUMxRSxvQ0FBb0M7Q0FDckMsRUFDRCxLQUFLLEVBQUUsS0FBd0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDaEQsTUFBTSxRQUFRLEdBQTBCLFNBQVMsQ0FBQyxPQUFPLENBQUMsMEJBQWUsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDekMsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDM0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUE7SUFFM0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsbUJBQW1CLENBQUM7UUFDakQsS0FBSyxF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
|
|
314
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wcm9kdWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3luYy1wcm9kdWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFNMEM7QUFDMUMsNERBR29DO0FBQ3BDLHFEQUE4RTtBQUM5RSxrREFBcUQ7QUFFckQsOENBQWdGO0FBQ2hGLDhDQUFnRDtBQUNoRCwwREFBOEQ7QUFDOUQsc0RBQXdEO0FBQ3hELDBDQUl1QjtBQWdCdkIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDBCQUFVLEVBQ2pDO0lBQ0UsSUFBSSxFQUFFLHdCQUF3QjtJQUM5Qiw0REFBNEQ7SUFDNUQsMEVBQTBFO0lBQzFFLEtBQUssRUFBRSxJQUFJO0lBQ1gsbUJBQW1CLEVBQUUsSUFBSTtJQUN6Qix5RUFBeUU7SUFDekUsa0VBQWtFO0lBQ2xFLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLG9DQUFvQztDQUNyQyxFQUNELEtBQUssRUFBRSxLQUF3QixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUNoRCxNQUFNLFFBQVEsR0FBMEIsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBZSxDQUFDLENBQUE7SUFDMUUsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUUzQyxNQUFNLFNBQVMsR0FBRyxNQUFNLE1BQU0sQ0FB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
|