← back to Naturaltextilewallpaper
make server.js self-contained — gate _shared/admin-catalog behind MICROSITE_ADMIN_ENABLED env flag (kamatera deploy unblock)
151be0377ecb419a65c40f3707a50899973b0f9a · 2026-05-19 23:55:11 -0700 · Steve Abrams
Files touched
Diff
commit 151be0377ecb419a65c40f3707a50899973b0f9a
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Tue May 19 23:55:11 2026 -0700
make server.js self-contained — gate _shared/admin-catalog behind MICROSITE_ADMIN_ENABLED env flag (kamatera deploy unblock)
---
server.js | 34 ++++++++++++++++++++++++----------
1 file changed, 24 insertions(+), 10 deletions(-)
diff --git a/server.js b/server.js
index 720b99f..f7a2f03 100644
--- a/server.js
+++ b/server.js
@@ -10,7 +10,15 @@ const express = require('express');
const helmet = require('helmet');
const path = require('path');
const fs = require('fs');
-const catalog = require('../_shared/admin-catalog');
+// Admin catalog (PG-backed) is opt-in via MICROSITE_ADMIN_ENABLED=true. Prod
+// stays static-only (data/products.json) so Kamatera doesn't need `pg` or the
+// _shared/ tree. Dev (Mac2) flips the flag on to use dw_unified + /admin/catalog.
+const ADMIN_ENABLED = process.env.MICROSITE_ADMIN_ENABLED === 'true';
+let catalog = null;
+if (ADMIN_ENABLED) {
+ try { catalog = require('../_shared/admin-catalog'); }
+ catch (e) { console.error(`[NTW] admin-catalog unavailable (${e.message}) — falling back to static JSON`); }
+}
const PORT = process.env.PORT || 9835;
const DW = 'https://designerwallcoverings.com';
@@ -716,20 +724,26 @@ function escHtml(s) {
}
// --- Admin catalog CRUD — /admin/catalog (basic-auth) + /api/admin/* -----
-catalog.mount(app, { siteSlug: SITE_SLUG, rails: SITE_RAILS });
+if (catalog) catalog.mount(app, { siteSlug: SITE_SLUG, rails: SITE_RAILS });
-// --- Async startup: load catalog from dw_unified, then listen -----------
+// --- Async startup: load catalog. When admin is enabled, prefer dw_unified; else static JSON.
(async () => {
- try {
- const rows = await catalog.getProducts(SITE_SLUG);
- PRODUCTS = rows.map(normalizeProduct).filter(p => !isJunk(p));
- console.log(`[NTW] Loaded ${rows.length} from dw_unified → kept ${PRODUCTS.length} after junk filter`);
- } catch (e) {
- console.error(`[NTW] PG catalog load failed (${e.message}) — falling back to data/products.json`);
+ let loaded = false;
+ if (catalog) {
+ try {
+ const rows = await catalog.getProducts(SITE_SLUG);
+ PRODUCTS = rows.map(normalizeProduct).filter(p => !isJunk(p));
+ console.log(`[NTW] Loaded ${rows.length} from dw_unified → kept ${PRODUCTS.length} after junk filter`);
+ loaded = true;
+ } catch (e) {
+ console.error(`[NTW] PG catalog load failed (${e.message}) — falling back to data/products.json`);
+ }
+ }
+ if (!loaded) {
try {
const raw = JSON.parse(fs.readFileSync(path.join(__dirname, 'data', 'products.json'), 'utf8'));
PRODUCTS = (Array.isArray(raw) ? raw : []).map(normalizeProduct).filter(p => !isJunk(p));
- console.log(`[NTW] Fallback: loaded ${PRODUCTS.length} from data/products.json`);
+ console.log(`[NTW] Loaded ${PRODUCTS.length} from data/products.json (static mode)`);
} catch (_) { PRODUCTS = []; }
}
app.listen(PORT, () => console.log(`[NTW] Running on port ${PORT} — ${PRODUCTS.length} products`));
← b4fde9f add ns-contact modal (CSS + HTML + JS) — info@naturaltextile
·
back to Naturaltextilewallpaper
·
retag aesthetic from PG: 4166 rows updated d2fa5f3 →