import { readFileSync, existsSync } from 'fs';
import { join, resolve } from 'path';
// SEO-Meta-Daten für verschiedene Routen
const seoData = {
'/': {
title: 'SingleChat - Chat, Single-Chat und Bildaustausch',
description: 'Willkommen auf SingleChat - deine erste Adresse für Chat, Single-Chat und Bildaustausch. Chatte mit Menschen aus aller Welt, finde neue Kontakte und teile Erinnerungen sicher und komfortabel.',
keywords: 'Chat, Single-Chat, Bildaustausch, Online-Chat, Singles, Kontakte, Community',
ogTitle: 'SingleChat - Chat, Single-Chat und Bildaustausch',
ogDescription: 'Willkommen auf SingleChat - deine erste Adresse für Chat, Single-Chat und Bildaustausch.',
ogType: 'website',
ogUrl: 'https://ypchat.net/',
ogImage: 'https://ypchat.net/static/favicon.png'
},
'/partners': {
title: 'Partner - SingleChat',
description: 'Unsere Partner und befreundete Seiten. Entdecke weitere interessante Angebote und Communities.',
keywords: 'Partner, Links, befreundete Seiten, Community',
ogTitle: 'Partner - SingleChat',
ogDescription: 'Unsere Partner und befreundete Seiten.',
ogType: 'website',
ogUrl: 'https://ypchat.net/partners',
ogImage: 'https://ypchat.net/static/favicon.png'
}
};
// HTML-Template für Pre-Rendering
function generateHTML(route, meta, __dirname) {
// Versuche, die gebaute index.html zu lesen
const distIndexPath = join(__dirname, '../docroot/dist/index.html');
console.log('[SEO] Prüfe gebaute index.html:', distIndexPath);
console.log('[SEO] Datei existiert:', existsSync(distIndexPath));
if (!existsSync(distIndexPath)) {
// Fallback: Gebaute index.html nicht gefunden
console.error('WARNUNG: Gebaute index.html nicht gefunden:', distIndexPath);
return null;
}
// Verwende die gebaute index.html (mit korrekten Asset-Pfaden von Vite)
let baseHTML = readFileSync(distIndexPath, 'utf-8');
console.log('[SEO] Gebaute HTML geladen, Länge:', baseHTML.length);
// Ersetze Meta-Tags in der gebauten HTML
baseHTML = baseHTML.replace(/
.*?<\/title>/, `${meta.title}`);
// Ersetze oder füge description hinzu
if (baseHTML.includes(']*>/, ``);
} else {
baseHTML = baseHTML.replace('', ` \n`);
}
// Ersetze oder füge keywords hinzu
if (baseHTML.includes(']*>/, ``);
} else {
baseHTML = baseHTML.replace('', ` \n`);
}
// Ersetze oder füge Open Graph Tags hinzu
const ogTags = `
`;
// Entferne alte OG/Twitter/Canonical Tags falls vorhanden
baseHTML = baseHTML.replace(/]*>/g, '');
baseHTML = baseHTML.replace(/]*>/g, '');
// Füge neue Tags vor ein
baseHTML = baseHTML.replace('', `${ogTags}\n`);
// Füge robots meta hinzu falls nicht vorhanden
if (!baseHTML.includes('', ` \n`);
}
return baseHTML;
}
export function setupSEORoutes(app, __dirname) {
// Pre-Rendering für SEO-relevante Routen (nur in Production)
// In Development wird die normale index.html verwendet
const IS_PRODUCTION = process.env.NODE_ENV === 'production';
if (IS_PRODUCTION) {
const distIndexPath = resolve(__dirname, '../docroot/dist/index.html');
// Pre-Rendering für Hauptseite
app.get('/', (req, res) => {
const meta = seoData['/'];
const html = generateHTML('/', meta, __dirname);
if (html) {
res.send(html);
} else {
// Fallback: Verwende die gebaute index.html direkt (ohne Meta-Tag-Anpassung)
if (existsSync(distIndexPath)) {
res.sendFile(distIndexPath);
} else {
console.error('FEHLER: Gebaute index.html nicht gefunden:', distIndexPath);
res.status(500).send('Gebaute index.html nicht gefunden. Bitte führe "npm run build" aus.');
}
}
});
// Pre-Rendering für Partners-Seite
app.get('/partners', (req, res) => {
const meta = seoData['/partners'];
const html = generateHTML('/partners', meta, __dirname);
if (html) {
res.send(html);
} else {
// Fallback: Verwende die gebaute index.html direkt (ohne Meta-Tag-Anpassung)
if (existsSync(distIndexPath)) {
res.sendFile(distIndexPath);
} else {
console.error('FEHLER: Gebaute index.html nicht gefunden:', distIndexPath);
res.status(500).send('Gebaute index.html nicht gefunden. Bitte führe "npm run build" aus.');
}
}
});
}
// robots.txt
app.get('/robots.txt', (req, res) => {
const robotsTxt = `User-agent: *
Allow: /
Allow: /partners
Disallow: /api/
Disallow: /static/logs/
Sitemap: https://ypchat.net/sitemap.xml
`;
res.type('text/plain');
res.send(robotsTxt);
});
// sitemap.xml
app.get('/sitemap.xml', (req, res) => {
const sitemap = `
https://ypchat.net/
${new Date().toISOString().split('T')[0]}
daily
1.0
https://ypchat.net/partners
${new Date().toISOString().split('T')[0]}
weekly
0.8
`;
res.type('application/xml');
res.send(sitemap);
});
}