valley-commons/server.js

64 lines
2.0 KiB
JavaScript

const express = require('express');
const path = require('path');
const app = express();
const PORT = process.env.PORT || 3000;
// Middleware
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// CORS middleware
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
if (req.method === 'OPTIONS') {
return res.status(200).end();
}
next();
});
// API routes - wrap Vercel serverless functions
const waitlistHandler = require('./api/waitlist-db');
const applicationHandler = require('./api/application');
const gameChatHandler = require('./api/game-chat');
const shareToGithubHandler = require('./api/share-to-github');
const { handleWebhook, getPaymentStatus } = require('./api/mollie');
// Adapter to convert Vercel handler to Express
const vercelToExpress = (handler) => async (req, res) => {
try {
await handler(req, res);
} catch (error) {
console.error('API Error:', error);
if (!res.headersSent) {
res.status(500).json({ error: 'Internal server error' });
}
}
};
app.all('/api/waitlist', vercelToExpress(waitlistHandler));
app.all('/api/application', vercelToExpress(applicationHandler));
app.all('/api/game-chat', vercelToExpress(gameChatHandler));
app.all('/api/share-to-github', vercelToExpress(shareToGithubHandler));
app.post('/api/mollie/webhook', vercelToExpress(handleWebhook));
app.all('/api/mollie/status', vercelToExpress(getPaymentStatus));
// Static files
app.use(express.static(path.join(__dirname), {
extensions: ['html'],
index: 'index.html'
}));
// SPA fallback - serve index.html for non-API routes
app.get('*', (req, res) => {
if (!req.path.startsWith('/api/')) {
res.sendFile(path.join(__dirname, 'index.html'));
}
});
app.listen(PORT, '0.0.0.0', () => {
console.log(`Valley of the Commons server running on port ${PORT}`);
});