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;