← back to Novasuede Min Fix
verify.mjs
45 lines
import fs from 'fs';
const env=fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8');
const get=k=>(env.match(new RegExp('^'+k+'=(.*)$','m'))||[])[1];
const TOKEN=get('SHOPIFY_ADMIN_TOKEN');
const API='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
async function gql(q,v={}){
for(let a=0;a<4;a++){
const r=await fetch(API,{method:'POST',headers:{'X-Shopify-Access-Token':TOKEN,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});
const j=await r.json();
if(j.data&&j.data.products) return j;
await new Promise(x=>setTimeout(x,1500));
}
throw new Error('query failed after retries');
}
let cursor=null, all=[];
do{
const j=await gql(`query($c:String){products(first:40,after:$c,query:"vendor:Novasuede status:active"){pageInfo{hasNextPage endCursor} nodes{id title
metafields(first:20){nodes{namespace key value}}
variants(first:10){nodes{title sku metafields(first:10){nodes{namespace key value}}}}}}}`,{c:cursor});
const d=j.data; all.push(...d.products.nodes); cursor=d.products.pageInfo.hasNextPage?d.products.pageInfo.endCursor:null;
}while(cursor);
let prodMin5=0,prodMinOther=0,perYard5=0,perYardOther=0,wall10=0,wallOther=0,sample1=0;
for(const p of all){
const pm=p.metafields.nodes.find(m=>m.namespace==='global'&&m.key==='v_prods_quantity_order_min');
if(pm&&pm.value==='5')prodMin5++; else prodMinOther++;
for(const v of p.variants.nodes){
const vm=v.metafields.nodes.find(m=>m.key==='v_prod_quantity_order_min');
if(/^Sold Per Yard/.test(v.title)){ if(vm&&vm.value==='5')perYard5++; else perYardOther++; }
if(/Wallcovering/.test(v.title)){ if(vm&&vm.value==='10')wall10++; else wallOther++; }
if(v.title==='Sample'){ if(vm&&vm.value==='1')sample1++; }
}
}
console.log('TOTAL active:',all.length);
console.log('product-level min=5:',prodMin5,'| NOT 5:',prodMinOther);
console.log('per-yard variant min=5:',perYard5,'| NOT 5:',perYardOther);
console.log('Wallcovering variant min=10 (should be untouched):',wall10,'| other:',wallOther);
console.log('Sample variant min=1 (untouched):',sample1);
const salt=all.find(p=>/salt/i.test(p.title));
const spm=salt.metafields.nodes.find(m=>m.key==='v_prods_quantity_order_min');
const sv=salt.variants.nodes.find(v=>/Per Yard \(5/.test(v.title));
const svm=sv.metafields.nodes.find(m=>m.key==='v_prod_quantity_order_min');
const swall=salt.variants.nodes.find(v=>/Wallcovering/.test(v.title));
const swm=swall.metafields.nodes.find(m=>m.key==='v_prod_quantity_order_min');
console.log('\nSALT: product-min='+spm.value+' | per-yard variant-min='+svm.value+' | wallcovering variant-min='+swm.value);