67 lines
1.6 KiB
TypeScript
67 lines
1.6 KiB
TypeScript
import express from 'express';
|
|
import cors from 'cors';
|
|
import scrapeRoutes from './routes/scrape';
|
|
import filtersRoutes from './routes/filters';
|
|
import exportsRoutes from './routes/exports';
|
|
import { getDb, closeDb } from './db/schema';
|
|
|
|
const PORT = parseInt(process.env.PORT || '3847');
|
|
const API_KEY = process.env.REONOMY_API_KEY || 'reonomy-dev-key';
|
|
|
|
const app = express();
|
|
|
|
// Middleware
|
|
app.use(cors());
|
|
app.use(express.json());
|
|
|
|
// API Key auth middleware
|
|
app.use('/api', (req, res, next) => {
|
|
// Skip auth for health check
|
|
if (req.path === '/health') return next();
|
|
|
|
const key = req.headers['x-api-key'] as string;
|
|
if (!key || key !== API_KEY) {
|
|
return res.status(401).json({ error: 'Invalid or missing API key. Set X-API-Key header.' });
|
|
}
|
|
next();
|
|
});
|
|
|
|
// Routes
|
|
app.use('/api/scrape', scrapeRoutes);
|
|
app.use('/api/filters', filtersRoutes);
|
|
app.use('/api/exports', exportsRoutes);
|
|
|
|
// Health check (no auth)
|
|
app.get('/api/health', (_req, res) => {
|
|
res.json({
|
|
status: 'ok',
|
|
service: 'reonomy-api',
|
|
version: '1.0.0',
|
|
timestamp: new Date().toISOString(),
|
|
});
|
|
});
|
|
|
|
// Initialize DB on startup
|
|
getDb();
|
|
|
|
// Start server
|
|
app.listen(PORT, () => {
|
|
console.log(`🏢 Reonomy API Server running on http://localhost:${PORT}`);
|
|
console.log(` Health: http://localhost:${PORT}/api/health`);
|
|
console.log(` API Key: ${API_KEY.substring(0, 8)}...`);
|
|
});
|
|
|
|
// Graceful shutdown
|
|
process.on('SIGINT', () => {
|
|
console.log('\nShutting down...');
|
|
closeDb();
|
|
process.exit(0);
|
|
});
|
|
|
|
process.on('SIGTERM', () => {
|
|
closeDb();
|
|
process.exit(0);
|
|
});
|
|
|
|
export default app;
|