← back to Designersalesreps

server.js

46 lines

'use strict';
const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();
const PORT = process.env.PORT || 9905;
const DOMAIN = 'designersalesreps.com';

app.use(express.json());

// 404-guard: never serve .bak / .pre-* snapshot files from static root.
app.use((req, res, next) => {
  if (/\.(bak|pre-)/i.test(req.path)) return res.status(404).end();
  next();
});

app.use(express.static(path.join(__dirname, 'public')));

const reps = JSON.parse(fs.readFileSync(path.join(__dirname, 'data/reps.json'), 'utf8'));

app.get('/api/search', (req, res) => {
  const { q = '', territory = '', vertical = '', sort = 'name' } = req.query;
  let results = reps.filter(r => {
    const qLow = q.toLowerCase();
    const matchQ = !q || r.name.toLowerCase().includes(qLow) || r.agency.toLowerCase().includes(qLow) || r.lines.some(l => l.toLowerCase().includes(qLow)) || r.city.toLowerCase().includes(qLow);
    const matchT = !territory || r.territories.includes(territory);
    const matchV = !vertical || r.vertical.includes(vertical);
    return matchQ && matchT && matchV;
  });
  if (sort === 'agency') results.sort((a, b) => a.agency.localeCompare(b.agency));
  else if (sort === 'city') results.sort((a, b) => a.city.localeCompare(b.city));
  else if (sort === 'territory') results.sort((a, b) => a.territories[0].localeCompare(b.territories[0]));
  else results.sort((a, b) => a.name.localeCompare(b.name));
  res.json({ total: results.length, results });
});

app.post('/api/claim', (req, res) => {
  const entry = { ...req.body, ts: new Date().toISOString(), domain: DOMAIN };
  fs.appendFileSync(path.join(__dirname, 'claims.jsonl'), JSON.stringify(entry) + '\n');
  res.json({ ok: true });
});

app.get('/health', (req, res) => res.json({ ok: true, domain: DOMAIN }));

app.listen(PORT, '127.0.0.1', () => console.log(`${DOMAIN} listening on ${PORT}`));