← back to Dw Yolo Loop

scripts/kravet-disco-algolia-verify.js

41 lines

const https=require('https'); const fs=require('fs');
const APP='M9TBUM1WAE', IDX='kravet_production_kravet_us_products', KEY=process.env.AKEY;
const cand=JSON.parse(fs.readFileSync('/tmp/disco_real.json','utf8'));
const sleep=ms=>new Promise(r=>setTimeout(r,ms));
function query(q){return new Promise(res=>{const body=JSON.stringify({query:q,restrictSearchableAttributes:['sku'],hitsPerPage:200,attributesToRetrieve:['sku']});
  const req=https.request(`https://${APP}-dsn.algolia.net/1/indexes/${IDX}/query`,{method:'POST',headers:{'X-Algolia-Application-Id':APP,'X-Algolia-API-Key':KEY,'Content-Type':'application/json'}},r=>{let b='';r.on('data',d=>b+=d);r.on('end',()=>{try{res(JSON.parse(b))}catch(e){res({hits:[],_err:1})}})});req.on('error',()=>res({hits:[],_err:1}));req.setTimeout(20000,()=>{req.destroy();res({hits:[],_err:1})});req.write(body);req.end();});}
(async()=>{
  const patCache={}; const active=[],discoColor=[],discoPattern=[],amw=[],err=[];
  let i=0;
  for(const [vendor,sku,gid] of cand){
    i++;
    const pat=sku.split('.')[0];
    if(/^AMW|^AM1/i.test(pat)){ amw.push([vendor,sku,gid]); continue; }
    if(!(pat in patCache)){
      const r=await query(pat);
      if(r._err){ err.push([vendor,sku]); continue; }
      patCache[pat]=new Set((r.hits||[]).map(h=>(h.sku||'').toUpperCase()).filter(s=>s.startsWith(pat.toUpperCase())));
      await sleep(120);
    }
    const set=patCache[pat];
    if(set.has(sku.toUpperCase())) active.push([vendor,sku,gid]);
    else if(set.size>0) discoColor.push([vendor,sku,gid]);   // pattern alive, this colorway gone
    else discoPattern.push([vendor,sku,gid]);                 // whole pattern gone (line IS indexed)
    if(i%50===0)console.log(`  …${i}/${cand.length} active:${active.length} discoColor:${discoColor.length} discoPat:${discoPattern.length} amw:${amw.length}`);
  }
  const disco=[...discoColor,...discoPattern];
  fs.writeFileSync('/tmp/disco_algolia_confirmed.csv','vendor,mfr_sku,product_gid,reason\n'+
    discoColor.map(d=>d.concat('colorway-discontinued').join(',')).join('\n')+'\n'+
    discoPattern.map(d=>d.concat('pattern-discontinued').join(',')).join('\n'));
  console.log('\n=== RIGOROUS DISCO (Kravet Algolia index, exact-sku) ===');
  console.log('checked:',cand.length);
  console.log('ACTIVE (exact sku in index):',active.length);
  console.log('DISCO — colorway gone (pattern still active):',discoColor.length);
  console.log('DISCO — whole pattern gone (line indexed):',discoPattern.length);
  console.log('AMW/Andrew Martin (EXCLUDED — not in this index):',amw.length);
  console.log('errors:',err.length);
  const byv={}; disco.forEach(d=>byv[d[0]]=(byv[d[0]]||0)+1);
  console.log('confirmed-disco by vendor:',JSON.stringify(byv));
  console.log('sample disco:',disco.slice(0,6).map(d=>d[1]).join(', '));
})();