Analyse: Eingaben und Liste robuster

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-01 10:22:19 +00:00
1 parent f4c8b291d7
commit fc937b0d1e
3 files changed
+34 -4

No files matched your search

+11 -2
View File
@@ -70,7 +70,15 @@ router.get('/', requireSession, async (req, res) => {
await runActivation({ customerId }).catch((err) => console.error('[funktionen] Freischalten fehlgeschlagen:', err.message))
await backfillInvoiceLinks(customerId)
const projects = await listCustomerFeatures(customerId)
for (const p of projects) p.analyse = await analyseView(customerId, p.projectId)
// Ein Fehler bei einem Projekt (z. B. Abo-Pruefung) darf nicht die ganze Liste kosten
await Promise.all(
projects.map(async (p) => {
p.analyse = await analyseView(customerId, p.projectId).catch((err) => {
console.error('[funktionen] Analyse-Zustand fehlgeschlagen:', err.message)
return { state: 'unknown' }
})
}),
)
res.json({
projects,
setupEstimate: config.funktionen.setupEstimate,
@@ -217,7 +225,7 @@ router.get('/analyse/stats', analyseGuard, async (req, res) => {
router.post('/analyse/heatmap-link', analyseGuard, async (req, res) => {
try {
const { projectId, path, vp } = req.body || {}
if (typeof path !== 'string' || !path.startsWith('/') || path.length > 300 || /[?#]/.test(path)) {
if (typeof path !== 'string' || !path.startsWith('/') || path.length > 300 || /[?#\\\s\u0000-\u001f\u007f]/.test(path)) {
return res.status(400).json({ error: 'Ungültiger Pfad' })
}
if (!['m', 't', 'd'].includes(vp)) return res.status(400).json({ error: 'Ungültige Ansicht' })
@@ -226,6 +234,7 @@ router.post('/analyse/heatmap-link', analyseGuard, async (req, res) => {
return res.status(409).json({ error: 'Die Website-Analyse ist für dieses Projekt nicht aktiv.' })
}
const domains = analyseDomains(project)
if (!domains.length) return res.status(409).json({ error: 'Keine gültige Domain' })
const host = project.liveDomain ? domains[domains.length - 1] : domains[0]
const token = analyseDeps.client.heatToken({ siteKey: doc.siteKey, path, vp })
res.json({ url: `https://${host}${path}?__wk_heat=${encodeURIComponent(token)}` })