118 lines
4.5 KiB
TypeScript
118 lines
4.5 KiB
TypeScript
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}`);
|
|
});
|