[object Object]

← back to Rentv Licensed Targets

chore: lint (URL/path guards, pg error handler, drop pw from log), refactor (const, pager bounds), v0.1.1 (session close)

283e56195394ae866f8a4d1d061486d0c5a3ef6f · 2026-08-10 21:16:25 -0700 · steve

Files touched

Diff

commit 283e56195394ae866f8a4d1d061486d0c5a3ef6f
Author: steve <steve@designerwallcoverings.com>
Date:   Mon Aug 10 21:16:25 2026 -0700

    chore: lint (URL/path guards, pg error handler, drop pw from log), refactor (const, pager bounds), v0.1.1 (session close)
---
 package-lock.json | 4 ++--
 package.json      | 2 +-
 public/index.html | 2 +-
 server.js         | 8 +++++---
 4 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 72ac59c..6e57845 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "rentv-licensed-targets-viewer",
-  "version": "0.1.0",
+  "version": "0.1.1",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "rentv-licensed-targets-viewer",
-      "version": "0.1.0",
+      "version": "0.1.1",
       "dependencies": {
         "pg": "^8.23.0"
       }
diff --git a/package.json b/package.json
index a1f6f63..bdacd38 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "rentv-licensed-targets-viewer",
-  "version": "0.1.0",
+  "version": "0.1.1",
   "private": true,
   "description": "Searchable/sortable web viewer over the 102k rentv_licensed_targets (RENTV commercial advertiser prospects)",
   "main": "server.js",
diff --git a/public/index.html b/public/index.html
index 90a2136..376ba34 100644
--- a/public/index.html
+++ b/public/index.html
@@ -182,7 +182,7 @@ async function boot(){
   let t; $('q').oninput = ()=>{ clearTimeout(t); t=setTimeout(()=>{ state.q=$('q').value.trim(); state.page=1; save(); load(); },250); };
   $('density').oninput = ()=>{ state.density=+$('density').value; save(); applyDensity(); };
   $('prev').onclick = ()=>{ if(state.page>1){state.page--;save();load();} };
-  $('next').onclick = ()=>{ state.page++;save();load(); };
+  $('next').onclick = ()=>{ const pages=Math.max(1,Math.ceil(+$('pages').textContent||1)); if(state.page<pages){state.page++;save();load();} };
   load();
 }
 boot();
diff --git a/server.js b/server.js
index cb5d3ce..a88cc7d 100644
--- a/server.js
+++ b/server.js
@@ -25,6 +25,8 @@ const pool = new Pool({
   database: process.env.PGDATABASE || 'realestate',
   max: 6,
 });
+// pg emits 'error' on idle-client failure; without a listener Node crashes the process.
+pool.on('error', (err) => console.error('pg pool error', err));
 const TABLE = 'rentv_licensed_targets';
 
 // Columns the client is allowed to sort by (whitelist → no injection surface).
@@ -74,8 +76,8 @@ async function apiTargets(qs) {
   if (!SORTABLE.has(sort)) sort = 'entity_name';
   const dir = (qs.get('dir') || 'asc').toLowerCase() === 'desc' ? 'DESC' : 'ASC';
 
-  let limit = Math.min(Math.max(parseInt(qs.get('limit'), 10) || 50, 1), 200);
-  let page = Math.max(parseInt(qs.get('page'), 10) || 1, 1);
+  const limit = Math.min(Math.max(parseInt(qs.get('limit'), 10) || 50, 1), 200);
+  const page = Math.max(parseInt(qs.get('page'), 10) || 1, 1);
   const offset = (page - 1) * limit;
 
   const countSql = `SELECT count(*)::bigint AS n FROM ${TABLE} ${where}`;
@@ -138,5 +140,5 @@ const server = http.createServer(async (req, res) => {
 
 server.listen(PORT, HOST, () => {
   const p = server.address().port;
-  console.log(`rentv-licensed-targets viewer live: http://${HOST}:${p}  (login ${USER} / ${PASS})`);
+  console.log(`rentv-licensed-targets viewer live: http://${HOST}:${p}  (login ${USER})`);
 });

← a92114a Add searchable/sortable web viewer over 102k rentv_licensed_  ·  back to Rentv Licensed Targets  ·  creds-safe fetch guard: resolve relative fetch vs credential b1e9972 →