← back to Hollywood Optc

build-held36-dryrun.mjs

39 lines

import { readFileSync, writeFileSync } from 'node:fs';
const TOKEN=process.env.SHOPIFY_ADMIN_TOKEN;
const SHOP="designer-laboratory-sandbox.myshopify.com", VER="2024-10";
const handles=readFileSync('/tmp/held36-handles.txt','utf8').split('\n').map(s=>s.trim()).filter(Boolean);
async function gj(url,t=0){const r=await fetch(url,{headers:{"X-Shopify-Access-Token":TOKEN}});
 if(r.status===429){await new Promise(x=>setTimeout(x,2000));return gj(url,t);}
 if((r.status===502||r.status===503)&&t<3){await new Promise(x=>setTimeout(x,1500));return gj(url,t+1);}
 if(!r.ok)throw new Error(r.status+" "+url);return r.json();}
const applySet=[]; const problems=[];
for(const h of handles){
 const j=await gj(`https://${SHOP}/admin/api/${VER}/products.json?handle=${h}&fields=id,handle,status,variants`);
 const p=(j.products||[])[0];
 if(!p){problems.push({h,why:'not found live'});continue;}
 const mj=await gj(`https://${SHOP}/admin/api/${VER}/products/${p.id}/metafields.json?limit=250`);
 const mfs=mj.metafields||[];
 const dwskus=mfs.filter(m=>m.key==='dw_sku').map(m=>String(m.value).trim().toUpperCase());
 const hwc=dwskus.find(v=>/^HWC-\d+$/.test(v));
 const unanimous = dwskus.length>0 && dwskus.every(v=>v===hwc);
 if(!hwc){problems.push({h,why:'no HWC in live dw_sku',dwskus});continue;}
 if(!unanimous){problems.push({h,why:'dw_sku namespaces disagree',dwskus});continue;}
 // build variant writes: DWHD-* base -> HWC, DWHD-*-Sample -> HWC-Sample
 const writes=[];
 for(const v of p.variants){
   const cur=String(v.sku||'');
   if(!/^DWHD/i.test(cur)){problems.push({h,why:'variant not DWHD',cur});continue;}
   const isSample=/-sample$/i.test(cur);
   const target=isSample?`${hwc}-Sample`:hwc;
   if(cur===target)continue;
   writes.push({variant_id:v.id,from_sku:cur,to_sku:target,title:v.title});
 }
 if(writes.length) applySet.push({product_id:p.id,handle:h,hwc,manufacturer_sku_untouched:true,writes});
}
const out={generated_at:new Date().toISOString(),ticket:'TK-10633',scope:'held36-metafield-clean-HWC-remap',
 products:applySet.length, variant_writes:applySet.reduce((a,x)=>a+x.writes.length,0),
 apply_set:applySet, problems};
writeFileSync('data/held36-dryrun.json',JSON.stringify(out,null,2));
console.log('products:',out.products,'| variant_writes:',out.variant_writes,'| problems:',problems.length);
if(problems.length)console.log('PROBLEMS:',JSON.stringify(problems.slice(0,10),null,1));