← back to Newmor Onboard
scripts/rollback-a-bucket-sku.mjs
23 lines
// TK-10670 A-bucket SKU rollback — reverts each Sample variant SKU back to old_sku.
// Guard: only reverts a variant whose CURRENT live sku === new_sku (i.e. the apply landed it);
// skips anything already at old_sku or drifted. Reversibility record for the ledger undo.
import { gql, ROOT } from './shopify.mjs';
import fs from 'node:fs';
const MAP = JSON.parse(fs.readFileSync(`${ROOT}/artifacts/A-BUCKET-SKU-RESTORE-MAP.json`, 'utf8'));
const sleep = ms => new Promise(r => setTimeout(r, ms));
const MUT = `mutation($pid:ID!,$vars:[ProductVariantsBulkInput!]!){productVariantsBulkUpdate(productId:$pid,variants:$vars){productVariants{id inventoryItem{sku}} userErrors{message}}}`;
const out = [];
for (const r of MAP.rows) {
const d = await gql(`query($id:ID!){product(id:$id){variants(first:5){nodes{id sku}}}}`, { id: r.gid });
const v = d.product?.variants.nodes.find(x => x.id === r.variant_id);
if (!v) { out.push({ handle: r.handle, result: 'MISSING' }); continue; }
if (v.sku === r.old_sku) { out.push({ handle: r.handle, result: 'ALREADY-OLD' }); continue; }
if (v.sku !== r.new_sku) { out.push({ handle: r.handle, result: 'SKIP-DRIFT', live: v.sku }); continue; }
const w = await gql(MUT, { pid: r.gid, vars: [{ id: r.variant_id, inventoryItem: { sku: r.old_sku } }] });
const e = w.productVariantsBulkUpdate.userErrors;
out.push({ handle: r.handle, result: e.length ? 'FAIL' : 'REVERTED', errors: e });
await sleep(250);
}
const tally = out.reduce((a, r) => (a[r.result] = (a[r.result] || 0) + 1, a), {});
console.log('ROLLBACK DONE', JSON.stringify(tally));