[object Object]

← back to Carmelwallpapers

make server.js self-contained — gate _shared/admin-catalog behind MICROSITE_ADMIN_ENABLED env flag (kamatera deploy unblock)

5e16aae0c80bc457a70b6676cec803b6acc3307f · 2026-05-21 20:06:11 -0700 · Steve Abrams

Files touched

Diff

commit 5e16aae0c80bc457a70b6676cec803b6acc3307f
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu May 21 20:06:11 2026 -0700

    make server.js self-contained — gate _shared/admin-catalog behind MICROSITE_ADMIN_ENABLED env flag (kamatera deploy unblock)
---
 server.js | 41 ++++++++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 15 deletions(-)

diff --git a/server.js b/server.js
index ba629d4..c6892cd 100644
--- a/server.js
+++ b/server.js
@@ -1,4 +1,5 @@
 'use strict';
+try { require('dotenv').config({ path: require('path').join(__dirname, '.env') }); } catch (e) {}
 const express = require('express');
 const fs = require('fs');
 const path = require('path');
@@ -7,7 +8,15 @@ const PORT = process.env.PORT || 9832;
 const DATA_PATH = path.join(__dirname, 'data', 'products.json');
 
 // ── Shared catalog: products live in dw_unified.microsite_products ───────────
-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(`[carmelwallpapers] admin-catalog unavailable (${e.message}) — falling back to static JSON`); }
+}
 const siteCfg = JSON.parse(fs.readFileSync(path.join(__dirname, 'site.config.json'), 'utf8'));
 const SITE_SLUG  = siteCfg.slug || path.basename(__dirname);
 const SITE_RAILS = Array.isArray(siteCfg.rails) ? siteCfg.rails : [];
@@ -135,23 +144,25 @@ function loadFromJson() {
   applyProducts(Array.isArray(raw) ? raw : []);
 }
 
-// PG-first load: read the curated catalog from dw_unified.microsite_products.
-// On any PG failure, fall back to the static data/products.json snapshot.
+// PG-first load when ADMIN_ENABLED, else static-JSON only.
 async function loadData() {
-  try {
-    const rows = await catalog.getProducts(SITE_SLUG);
-    applyProducts(rows);
-    console.log(`Loaded ${PRODUCTS.length} products from dw_unified (dropped ${DROPPED} junk)`);
-  } catch (e) {
-    console.error(`PG catalog load failed (${e.message}) — falling back to data/products.json`);
+  if (catalog) {
     try {
-      loadFromJson();
-      console.log(`Loaded ${PRODUCTS.length} products from JSON fallback (dropped ${DROPPED} junk)`);
-    } catch (e2) {
-      console.error('Failed to load products.json:', e2.message);
-      PRODUCTS = [];
+      const rows = await catalog.getProducts(SITE_SLUG);
+      applyProducts(rows);
+      console.log(`Loaded ${PRODUCTS.length} products from dw_unified (dropped ${DROPPED} junk)`);
+      return;
+    } catch (e) {
+      console.error(`PG catalog load failed (${e.message}) — falling back to data/products.json`);
     }
   }
+  try {
+    loadFromJson();
+    console.log(`Loaded ${PRODUCTS.length} products from data/products.json (static mode, dropped ${DROPPED} junk)`);
+  } catch (e2) {
+    console.error('Failed to load products.json:', e2.message);
+    PRODUCTS = [];
+  }
 }
 
 const app = express();
@@ -687,7 +698,7 @@ ${THEME_TOGGLE_SCRIPT}
 });
 
 // ── Admin catalog CRUD — /admin/catalog (basic-auth) + /api/admin/* REST ─────
-catalog.mount(app, { siteSlug: SITE_SLUG, rails: SITE_RAILS });
+if (catalog) catalog.mount(app, { siteSlug: SITE_SLUG, rails: SITE_RAILS });
 
 // ── Startup: load catalog from PG, then listen ───────────────────────────────
 (async () => {

← 88aa54b add ns-contact modal (CSS + HTML + JS) — info@carmelwallpape  ·  back to Carmelwallpapers  ·  retag aesthetic from PG: 833 rows updated c78d2c2 →