← back to Dw Yolo Loop
scripts/rl-zero-rootcause/rl-diag.mjs
24 lines
import fs from 'fs';
const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
const TOK=(ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1].replace(/['"\r]/g,'').trim();
const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
const sleep=ms=>new Promise(r=>setTimeout(r,ms));
async function gql(q,v){for(let a=0;a<6;a++){const r=await fetch(GQL,{method:'POST',headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});if(r.status===429){await sleep(2000*(a+1));continue;}const j=await r.json();if(j.errors&&JSON.stringify(j.errors).includes('Throttled')){await sleep(2500*(a+1));continue;}return j;}return null;}
const Q=`query($cursor:String){ products(first:100, after:$cursor, query:"status:active vendor:'Ralph Lauren'"){ pageInfo{hasNextPage endCursor} edges{node{handle createdAt variants(first:10){edges{node{title price position inventoryPolicy createdAt sku}}}}} } }`;
let cursor=null, pages=0, total=0; const zero=[];
while(pages<15){ const j=await gql(Q,{cursor}); if(!j?.data){console.log('fail',JSON.stringify(j?.errors||'').slice(0,200));break;} const c=j.data.products;
for(const e of c.edges){ const n=e.node; total++;
const vs=(n.variants?.edges||[]).map(x=>x.node).map(v=>({t:v.title,price:parseFloat(v.price),pos:v.position,ip:v.inventoryPolicy,created:v.createdAt,sku:v.sku})).filter(v=>!isNaN(v.price));
const mx=vs.length?Math.max(...vs.map(v=>v.price)):null;
if(vs.length===1 && mx===0){ zero.push({h:n.handle,prodCreated:n.createdAt,v:vs[0]}); } }
if(!c.pageInfo.hasNextPage)break; cursor=c.pageInfo.endCursor; pages++; await sleep(200); }
console.log(`RL active products: ${total} | single-variant zero-dollar: ${zero.length}`);
const years={},titles={},ipc={},vcreatedYears={};
zero.forEach(z=>{ const py=(z.prodCreated||'').slice(0,4); years[py]=(years[py]||0)+1; titles[z.v.t]=(titles[z.v.t]||0)+1; ipc[z.v.ip]=(ipc[z.v.ip]||0)+1; const vy=(z.v.created||'').slice(0,4); vcreatedYears[vy]=(vcreatedYears[vy]||0)+1; });
console.log('product createdAt year:', JSON.stringify(years));
console.log('VARIANT createdAt year:', JSON.stringify(vcreatedYears));
console.log('variant title:', JSON.stringify(titles));
console.log('inventoryPolicy:', JSON.stringify(ipc));
console.log('\nexamples:'); zero.slice(0,5).forEach(z=>console.log(` ${z.h.slice(0,40)} prodCreated=${z.prodCreated.slice(0,10)} v="${z.v.t}" $${z.v.price} vCreated=${z.v.created.slice(0,10)} sku=${z.v.sku} ${z.v.ip}`));
fs.writeFileSync('/tmp/rl-diag.json',JSON.stringify({total,zeroCount:zero.length,years,vcreatedYears,titles,ipc,examples:zero.slice(0,10)},null,2));