import { Router } from 'express' import { checkShare, cookieName, previewUrl, shareCookieOptions } from '../services/vorschauLink.js' // Geheimer Vorschau-Link, siehe services/vorschauLink.js function seite(res, status, titel, text) { res .status(status) .set('Cache-Control', 'no-store') .set('X-Robots-Tag', 'noindex, nofollow') .type('html') .send(` ${titel}

${titel}

${text}

`) } /** Seite: GET /vorschau/:subdomain/:token -> Cookie setzen und auf die Preview weiterleiten */ export function vorschauLinkSeite() { const router = Router() router.get('/:subdomain/:token', async (req, res) => { let result try { result = await checkShare(req.params.subdomain, req.params.token) } catch (err) { console.error('[vorschau-link] Pruefung fehlgeschlagen:', err.message) return seite(res, 500, 'Vorschau nicht erreichbar', 'Bitte in ein paar Minuten noch einmal versuchen.') } if (result.reason === 'not_ready') { return seite(res, 503, 'Vorschau wird vorbereitet', 'Die Seite wird gerade gebaut. Bitte in ein paar Minuten noch einmal versuchen.') } if (!result.allowed) { return seite(res, 404, 'Link nicht gültig', 'Dieser Vorschau-Link ist nicht (mehr) gültig. Bitte frag bei WEBklar nach einem neuen Link.') } res.cookie(cookieName(result.subdomain), req.params.token, shareCookieOptions()) res.set('Cache-Control', 'no-store') res.set('Referrer-Policy', 'no-referrer') return res.redirect(302, previewUrl(result.subdomain)) }) return router } /** Fuer die Login-Pruefung der Previews: GET /api/vorschau-link/pruefen?subdomain=..., Header x-vorschau-token */ export function vorschauLinkPruefung() { const router = Router() router.get('/pruefen', async (req, res) => { res.set('Cache-Control', 'no-store') try { const result = await checkShare(req.query.subdomain, req.get('x-vorschau-token')) return res.status(result.allowed ? 200 : 403).json({ allowed: result.allowed, reason: result.reason }) } catch (err) { console.error('[vorschau-link] Pruefung fehlgeschlagen:', err.message) return res.status(500).json({ allowed: false }) } }) return router }