← back to Zero Price Draft Disarm

supplement.mjs

25 lines

// TK-12276: re-read products that hit the variants(first:25) cap with first:250 (read-only).
import fs from 'node:fs';
const env=fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8');
const TOK=process.env.SHOPIFY_ADMIN_TOKEN||env.match(/^SHOPIFY_ADMIN_TOKEN=["']?([^"'\n]+)/m)[1];
const rows=fs.readFileSync('data/draft-variants.jsonl','utf8').trim().split('\n').map(JSON.parse);
const cnt={};for(const r of rows)cnt[r.product_id]=(cnt[r.product_id]||0)+1;
const ids=Object.keys(cnt).filter(k=>cnt[k]>=25);
const isSample=v=>/sample|memo/i.test(v.title||'')||/-sample$/i.test(v.sku||'');
const A=JSON.parse(fs.readFileSync('data/armed.json','utf8'));
const have=new Set(A.armed.map(a=>a.variant_id));let added=0;const info=[];
for(const id of ids){
 const r=await fetch('https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json',{method:'POST',headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},body:JSON.stringify({query:`{product(id:"${id}"){id vendor handle title status createdAt variants(first:250){nodes{id sku title price inventoryPolicy inventoryQuantity inventoryItem{id tracked}}}}}`})});
 const p=(await r.json()).data.product; info.push([p.vendor,p.variants.nodes.length]);
 for(const v of p.variants.nodes){ if(have.has(v.id))continue;
  const row={product_id:p.id,vendor:p.vendor,handle:p.handle,title:p.title,status:p.status,created_at:p.createdAt,variant_id:v.id,sku:v.sku,vtitle:v.title,price:Number(v.price),policy:v.inventoryPolicy,qty:v.inventoryQuantity,inventory_item_id:v.inventoryItem?.id,tracked:v.inventoryItem?.tracked,sample:isSample(v)};
  if(!(row.price>0)&&!row.sample&&(row.qty>0||row.policy==='CONTINUE'||row.tracked===false)){A.armed.push(row);added++;}}
}
const bv={};for(const a of A.armed)bv[a.vendor]=(bv[a.vendor]||0)+1;
A.summary.armed_variants=A.armed.length;A.summary.armed_products=new Set(A.armed.map(a=>a.product_id)).size;
A.summary.armed_by_vendor=Object.fromEntries(Object.entries(bv).sort((a,b)=>b[1]-a[1]));
A.summary.by_reason={qty_gt_0:A.armed.filter(a=>a.qty>0).length,policy_continue:A.armed.filter(a=>a.policy==='CONTINUE').length,untracked:A.armed.filter(a=>a.tracked===false).length,qty_2026:A.armed.filter(a=>a.qty===2026).length};
A.summary.variants_truncated_note=`variants(first:25) per product; ${ids.length} capped products re-read at first:250 (+${added} armed)`;
fs.writeFileSync('data/armed.json',JSON.stringify(A,null,1));
console.log(JSON.stringify({capped:ids.length,info,added,summary:A.summary},null,1));