← back to Interiordesignershowroom

scripts/ingest-brands.js

40 lines

// Targeted ingest of specific premium brands (Herman Miller, Steelcase) for testing.
// Usage: node scripts/ingest-brands.js
try { require('dotenv').config(); } catch (_) {}
const db = require('../lib/db');
const cj = require('../lib/adapters/cj');
const { normalizeProduct, UPSERT_SQL, upsertParams } = require('../lib/normalize');
const sleep = ms => new Promise(r => setTimeout(r, ms));

const KW = [
  'steelcase office chair', 'steelcase leap', 'steelcase gesture', 'steelcase think', 'steelcase desk', 'steelcase bookcase',
  'herman miller aeron', 'herman miller embody', 'herman miller sayl', 'herman miller cosm', 'herman miller desk',
  'herman miller eames lounge', 'herman miller nelson', 'herman miller mirra',
];
const MATCH = /steelcase|herman miller/;

async function main() {
  if (!cj.enabled(process.env)) { console.error('CJ not configured'); process.exit(1); }
  let ok = 0; const seen = new Set();
  for (const k of KW) {
    let raws = [];
    try { raws = await cj.fetch(process.env, { limit: 60, keywords: k }); } catch (_) { continue; }
    for (const raw of raws) {
      const hay = `${raw.title || ''} ${raw.advertiser || ''} ${raw.brand || ''}`.toLowerCase();
      if (!MATCH.test(hay)) continue;
      if (!raw.image_url || seen.has(raw.external_id)) continue;
      seen.add(raw.external_id);
      const norm = normalizeProduct(raw, 'cj');
      if (!norm) continue;
      try { await db.query(UPSERT_SQL, upsertParams(norm)); ok++; } catch (_) {}
    }
    await sleep(350);
  }
  console.log(`Herman Miller + Steelcase items ingested: ${ok}`);
  const { rows } = await db.query(
    "SELECT advertiser, count(*) n FROM products WHERE title ILIKE '%steelcase%' OR title ILIKE '%herman miller%' OR advertiser ILIKE '%steelcase%' OR advertiser ILIKE '%herman miller%' GROUP BY advertiser ORDER BY n DESC");
  rows.forEach(r => console.log('  ' + r.advertiser + ': ' + r.n));
  await db.pool.end();
}
main().catch(e => { console.error('ERR', e.message); process.exit(1); });