syncova-policies/lib/site-pages.server.ts
Weapie 5aa8880190 Gebaerdensprach-Video ermoeglichen und Erklaerung anpassen
Ein DGS-Video liess sich bisher gar nicht einbinden: Der Markdown-
Prozessor laeuft mit Sanitizing, und remark reicht rohes HTML dann von
vornherein nicht durch - <video> kam als leeres <p> heraus. Eine
erweiterte Freigabeliste allein half deshalb nicht.

Statt rohes HTML fuer alle Textfelder zu oeffnen - auch fuer die 121
Erklaerungen - bekommt die Gebaerdensprach-Seite zwei eigene Felder fuer
Video- und Untertiteladresse. Ausgegeben wird ein natives <video
controls> mit <track kind="captions"> und Bildunterschrift.

Adressen werden zweimal geprueft, beim Speichern und vor der Ausgabe:
zugelassen sind nur der eigene Server und https. javascript:, data:,
protokollrelative und einfache http-Adressen werden abgewiesen. iframe
bleibt bewusst gesperrt - eine YouTube-Einbindung wuerde Besucherdaten
an Dritte uebertragen.

Erklaerung zur Barrierefreiheit entsprechend gekuerzt: Die beiden
Luecken nach § 4 BITV 2.0 entfallen, es bleibt die ungepruefte
Druckansicht.

Geprueft: Video wird mit Untertitelspur ausgeliefert und ist per Tastatur
erreichbar, axe-core meldet auf beiden neuen Seiten in hell und dunkel
keine Verstoesse, Adresspruefung weist alle acht Testfaelle korrekt zu.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 16:18:09 +02:00

26 lines
666 B
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { PrismaClient } from '@prisma/client'
import {
EMPTY_SITE_PAGES,
SITE_MEDIA,
SITE_PAGES,
SitePagesContent,
} from '@/lib/site-pages'
// Prisma client instance
const prisma = new PrismaClient()
/**
* Liest die Inhalte der rechtlichen Seiten (id = 1). Fehlt der Datensatz,
* kommen leere Texte zurück – die Seiten liefern dann 404.
*/
export async function readSitePages(): Promise<SitePagesContent> {
const row = await prisma.sitePages.findUnique({ where: { id: 1 } })
if (!row) return { ...EMPTY_SITE_PAGES }
return Object.fromEntries(
[...SITE_PAGES, ...SITE_MEDIA].map((key) => [key, row[key] ?? ''])
) as SitePagesContent
}