← back to Interiordesignershowroom
Add Herman Miller + Steelcase brand ingest for testing
61d7a3c695f331e62cb8a20982dd3f59323097f4 · 2026-08-01 21:04:31 -0700 · Steve Abrams
Files touched
A scripts/ingest-brands.js
Diff
commit 61d7a3c695f331e62cb8a20982dd3f59323097f4
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sat Aug 1 21:04:31 2026 -0700
Add Herman Miller + Steelcase brand ingest for testing
---
scripts/ingest-brands.js | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/scripts/ingest-brands.js b/scripts/ingest-brands.js
new file mode 100644
index 0000000..850c6c4
--- /dev/null
+++ b/scripts/ingest-brands.js
@@ -0,0 +1,39 @@
+// 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); });
← 27d7ce4 Room Builder v4 layout: hamburger-collapsible products panel
·
back to Interiordesignershowroom
·
auto-save: 2026-08-01T21:09:29 (7 files) — lib/scene.js pack 3448c99 →