← back to York Yardgood Exec

york73-rollback.mjs

20 lines

#!/usr/bin/env node
// One-click revert of york73.mjs --apply. Reads data/restore-map.jsonl, restores old price + uom + position.
import { readFileSync } from 'node:fs';
const TOKEN = readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8')
  .split('\n').find(l=>l.startsWith('SHOPIFY_ADMIN_TOKEN=')).split('=')[1].trim();
const SHOP='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
const DIR=new URL('.',import.meta.url).pathname;
const gql=(q,v)=>fetch(SHOP,{method:'POST',headers:{'X-Shopify-Access-Token':TOKEN,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})}).then(r=>r.json());
const rows=readFileSync(DIR+'data/restore-map.jsonl','utf8').trim().split('\n').filter(Boolean).map(l=>JSON.parse(l));
let ok=0;
for(const r of rows){
  const pid=`gid://shopify/Product/${r.pid}`;
  await gql(`mutation($m:[MetafieldsSetInput!]!){metafieldsSet(metafields:$m){userErrors{message}}}`,
    {m:[{ownerId:pid,namespace:'global',key:'unit_of_measure',type:'single_line_text_field',value:r.old.uom||''}]});
  await gql(`mutation($pid:ID!,$v:[ProductVariantsBulkInput!]!){productVariantsBulkUpdate(productId:$pid,variants:$v){userErrors{message}}}`,
    {pid,v:[{id:r.sellVid,price:r.old.price,optionValues:[{optionName:'Size',name:r.old.title}]}]});
  console.log('reverted',r.pid,'->',r.old.price,r.old.title); ok++;
}
console.log('ROLLBACK done —',ok,'products');