← back to Dw Yolo Loop

scripts/kravet-disco-archive.js

23 lines

const https=require('https'); const fs=require('fs');
const TOKEN=process.env.T, STORE='designer-laboratory-sandbox.myshopify.com';
const sleep=ms=>new Promise(r=>setTimeout(r,ms));
function gql(q,v){return new Promise(r=>{const rq=https.request("https://"+STORE+"/admin/api/2024-10/graphql.json",{method:"POST",headers:{"X-Shopify-Access-Token":TOKEN,"Content-Type":"application/json"}},x=>{let b="";x.on("data",d=>b+=d);x.on("end",()=>{try{r(JSON.parse(b))}catch(e){r({errors:b})}})});rq.write(JSON.stringify({query:q,variables:v||{}}));rq.end();});}
const rows=fs.readFileSync('/tmp/disco_algolia_confirmed.csv','utf8').trim().split('\n').slice(1).map(l=>l.split(','));
(async()=>{
  const log=['archived_at,vendor,mfr_sku,reason,old_status,title']; let ok=0,fail=0,skip=0;
  for(const [vendor,sku,gid,reason] of rows){
    try{
      const c=await gql("query($id:ID!){product(id:$id){title status}}",{id:gid});
      const p=c.data?.product; if(!p){fail++;continue;}
      if(p.status==='ARCHIVED'){ skip++; log.push(['(already)',vendor,sku,reason,p.status,JSON.stringify(p.title)].join(',')); continue; }
      const m=await gql("mutation($id:ID!){productUpdate(input:{id:$id,status:ARCHIVED}){product{status} userErrors{message}}}",{id:gid});
      const e=m.data?.productUpdate?.userErrors;
      if(e&&e.length){ fail++; }
      else { ok++; log.push([new Date().toISOString?'':'',vendor,sku,reason,p.status,JSON.stringify(p.title)].join(',')); if(ok%25===0)console.log(`  …${ok}`); }
    }catch(e){ fail++; }
    await sleep(120);
  }
  fs.writeFileSync('/tmp/disco_archived_log.csv', log.join('\n'));
  console.log(`\nDONE — archived ${ok}, already-archived ${skip}, failed ${fail}. Log: /tmp/disco_archived_log.csv`);
})();