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
}