← back to Harlequin Sample Price Analysis
scripts/tk10870-action1-rollback.mjs
20 lines
#!/usr/bin/env node
// TK-10870 ACTION 1 ROLLBACK — restore each roll variant to old_price from the restore-map.
// Usage: node tk10870-action1-rollback.mjs --apply
import { readFileSync } from 'node:fs';
const ENV = readFileSync('/Users/macstudio3/Projects/secrets-manager/.env', 'utf8');
const TOKEN = ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)[1].trim();
const DOMAIN = 'designer-laboratory-sandbox.myshopify.com';
const API = '2024-10';
const APPLY = process.argv.includes('--apply');
async function gql(query, variables){ const r=await fetch(`https://${DOMAIN}/admin/api/${API}/graphql.json`,{method:'POST',headers:{'X-Shopify-Access-Token':TOKEN,'Content-Type':'application/json'},body:JSON.stringify({query,variables})}); const j=await r.json(); if(j.errors) throw new Error(JSON.stringify(j.errors)); return j.data; }
const rm = JSON.parse(readFileSync('/Users/macstudio3/.claude/yolo-queue/executed-reversible/harlequin-tk10870-action1-reprice-restore-map.json','utf8'));
const M = `mutation($productId: ID!, $variants: [ProductVariantsBulkInput!]!){ productVariantsBulkUpdate(productId:$productId, variants:$variants){ productVariants{id price} userErrors{field message} } }`;
for (const e of rm.entries) {
if (e.result === 'skip_already_at_target') continue;
if (!APPLY) { console.log(`WOULD restore ${e.dwhq_sku} -> ${e.old_price}`); continue; }
const res = await gql(M, { productId: e.product_gid, variants: [{ id: e.variant_id, price: String(e.old_price) }] });
const ue = res.productVariantsBulkUpdate.userErrors;
console.log(ue.length ? `ERR ${e.dwhq_sku} ${JSON.stringify(ue)}` : `RESTORED ${e.dwhq_sku} -> ${e.old_price}`);
}