const express = require('express'); const helmet = require('helmet'); const cors = require('cors'); const morgan = require('morgan'); const path = require('path'); require('dotenv').config(); const orderRoutes = require('./routes/orders'); const reportRoutes = require('./routes/reports'); const adminRoutes = require('./routes/admin'); const logger = require('./utils/logger'); const app = express(); // Middleware app.use(helmet({ contentSecurityPolicy: { directives: { defaultSrc: ["'self'"], styleSrc: ["'self'", "'unsafe-inline'", "https://cdn.jsdelivr.net"], scriptSrc: ["'self'", "https://cdn.jsdelivr.net"], imgSrc: ["'self'", "data:", "https:"], }, }, })); app.use(cors()); app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } })); app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true })); // Static files app.use(express.static(path.join(__dirname, 'public'))); // API Routes app.use('/api/orders', orderRoutes); app.use('/api/reports', reportRoutes); app.use('/api/admin', adminRoutes); // Health check app.get('/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString() }); }); // Serve frontend app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'public', 'index.html')); }); app.get('/admin', (req, res) => { res.sendFile(path.join(__dirname, 'public', 'admin.html')); }); app.get('/status', (req, res) => { res.sendFile(path.join(__dirname, 'public', 'status.html')); }); app.get('/report-view', (req, res) => { res.sendFile(path.join(__dirname, 'public', 'report-view.html')); }); // Error handling app.use((err, req, res, next) => { logger.error('Unhandled error:', err); res.status(500).json({ error: 'Ett oväntat fel inträffade', message: process.env.NODE_ENV === 'development' ? err.message : undefined }); }); // 404 app.use((req, res) => { res.status(404).json({ error: 'Sidan hittades inte' }); }); module.exports = app;