← 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`);
})();