import express from 'express'; import cors from 'cors'; import path from 'path'; import dotenv from 'dotenv'; import authRoutes from './routes/auth.routes.js'; import customerRoutes from './routes/customer.routes.js'; import addressRoutes from './routes/address.routes.js'; import bankcardRoutes from './routes/bankcard.routes.js'; import documentRoutes from './routes/document.routes.js'; import meterRoutes from './routes/meter.routes.js'; import stressfreiEmailRoutes from './routes/stressfreiEmail.routes.js'; import contractRoutes from './routes/contract.routes.js'; import platformRoutes from './routes/platform.routes.js'; import cancellationPeriodRoutes from './routes/cancellation-period.routes.js'; import contractDurationRoutes from './routes/contract-duration.routes.js'; import providerRoutes from './routes/provider.routes.js'; import tariffRoutes from './routes/tariff.routes.js'; import userRoutes from './routes/user.routes.js'; import uploadRoutes from './routes/upload.routes.js'; import developerRoutes from './routes/developer.routes.js'; import contractCategoryRoutes from './routes/contractCategory.routes.js'; import contractTaskRoutes from './routes/contractTask.routes.js'; import appSettingRoutes from './routes/appSetting.routes.js'; import emailProviderRoutes from './routes/emailProvider.routes.js'; import cachedEmailRoutes from './routes/cachedEmail.routes.js'; import invoiceRoutes from './routes/invoice.routes.js'; import contractHistoryRoutes from './routes/contractHistory.routes.js'; import auditLogRoutes from './routes/auditLog.routes.js'; import gdprRoutes from './routes/gdpr.routes.js'; import consentPublicRoutes from './routes/consent-public.routes.js'; import emailLogRoutes from './routes/emailLog.routes.js'; import pdfTemplateRoutes from './routes/pdfTemplate.routes.js'; import birthdayRoutes from './routes/birthday.routes.js'; import { auditContextMiddleware } from './middleware/auditContext.js'; import { auditMiddleware } from './middleware/audit.js'; dotenv.config(); const app = express(); const PORT = process.env.PORT || 3001; // Middleware app.use(cors()); app.use(express.json()); // Audit-Logging Middleware (DSGVO-konform) app.use(auditContextMiddleware); app.use(auditMiddleware); // Statische Dateien für Uploads app.use('/api/uploads', express.static(path.join(process.cwd(), 'uploads'))); // Öffentliche Routes (OHNE Authentifizierung) app.use('/api/public/consent', consentPublicRoutes); // Routes app.use('/api/auth', authRoutes); app.use('/api/customers', customerRoutes); app.use('/api/addresses', addressRoutes); app.use('/api/bank-cards', bankcardRoutes); app.use('/api/documents', documentRoutes); app.use('/api/meters', meterRoutes); app.use('/api/stressfrei-emails', stressfreiEmailRoutes); app.use('/api/contracts', contractRoutes); app.use('/api/platforms', platformRoutes); app.use('/api/cancellation-periods', cancellationPeriodRoutes); app.use('/api/contract-durations', contractDurationRoutes); app.use('/api/providers', providerRoutes); app.use('/api/tariffs', tariffRoutes); app.use('/api/users', userRoutes); app.use('/api/upload', uploadRoutes); app.use('/api/developer', developerRoutes); app.use('/api/contract-categories', contractCategoryRoutes); app.use('/api', contractTaskRoutes); app.use('/api/settings', appSettingRoutes); app.use('/api/email-providers', emailProviderRoutes); app.use('/api', cachedEmailRoutes); app.use('/api/energy-details', invoiceRoutes); app.use('/api', contractHistoryRoutes); app.use('/api/audit-logs', auditLogRoutes); app.use('/api/gdpr', gdprRoutes); app.use('/api/email-logs', emailLogRoutes); app.use('/api/pdf-templates', pdfTemplateRoutes); app.use('/api/birthdays', birthdayRoutes); // Health check app.get('/api/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString() }); }); // Production: Serve frontend static files if (process.env.NODE_ENV === 'production') { const publicPath = path.join(process.cwd(), 'public'); // Serve static files app.use(express.static(publicPath)); // SPA fallback: serve index.html for all non-API routes app.get('*', (req, res, next) => { // Skip API routes if (req.path.startsWith('/api')) { return next(); } res.sendFile(path.join(publicPath, 'index.html')); }); } // Error handling app.use((err: Error, req: express.Request, res: express.Response, next: express.NextFunction) => { console.error(err.stack); res.status(500).json({ success: false, error: 'Interner Serverfehler' }); }); app.listen(PORT, () => { console.log(`Server läuft auf Port ${PORT}`); });