← 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));