Christian Mueller 9e96ecc231 feat(app): wire up Express app factory and production entry point (Task 13)
Initializes DB, creates default admin user, connects brokers/PG sources,
starts query timers, and serves frontend/dist as SPA.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 12:56:43 +02:00

46 lines
1.6 KiB
TypeScript

import express from 'express';
import cors from 'cors';
import path from 'path';
import authRouter from './routes/auth';
import displayApiRouter from './routes/display-api';
import mqttBrokersRouter from './routes/mqtt-brokers';
import mqttTopicsRouter from './routes/mqtt-topics';
import pgSourcesRouter from './routes/pg-sources';
import datapointsRouter from './routes/datapoints';
import displaysRouter from './routes/displays';
import layoutsRouter from './routes/layouts';
import { authMiddleware } from './middleware/auth';
export function createApp(): express.Application {
const app = express();
app.use(cors());
app.use(express.json());
// Health check
app.get('/health', (_req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
// Public routes
app.use('/api/auth', authRouter);
app.use('/api/display', displayApiRouter);
// Protected management routes
app.use('/api/mqtt/brokers/:brokerId/topics', authMiddleware, mqttTopicsRouter);
app.use('/api/mqtt/brokers', authMiddleware, mqttBrokersRouter);
app.use('/api/pg/sources', authMiddleware, pgSourcesRouter);
app.use('/api/datapoints', authMiddleware, datapointsRouter);
app.use('/api/displays', authMiddleware, displaysRouter);
app.use('/api/layouts', authMiddleware, layoutsRouter);
// Serve frontend/dist as static files with SPA fallback
const frontendDist = path.join(__dirname, '..', '..', '..', 'frontend', 'dist');
app.use(express.static(frontendDist));
app.get('*', (_req, res) => {
res.sendFile(path.join(frontendDist, 'index.html'));
});
return app;
}