← 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
M package-lock.jsonM package.jsonM public/index.htmlM server.js
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 →