6989a98d75
- Arkitektur: docs/auth/passwordless-architecture.md - Backend: iom/quixzoom-auth-service/ (FastAPI + Redis) - Webb: quixzoom-market-pages/se/login/ (QR-kod + polling) - App: iom/quixzoom-app/src/features/auth/ (push + deep links) Flöde: QR-kod → app-godkännande → webb-inloggad
77 lines
2.0 KiB
JavaScript
77 lines
2.0 KiB
JavaScript
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;
|