Files
Infraviewer/server.js

122 lines
3.4 KiB
JavaScript

require('dotenv').config();
const express = require('express');
const cors = require('cors');
const path = require('path');
const { getConnection, closeConnection } = require('./config/database');
const searchRoutes = require('./routes/search');
const app = express();
// Standardmäßig läuft der Entwicklungsserver lokal auf 3002.
// Im Docker-Container wird der Port über die Umgebungsvariable PORT (z.B. 3001) gesetzt.
const PORT = process.env.PORT || 3001;
// Middleware
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Static files
app.use(express.static(path.join(__dirname, 'public')));
// API Routes
app.use('/api/search', searchRoutes);
// Direkte URL-Aufrufe auf die UI umleiten und Suchbegriff vorbelegen:
// - /search=meinbegriff -> /?q=meinbegriff
// - /search?q=meinbegriff oder /search?search=meinbegriff -> /?q=meinbegriff
app.get('/search=:searchTerm', (req, res) => {
const searchTerm = (req.params.searchTerm || '').trim();
const statusFilter = (req.query.status || '').trim();
if (!searchTerm) {
return res.redirect('/');
}
const redirectUrl = new URL(`http://localhost:${PORT}/`);
redirectUrl.searchParams.set('q', searchTerm);
if (statusFilter) {
redirectUrl.searchParams.set('status', statusFilter);
}
return res.redirect(`${redirectUrl.pathname}${redirectUrl.search}`);
});
app.get('/search', (req, res) => {
const searchTerm = (req.query.search || req.query.q || '').trim();
const statusFilter = (req.query.status || '').trim();
if (!searchTerm) {
return res.redirect('/');
}
const redirectUrl = new URL(`http://localhost:${PORT}/`);
redirectUrl.searchParams.set('q', searchTerm);
if (statusFilter) {
redirectUrl.searchParams.set('status', statusFilter);
}
return res.redirect(`${redirectUrl.pathname}${redirectUrl.search}`);
});
// Health check endpoint
app.get('/api/health', async (req, res) => {
try {
await getConnection();
res.json({
status: 'ok',
message: 'Server und Datenbankverbindung funktionieren',
timestamp: new Date().toISOString()
});
} catch (error) {
res.status(500).json({
status: 'error',
message: 'Datenbankverbindung fehlgeschlagen',
error: error.message
});
}
});
// Root route
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'index.html'));
});
// Error handling middleware
app.use((err, req, res, next) => {
console.error('Server Error:', err);
res.status(500).json({
success: false,
error: 'Interner Serverfehler',
message: err.message
});
});
// Graceful shutdown
process.on('SIGINT', async () => {
console.log('\nServer wird heruntergefahren...');
await closeConnection();
process.exit(0);
});
process.on('SIGTERM', async () => {
console.log('\nServer wird heruntergefahren...');
await closeConnection();
process.exit(0);
});
// Start server
app.listen(PORT, async () => {
console.log(`\n===========================================`);
console.log(`🚀 Server läuft auf http://localhost:${PORT}`);
console.log(`===========================================\n`);
try {
await getConnection();
console.log('✅ Datenbankverbindung erfolgreich hergestellt\n');
} catch (error) {
console.error('❌ Datenbankverbindung fehlgeschlagen:', error.message);
console.error(' Bitte überprüfen Sie Ihre .env Konfiguration\n');
}
});