import express from 'express' import path from 'node:path' import { fileURLToPath } from 'node:url' import { config, assertServerConfig, WOMS_DATABASE_ID } from './config.js' import { verifyDatabaseAccess } from './services/appwriteAdmin.js' import { sessionMiddleware } from './middleware/session.js' import authRoutes from './routes/auth.js' import projectsRoutes from './routes/projects.js' import featuresRoutes from './routes/features.js' import giteaWebhookRoutes from './routes/webhook/gitea.js' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const publicDir = path.join(__dirname, '..', 'public') assertServerConfig() const app = express() app.set('trust proxy', 1) app.use(sessionMiddleware()) app.use(express.json({ limit: '2mb' })) app.use('/api/auth', authRoutes) app.use('/api/projects', projectsRoutes) app.use('/api/features', featuresRoutes) app.use('/webhook', giteaWebhookRoutes) app.get('/api/health', async (_req, res) => { const dbAccess = await verifyDatabaseAccess() res.json({ ok: dbAccess.ok, service: 'webklar-kundenbereich', databaseId: WOMS_DATABASE_ID, endpoint: config.appwrite.endpoint, appwriteDbAccess: dbAccess, }) }) app.use(express.static(publicDir)) app.get('/dashboard.html', (req, res, next) => { const raw = req.signedCookies?.[config.cookieName] if (!raw) { return res.redirect('/login.html') } next() }) app.get('/', (_req, res) => { res.redirect('/login.html') }) app.use((err, _req, res, _next) => { console.error('[server] Unbehandelter Fehler:', err) if (!res.headersSent) { res.status(500).json({ error: err.message || 'Interner Serverfehler' }) } }) const server = app.listen(config.port, '0.0.0.0', () => { console.log(`Webklar Kundenbereich läuft auf Port ${config.port}`) verifyDatabaseAccess().then((result) => { if (result.ok) return console.error( '[startup] APPWRITE_API_KEY: Kein Lesezugriff auf woms-database. In Appwrite Console neuen API-Key mit Scopes databases.read + databases.write anlegen und in .env eintragen.' ) if (result.reason) console.error(`[startup] Appwrite: ${result.reason}`) }) }) server.on('error', (err) => { if (err.code === 'EADDRINUSE') { console.error( `[server] Port ${config.port} ist bereits belegt. Windows: netstat -ano | findstr :${config.port} → taskkill /PID /F. Oder in .env einen anderen PORT setzen (z. B. PORT=3002).` ) process.exit(1) } throw err })