[object Object]

← back to Wallco Ai

/api/rooms: for non-admin, dedup by room_type + drop rooms whose /designs/room PNG is missing — PDP gallery no longer shows black/orphan tiles (design 12 had 4 orphan living_room rows w/ no file)

df69588f21199a081c9e0c37b1781953631dad46 · 2026-05-29 23:15:57 -0700 · Steve Abrams

Files touched

Diff

commit df69588f21199a081c9e0c37b1781953631dad46
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Fri May 29 23:15:57 2026 -0700

    /api/rooms: for non-admin, dedup by room_type + drop rooms whose /designs/room PNG is missing — PDP gallery no longer shows black/orphan tiles (design 12 had 4 orphan living_room rows w/ no file)
---
 server.js | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/server.js b/server.js
index e77653a..17e4c92 100644
--- a/server.js
+++ b/server.js
@@ -19613,7 +19613,24 @@ app.get('/api/rooms', (req, res) => {
       FROM (SELECT id, design_id, room_type, angle, image_path, filename, file_size_bytes,
                    selected_for_marketing, removed_at, removed_reason, notes, created_at
               FROM wallco_rooms ${whereSQL}) t;`);
-    res.json({ ok: true, rooms: JSON.parse(raw || '[]'), admin: isRoomsAdmin(req) });
+    let rooms = JSON.parse(raw || '[]');
+    // Customer-facing cleanup (2026-05-29): wallco_rooms can hold orphan rows
+    // (a room_type whose rendered PNG no longer exists on disk) and duplicate
+    // rows per type. For non-admin viewers, dedup by room_type (newest wins —
+    // rows are ordered created_at DESC) and drop any room whose canonical
+    // /designs/room PNG is missing, so the PDP "Generated rooms" gallery never
+    // shows black/broken tiles. Admins still see every row (to manage them).
+    if (!isRoomsAdmin(req)) {
+      const _roomsDir = path.join(__dirname, 'data', 'rooms');
+      const _seen = new Set();
+      rooms = rooms.filter(r => {
+        if (_seen.has(r.room_type)) return false;
+        if (!fs.existsSync(path.join(_roomsDir, `design_${r.design_id}_${r.room_type}.png`))) return false;
+        _seen.add(r.room_type);
+        return true;
+      });
+    }
+    res.json({ ok: true, rooms, admin: isRoomsAdmin(req) });
   } catch (e) {
     res.status(500).json({ ok: false, error: e.message });
   }

← 25bdcd2 PDP gallery: drop inline onerror (broke inside server templa  ·  back to Wallco Ai  ·  docs: mac2-prod parity audit 2026-05-29 (5/5 files identical 70fedce →