51 lines
1.5 KiB
JavaScript
51 lines
1.5 KiB
JavaScript
import express from 'express'
|
|
import cors from 'cors'
|
|
import helmet from 'helmet'
|
|
import { dirname } from 'path'
|
|
import { fileURLToPath } from 'url'
|
|
import contactRouter from './routes/contact.js'
|
|
import talkRequestRouter from './routes/talk-request.js'
|
|
import newsletterRouter from './routes/newsletter.js'
|
|
import resourceDownloadRouter from './routes/resource-download.js'
|
|
import speakerCvRouter from './routes/speaker-cv.js'
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
const PORT = process.env.PORT || 3003
|
|
|
|
const app = express()
|
|
|
|
// Behind Caddy reverse proxy — trust the first proxy hop so rate limiting
|
|
// and IP logging use the real client IP.
|
|
app.set('trust proxy', 1)
|
|
app.disable('x-powered-by')
|
|
|
|
app.use(helmet())
|
|
app.use(cors({
|
|
origin: process.env.NODE_ENV === 'production'
|
|
? 'https://andreknie.de'
|
|
: 'http://localhost:5173',
|
|
credentials: true,
|
|
}))
|
|
app.use(express.json({ limit: '10kb' }))
|
|
|
|
// Routes
|
|
app.get('/api/health', (_req, res) => {
|
|
res.json({ status: 'ok', time: new Date().toISOString() })
|
|
})
|
|
|
|
app.use('/api/contact', contactRouter)
|
|
app.use('/api/talk-request', talkRequestRouter)
|
|
app.use('/api/newsletter', newsletterRouter)
|
|
app.use('/api/resource-download', resourceDownloadRouter)
|
|
app.use('/api/speaker-cv', speakerCvRouter)
|
|
|
|
// Error handler
|
|
app.use((err, _req, res, _next) => {
|
|
console.error('[Server Error]', err.message)
|
|
res.status(500).json({ error: 'Interner Serverfehler.' })
|
|
})
|
|
|
|
app.listen(PORT, () => {
|
|
console.log(`[andreknie.de Backend] Running on port ${PORT}`)
|
|
})
|