← back to Dw Add Sellable Variant Tk10902
rollback-all.mjs
25 lines
#!/usr/bin/env node
// TK-10902 batch rollback — deletes EVERY sellable variant this run created, from the ledger.
// Reads ~/.claude/yolo-queue/executed-reversible/ledger.jsonl, filters ticket=TK-10902
// entries with action starting "added sellable variant", and DELETEs each created variant.
// The $4.25 sample variant is NEVER touched. Usage: node rollback-all.mjs [--live]
import fs from 'fs';
import { execSync } from 'child_process';
const DOMAIN='designer-laboratory-sandbox.myshopify.com', API='2024-10';
const TOKEN=execSync(`grep -E '^SHOPIFY_ADMIN_TOKEN=' ${process.env.HOME}/Projects/secrets-manager/.env | cut -d= -f2-`).toString().trim();
const LIVE=process.argv.includes('--live');
const hdr={'X-Shopify-Access-Token':TOKEN};
const led=`${process.env.HOME}/.claude/yolo-queue/executed-reversible/ledger.jsonl`;
const rows=fs.readFileSync(led,'utf8').split('\n').filter(Boolean).map(l=>{try{return JSON.parse(l)}catch{return null}})
.filter(d=>d && d.ticket==='TK-10902' && (d.action||'').startsWith('added sellable variant') && d.variant_id);
console.log(`${LIVE?'LIVE':'DRY'} rollback of ${rows.length} variants`);
let ok=0,fail=0;
for(const r of rows){
if(!LIVE){ console.log(`WOULD DELETE variant ${r.variant_id} (prod ${r.product_id}, ${r.variant_sku})`); continue; }
const res=await fetch(`https://${DOMAIN}/admin/api/${API}/products/${r.product_id}/variants/${r.variant_id}.json`,{method:'DELETE',headers:hdr});
if(res.status===200||res.status===204){ok++;console.log(`DELETED ${r.variant_id} ${r.variant_sku}`);}
else{fail++;console.log(`FAIL ${res.status} ${r.variant_id} ${r.variant_sku}`);}
await new Promise(x=>setTimeout(x,500));
}
console.log(`done ok=${ok} fail=${fail}`);