File size: 3,777 Bytes
c33bf01
 
 
 
 
 
df20e95
 
 
c33bf01
 
 
 
 
 
 
 
 
 
e6ed651
 
 
 
 
 
 
 
 
a2c9e74
c33bf01
 
 
 
 
 
 
 
 
 
742fd5b
c33bf01
 
 
 
 
 
 
 
 
 
ff4d747
e32adcf
0f840a9
c33bf01
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
const express = require('express');
const cors    = require('cors');
const path    = require('path');

const app = express();

// Trust HuggingFace / reverse-proxy X-Forwarded-For headers (required for rate limiting)
app.set('trust proxy', 1);

// ── View engine ───────────────────────────────────────────────────────────────
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views', 'screens'));

// ── Static files ──────────────────────────────────────────────────────────────
app.use(express.static(path.join(__dirname, '..', 'public')));

// ── Middleware ────────────────────────────────────────────────────────────────
app.use(cors());

// Request logger β€” commented out to reduce noise; re-enable for debugging
// app.use((req, res, next) => {
//   const start = Date.now();
//   res.on('finish', () => {
//     const body = req.body && Object.keys(req.body).length ? ' body=' + JSON.stringify(req.body) : '';
//     console.log(`[http] ${req.method} ${req.originalUrl}${body} β†’ ${res.statusCode} (${Date.now() - start}ms)`);
//   });
//   next();
// });

// NOTE: /api/webhooks/snippe needs raw body β€” mount it BEFORE json middleware
app.use('/api/webhooks', require('./routes/webhooks.routes'));

// JSON body parser for everything else
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

// ── Routes ────────────────────────────────────────────────────────────────────

// Public captive portal
app.use('/portal', require('./routes/portalAssets.routes'));
app.use('/portal', require('./routes/portal.routes'));

// Tenant API
app.use('/api/auth',      require('./routes/auth.routes'));
app.use('/api/devices',   require('./routes/devices.routes'));
app.use('/api/plans',     require('./routes/plans.routes'));
app.use('/api/dashboard', require('./routes/dashboard.routes'));
app.use('/api/payouts',   require('./routes/payouts.routes'));
app.use('/api/sessions',  require('./routes/sessions.routes'));
app.use('/api/alerts',    require('./routes/alerts.routes'));
app.use('/api/manual-sales', require('./routes/manualSales.routes'));
app.use('/api/sales', require('./routes/sales.routes'));
app.use('/api/tokens', require('./routes/tokens.routes'));

// Admin API
app.use('/api/admin', require('./routes/admin.routes'));

// ── Health check ──────────────────────────────────────────────────────────────
app.get('/health', (req, res) => res.json({ status: 'ok', ts: new Date() }));

// ── 404 ───────────────────────────────────────────────────────────────────────
app.use((req, res) => res.status(404).json({ error: 'Not found' }));

// ── Error handler ─────────────────────────────────────────────────────────────
app.use((err, req, res, next) => {
  console.error('[Unhandled]', err.message);
  res.status(500).json({ error: 'Internal server error' });
});

module.exports = app;