Add OG image support for WhatsApp/social media link previews

This commit is contained in:
2026-01-06 02:03:51 +01:00
parent 50a3c7fe24
commit a7b2169ec8
4 changed files with 94 additions and 12 deletions

View File

@@ -3,9 +3,10 @@ import session from 'express-session';
import cookieParser from 'cookie-parser';
import cors from 'cors';
import path from 'path';
import fs from 'fs';
import { fileURLToPath } from 'url';
import { initializeDatabase } from './database.js';
import { initializeDatabase, questionnaireOps } from './database.js';
import authRoutes from './routes/auth.js';
import adminRoutes from './routes/admin.js';
import questionnaireRoutes from './routes/questionnaire.js';
@@ -63,7 +64,47 @@ if (isProduction) {
const clientPath = path.join(__dirname, '../client');
app.use(express.static(clientPath));
// SPA fallback
// Dynamic OG meta tags for questionnaire pages
app.get('/q/:slug', (req, res) => {
const questionnaire = questionnaireOps.findBySlug(req.params.slug);
const indexPath = path.join(clientPath, 'index.html');
if (!questionnaire) {
res.sendFile(indexPath);
return;
}
// Read the index.html template
let html = fs.readFileSync(indexPath, 'utf-8');
// Build meta tags
const baseUrl = `${req.protocol}://${req.get('host')}`;
const pageUrl = `${baseUrl}/q/${questionnaire.slug}`;
const title = questionnaire.title;
const description = questionnaire.description || 'Activiteiten Inventaris - Voeg activiteiten toe en stem!';
const ogTags = `
<meta property="og:type" content="website" />
<meta property="og:url" content="${pageUrl}" />
<meta property="og:title" content="${title}" />
<meta property="og:description" content="${description}" />
${questionnaire.og_image ? `<meta property="og:image" content="${questionnaire.og_image}" />` : ''}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="${title}" />
<meta name="twitter:description" content="${description}" />
${questionnaire.og_image ? `<meta name="twitter:image" content="${questionnaire.og_image}" />` : ''}
`;
// Insert OG tags before </head>
html = html.replace('</head>', `${ogTags}</head>`);
// Update title
html = html.replace(/<title>.*?<\/title>/, `<title>${title} - Activiteiten Inventaris</title>`);
res.send(html);
});
// SPA fallback for other routes
app.get('*', (_req, res) => {
res.sendFile(path.join(clientPath, 'index.html'));
});