From 6b0cd331bb1ff1a18ffd4074ccc08578c27abf21 Mon Sep 17 00:00:00 2001 From: Harlekin Date: Tue, 1 Sep 2026 00:01:41 +0200 Subject: [PATCH] Web-Anwendung: Design-Tokens, Texte, Gesundheitsendpunkt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Design-Tokens aus docs/10-design-system.md als CSS-Variablen: Grundpalette, die sechs Klassifizierungsfarben, Eckenradius durchgehend 2 px, keine Schatten ausser dem Fokusring. Der Schwärzungsbalken mit dem einmaligen Durchwischen respektiert prefers-reduced-motion. Vier Tests halten die Tokens gegen das Dokument. IBM Plex selbst gehostet als woff2, latin und latin-ext getrennt über unicode-range, font-display: swap, immutable-Cache. Alle Oberflächentexte in lib/i18n/de.ts. Ein Test durchsucht app/ und components/ nach Umlauten im JSX und schlägt fehl, wenn dort deutscher Text steht. Er hat beim ersten Lauf gleich einen Verstoss gefunden. /api/health prüft Datenbank, Discord-Gateway und ClamAV. Die Gesamtbewertung fällt nur auf "down", wenn die Datenbank weg ist: die anderen Dienste haben eigene Healthchecks im Stack, und ein ausgefallener Virenscanner soll nicht den Web-Container als tot markieren. Strikte CSP mit Nonce, kein unsafe-inline für Skripte. Die erste Route liegt bei 100 kB JavaScript nach Kompression, Budget sind 120 kB. Co-Authored-By: Claude Opus 5 --- web/app/api/health/route.ts | 16 ++ web/app/error.tsx | 19 ++ web/app/fonts.css | 89 +++++++ web/app/globals.css | 230 ++++++++++++++++++ web/app/layout.tsx | 48 ++++ web/app/loading.tsx | 24 ++ web/app/not-found.tsx | 10 + web/app/page.tsx | 72 ++++++ web/components/Skeleton.tsx | 24 ++ web/components/StampMark.tsx | 38 +++ web/e2e/smoke.spec.ts | 24 ++ web/eslint.config.mjs | 21 ++ web/lib/auth/permissions.ts | 57 +++++ web/lib/db.ts | 14 ++ web/lib/env.ts | 56 +++++ web/lib/health/check.ts | 77 ++++++ web/lib/health/clamav.ts | 24 ++ web/lib/i18n/de.ts | 160 ++++++++++++ web/middleware.ts | 51 ++++ web/next-env.d.ts | 6 + web/next.config.ts | 51 ++++ web/package.json | 48 ++++ web/playwright.config.ts | 32 +++ web/postcss.config.mjs | 5 + .../ibm-plex-mono-latin-400-normal.woff2 | Bin 0 -> 14708 bytes .../ibm-plex-mono-latin-ext-400-normal.woff2 | Bin 0 -> 13348 bytes ...plex-sans-condensed-latin-500-normal.woff2 | Bin 0 -> 19952 bytes ...-sans-condensed-latin-ext-500-normal.woff2 | Bin 0 -> 15928 bytes .../ibm-plex-sans-latin-400-normal.woff2 | Bin 0 -> 22588 bytes .../ibm-plex-sans-latin-500-normal.woff2 | Bin 0 -> 24184 bytes .../ibm-plex-sans-latin-ext-400-normal.woff2 | Bin 0 -> 15980 bytes .../ibm-plex-sans-latin-ext-500-normal.woff2 | Bin 0 -> 16456 bytes web/tests/design-tokens.test.ts | 35 +++ web/tests/health.test.ts | 33 +++ web/tests/i18n.test.ts | 47 ++++ web/tests/setup.ts | 3 + web/tsconfig.json | 16 ++ web/vitest.config.mts | 13 + 38 files changed, 1343 insertions(+) create mode 100644 web/app/api/health/route.ts create mode 100644 web/app/error.tsx create mode 100644 web/app/fonts.css create mode 100644 web/app/globals.css create mode 100644 web/app/layout.tsx create mode 100644 web/app/loading.tsx create mode 100644 web/app/not-found.tsx create mode 100644 web/app/page.tsx create mode 100644 web/components/Skeleton.tsx create mode 100644 web/components/StampMark.tsx create mode 100644 web/e2e/smoke.spec.ts create mode 100644 web/eslint.config.mjs create mode 100644 web/lib/auth/permissions.ts create mode 100644 web/lib/db.ts create mode 100644 web/lib/env.ts create mode 100644 web/lib/health/check.ts create mode 100644 web/lib/health/clamav.ts create mode 100644 web/lib/i18n/de.ts create mode 100644 web/middleware.ts create mode 100644 web/next-env.d.ts create mode 100644 web/next.config.ts create mode 100644 web/package.json create mode 100644 web/playwright.config.ts create mode 100644 web/postcss.config.mjs create mode 100644 web/public/fonts/ibm-plex-mono-latin-400-normal.woff2 create mode 100644 web/public/fonts/ibm-plex-mono-latin-ext-400-normal.woff2 create mode 100644 web/public/fonts/ibm-plex-sans-condensed-latin-500-normal.woff2 create mode 100644 web/public/fonts/ibm-plex-sans-condensed-latin-ext-500-normal.woff2 create mode 100644 web/public/fonts/ibm-plex-sans-latin-400-normal.woff2 create mode 100644 web/public/fonts/ibm-plex-sans-latin-500-normal.woff2 create mode 100644 web/public/fonts/ibm-plex-sans-latin-ext-400-normal.woff2 create mode 100644 web/public/fonts/ibm-plex-sans-latin-ext-500-normal.woff2 create mode 100644 web/tests/design-tokens.test.ts create mode 100644 web/tests/health.test.ts create mode 100644 web/tests/i18n.test.ts create mode 100644 web/tests/setup.ts create mode 100644 web/tsconfig.json create mode 100644 web/vitest.config.mts diff --git a/web/app/api/health/route.ts b/web/app/api/health/route.ts new file mode 100644 index 0000000..bb45621 --- /dev/null +++ b/web/app/api/health/route.ts @@ -0,0 +1,16 @@ +import { collectHealth } from '@/lib/health/check' + +export const dynamic = 'force-dynamic' +export const revalidate = 0 + +/** + * Wird vom Healthcheck des Dienstes `web` benutzt, siehe docs/11-betrieb.md. + * 200 solange die Datenbank erreichbar ist, 503 sonst. + */ +export async function GET(): Promise { + const report = await collectHealth() + return Response.json(report, { + status: report.status === 'down' ? 503 : 200, + headers: { 'Cache-Control': 'no-store' }, + }) +} diff --git a/web/app/error.tsx b/web/app/error.tsx new file mode 100644 index 0000000..453c684 --- /dev/null +++ b/web/app/error.tsx @@ -0,0 +1,19 @@ +'use client' + +import { de } from '@/lib/i18n/de' + +export default function Error({ reset }: { error: Error; reset: () => void }) { + return ( +
+

{de.errors.unexpected.title}

+

{de.errors.unexpected.body}

+ +
+ ) +} diff --git a/web/app/fonts.css b/web/app/fonts.css new file mode 100644 index 0000000..23b71b0 --- /dev/null +++ b/web/app/fonts.css @@ -0,0 +1,89 @@ +/* IBM Plex, selbst gehostet, als woff2 untergesetzt (latin und latin-ext). + Die Wahl ist in docs/10-design-system.md begruendet: Plex wurde als Hausschrift + einer Institution entworfen, hat einen schmalen Schnitt fuer Tabellenkoepfe und + eine passende Mono fuer Kennzeichen. + font-display: swap nach docs/09-performance-und-ux.md. */ + +@font-face { + font-family: 'IBM Plex Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url('/fonts/ibm-plex-sans-latin-400-normal.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +@font-face { + font-family: 'IBM Plex Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url('/fonts/ibm-plex-sans-latin-ext-400-normal.woff2') format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, + U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, + U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: 'IBM Plex Sans'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url('/fonts/ibm-plex-sans-latin-500-normal.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +@font-face { + font-family: 'IBM Plex Sans'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url('/fonts/ibm-plex-sans-latin-ext-500-normal.woff2') format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, + U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, + U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: 'IBM Plex Sans Condensed'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url('/fonts/ibm-plex-sans-condensed-latin-500-normal.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +@font-face { + font-family: 'IBM Plex Sans Condensed'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url('/fonts/ibm-plex-sans-condensed-latin-ext-500-normal.woff2') format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, + U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, + U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: 'IBM Plex Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url('/fonts/ibm-plex-mono-latin-400-normal.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, + U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +@font-face { + font-family: 'IBM Plex Mono'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url('/fonts/ibm-plex-mono-latin-ext-400-normal.woff2') format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, + U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, + U+2C60-2C7F, U+A720-A7FF; +} diff --git a/web/app/globals.css b/web/app/globals.css new file mode 100644 index 0000000..f447f86 --- /dev/null +++ b/web/app/globals.css @@ -0,0 +1,230 @@ +@import 'tailwindcss'; +@import './fonts.css'; + +/* --------------------------------------------------------------------------- + Design-Tokens. Fachliche Grundlage: docs/10-design-system.md. + Bezugspunkt ist eine Registratur im Nachtdienst: lackierter Stahl, + Aktenpapier, Stempelfarbe. Die einzige Farbe kommt von der Klassifizierung. + --------------------------------------------------------------------------- */ + +@theme { + /* Grundpalette, dunkel ist der Auslieferungszustand */ + --color-ink-900: #15181a; /* Grundflaeche, kuehles Anthrazit, leicht gruenstichig */ + --color-ink-800: #1d2124; /* Panel */ + --color-ink-700: #262b2f; /* erhoehte Flaeche, Eingabefelder */ + --color-ink-500: #3a4147; /* Linien und Rahmen */ + --color-paper: #e4e7e4; /* Primaertext, papierfarbenes Off-White */ + --color-paper-dim: #939c99; /* Sekundaertext */ + --color-steel: #7a97a6; /* interaktiv: Links, Fokus, aktive Zustaende */ + + /* Klassifizierungsfarben. Das einzige Buntsystem, nirgends sonst benutzt. */ + --color-stamp-0: #8a918d; /* Offen, Grau */ + --color-stamp-1: #6d8a9c; /* Intern, Stahlblau */ + --color-stamp-2: #4e8f72; /* Vertraulich, Gruenspan */ + --color-stamp-3: #b08637; /* Geheim, Messing */ + --color-stamp-4: #b4543c; /* Streng geheim, Oxidrot */ + --color-stamp-5: #7e5e96; /* Leitungssache, Tiefviolett */ + + /* Semantische Ebene. Das helle Thema tauscht nur diese Werte. */ + --color-surface: var(--color-ink-900); + --color-panel: var(--color-ink-800); + --color-raised: var(--color-ink-700); + --color-line: var(--color-ink-500); + --color-text: var(--color-paper); + --color-text-dim: var(--color-paper-dim); + --color-accent: var(--color-steel); + + /* Schrift. IBM Plex, selbst gehostet, drei Rollen aus einer Familie. */ + --font-sans: 'IBM Plex Sans', ui-sans-serif, system-ui, sans-serif; + --font-condensed: 'IBM Plex Sans Condensed', 'IBM Plex Sans', ui-sans-serif, sans-serif; + --font-mono: 'IBM Plex Mono', ui-monospace, monospace; + + /* Skala 12 / 13 / 15 / 18 / 24 px */ + --text-2xs: 0.75rem; /* 12 */ + --text-xs: 0.8125rem; /* 13 */ + --text-sm: 0.9375rem; /* 15 */ + --text-base: 0.9375rem; /* 15, Fliesstext */ + --text-lg: 1.125rem; /* 18 */ + --text-xl: 1.5rem; /* 24 */ + + --text-2xs--line-height: 1.4; + --text-xs--line-height: 1.45; + --text-sm--line-height: 1.6; + --text-base--line-height: 1.6; + --text-lg--line-height: 1.45; + --text-xl--line-height: 1.3; + + /* Struktur: Eckenradius 2 px, ueberall gleich. Akten sind nicht abgerundet. */ + --radius-none: 0px; + --radius-sm: 2px; + --radius-DEFAULT: 2px; + --radius-md: 2px; + --radius-lg: 2px; + --radius-xl: 2px; + + /* Keine Schatten ausser dem Fokusring. */ + --shadow-sm: none; + --shadow-DEFAULT: none; + --shadow-md: none; + --shadow-lg: none; + + /* Zeilenlaenge hoechstens 72 Zeichen */ + --container-measure: 72ch; + + /* Die 3 px breite Klassifizierungskante links am Objekt */ + --spacing-edge: 3px; +} + +/* Helles Thema. Verpflichtend mitzuliefern, ausgebaut in Phase 9. */ +[data-theme='light'] { + --color-surface: #eceeea; + --color-panel: #e2e5e1; + --color-raised: #f4f5f2; + --color-line: #b9beb8; + --color-text: #1b1f21; + --color-text-dim: #545c58; + --color-accent: #3d5f70; +} + +@layer base { + *, + *::before, + *::after { + border-color: var(--color-line); + } + + html { + color-scheme: dark; + background-color: var(--color-surface); + } + + [data-theme='light'] { + color-scheme: light; + } + + body { + background-color: var(--color-surface); + color: var(--color-text); + font-family: var(--font-sans); + font-size: var(--text-base); + line-height: 1.6; + -webkit-font-smoothing: antialiased; + } + + /* Spaltenkoepfe, Stempel und Reiter tragen den schmalen Schnitt. + Kein Versalsatz: der Stempelcharakter kommt aus Schnitt, Rahmen und Farbe. */ + th, + legend { + font-family: var(--font-condensed); + font-weight: 500; + text-transform: none; + } + + /* Aktenzeichen, Zeitstempel, Hashes und Dienstnummern in Mono. */ + code, + kbd, + samp, + time { + font-family: var(--font-mono); + } + + h1, + h2, + h3 { + font-weight: 500; + text-wrap: balance; + } + + h1 { + font-size: var(--text-xl); + } + h2 { + font-size: var(--text-lg); + } + h3 { + font-size: var(--text-base); + } + + a { + color: var(--color-accent); + text-underline-offset: 2px; + } + + /* Sichtbarer Fokusring in --steel, der einzige Schatten im System. */ + :focus-visible { + outline: 2px solid var(--color-accent); + outline-offset: 2px; + border-radius: 2px; + } + + ::selection { + background-color: color-mix(in srgb, var(--color-accent) 40%, transparent); + } +} + +@layer components { + /* Der eine mutige Moment: die Schwaerzung. Ein massiver Balken mit feiner + Rahmenlinie, der beim ersten Erscheinen einmal von links nach rechts + durchwischt. Sonst bewegt sich in der Oberflaeche nichts von selbst. */ + .redaction { + display: inline-block; + position: relative; + overflow: hidden; + vertical-align: baseline; + background-color: var(--color-ink-900); + border: 1px solid var(--color-line); + border-radius: 2px; + color: transparent; + user-select: none; + } + + .redaction::after { + content: ''; + position: absolute; + inset: 0; + background-color: var(--color-ink-700); + transform-origin: left center; + animation: redaction-wipe 150ms ease-out 1 both; + } + + @keyframes redaction-wipe { + from { + transform: scaleX(1); + } + to { + transform: scaleX(0); + } + } + + /* Zeitachse des Verlaufs: durchgehende senkrechte Linie. Der Chat hat keine. + Der Unterschied muss ohne Beschriftung erkennbar sein. */ + .timeline { + position: relative; + padding-left: 1.5rem; + } + + .timeline::before { + content: ''; + position: absolute; + left: 0.4375rem; + top: 0; + bottom: 0; + width: 1px; + background-color: var(--color-line); + } +} + +@media (prefers-reduced-motion: reduce) { + .redaction::after { + animation: none; + transform: scaleX(0); + } + + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} diff --git a/web/app/layout.tsx b/web/app/layout.tsx new file mode 100644 index 0000000..c7ec80e --- /dev/null +++ b/web/app/layout.tsx @@ -0,0 +1,48 @@ +import type { Metadata, Viewport } from 'next' +import { de } from '@/lib/i18n/de' +import './globals.css' + +export const metadata: Metadata = { + title: { default: de.app.name, template: `%s · ${de.app.shortName}` }, + description: de.app.description, + robots: { index: false, follow: false }, +} + +export const viewport: Viewport = { + themeColor: '#15181A', + width: 'device-width', + initialScale: 1, +} + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + {/* Nur die beiden Schnitte vorladen, die auf jeder Seite vorkommen. */} + + + + + + {de.nav.skipToContent} + + {children} + + + ) +} diff --git a/web/app/loading.tsx b/web/app/loading.tsx new file mode 100644 index 0000000..fccf29d --- /dev/null +++ b/web/app/loading.tsx @@ -0,0 +1,24 @@ +import { SkeletonLine, Skeleton } from '@/components/Skeleton' + +/** + * Jede Route hat ein Skelett, das die spaetere Struktur nachbildet. + * Nie eine leere Seite mit Spinner, siehe docs/09-performance-und-ux.md. + */ +export default function Loading() { + return ( +
+ +
+ + +
+
+ +
+ + + +
+
+ ) +} diff --git a/web/app/not-found.tsx b/web/app/not-found.tsx new file mode 100644 index 0000000..759bd3e --- /dev/null +++ b/web/app/not-found.tsx @@ -0,0 +1,10 @@ +import { de } from '@/lib/i18n/de' + +export default function NotFound() { + return ( +
+

{de.errors.notFound.title}

+

{de.errors.notFound.body}

+
+ ) +} diff --git a/web/app/page.tsx b/web/app/page.tsx new file mode 100644 index 0000000..0a6123e --- /dev/null +++ b/web/app/page.tsx @@ -0,0 +1,72 @@ +import { Suspense } from 'react' +import { collectHealth, type ComponentState } from '@/lib/health/check' +import { de } from '@/lib/i18n/de' +import { SkeletonLine } from '@/components/Skeleton' + +export const dynamic = 'force-dynamic' + +const STATE_LABEL: Record = { + up: de.health.ok, + degraded: de.health.degraded, + down: de.health.down, +} + +async function SystemState() { + const report = await collectHealth() + return ( + + + + + + + + + + {Object.entries(report.components).map(([key, value]) => ( + + + + + ))} + +
+ {de.health.checkedAt(new Date(report.checkedAt).toLocaleString('de-DE'))} +
+ {de.health.service} + + {de.health.state} +
{de.health.components[key] ?? key} + {/* Zustand als Text, nicht nur als Farbe. */} + {STATE_LABEL[value.status]} + {value.detail ? ( + {value.detail} + ) : null} +
+ ) +} + +export default function Home() { + return ( +
+

{de.app.name}

+

{de.app.description}

+ +
+ +

{de.health.heading}

+ + + + + + + } + > + + +
+ ) +} diff --git a/web/components/Skeleton.tsx b/web/components/Skeleton.tsx new file mode 100644 index 0000000..c28b087 --- /dev/null +++ b/web/components/Skeleton.tsx @@ -0,0 +1,24 @@ +/** + * Platzhalterflaeche fuer Ladezustaende. Das Skelett bildet die spaetere + * Struktur exakt nach (gleiche Hoehen, gleiche Spaltenbreiten), damit beim + * Eintreffen der Daten nichts springt. Siehe docs/09-performance-und-ux.md. + */ +export function Skeleton({ + className = '', + width, +}: { + className?: string + width?: string | number +}) { + return ( + + ) +} + +export function SkeletonLine({ width = '100%' }: { width?: string | number }) { + return +} diff --git a/web/components/StampMark.tsx b/web/components/StampMark.tsx new file mode 100644 index 0000000..3fc76f9 --- /dev/null +++ b/web/components/StampMark.tsx @@ -0,0 +1,38 @@ +import { de } from '@/lib/i18n/de' + +const STAMP_COLOR: Record = { + 0: 'var(--color-stamp-0)', + 1: 'var(--color-stamp-1)', + 2: 'var(--color-stamp-2)', + 3: 'var(--color-stamp-3)', + 4: 'var(--color-stamp-4)', + 5: 'var(--color-stamp-5)', +} + +export function stampColor(level: number): string { + return STAMP_COLOR[level] ?? STAMP_COLOR[0]! +} + +/** + * Stempelmarke oben rechts am Objekt. Der Stempelcharakter kommt aus dem + * schmalen Schnitt, der Rahmenlinie und der Farbe, nicht aus Grossbuchstaben. + * Die Stufe steht zusaetzlich als Text, nicht nur als Farbe. + */ +export function StampMark({ level }: { level: number }) { + return ( + + + {level} + + {de.clearance.names[level] ?? de.common.unknown} + + ) +} + +/** Die 3 px breite Klassifizierungskante links am Objekt. */ +export function classificationEdgeStyle(level: number): React.CSSProperties { + return { borderLeft: `var(--spacing-edge) solid ${stampColor(level)}` } +} diff --git a/web/e2e/smoke.spec.ts b/web/e2e/smoke.spec.ts new file mode 100644 index 0000000..96aa586 --- /dev/null +++ b/web/e2e/smoke.spec.ts @@ -0,0 +1,24 @@ +import { expect, test } from '@playwright/test' + +test('Startseite liefert Titel und Systemzustand', async ({ page }) => { + await page.goto('/') + await expect(page.getByRole('heading', { level: 1 })).toHaveText('AfiS-Aktensystem') + await expect(page.getByRole('heading', { name: 'Systemzustand' })).toBeVisible() + await expect(page.getByRole('cell', { name: 'Datenbank' })).toBeVisible() +}) + +test('Gesundheitsendpunkt antwortet mit allen drei Abhaengigkeiten', async ({ request }) => { + const response = await request.get('/api/health') + expect([200, 503]).toContain(response.status()) + const body = await response.json() + expect(Object.keys(body.components).sort()).toEqual(['clamav', 'database', 'discordGateway']) +}) + +test('Antwort traegt eine strikte Inhaltsrichtlinie', async ({ page }) => { + const response = await page.goto('/') + const csp = response?.headers()['content-security-policy'] ?? '' + expect(csp).toContain("object-src 'none'") + expect(csp).toContain("frame-ancestors 'none'") + expect(csp).toMatch(/script-src [^;]*'nonce-/) + expect(csp).not.toMatch(/script-src [^;]*'unsafe-inline'/) +}) diff --git a/web/eslint.config.mjs b/web/eslint.config.mjs new file mode 100644 index 0000000..effef50 --- /dev/null +++ b/web/eslint.config.mjs @@ -0,0 +1,21 @@ +import { dirname } from 'node:path' +import { fileURLToPath } from 'node:url' +import { FlatCompat } from '@eslint/eslintrc' + +const compat = new FlatCompat({ baseDirectory: dirname(fileURLToPath(import.meta.url)) }) + +export default [ + { ignores: ['.next/**', 'node_modules/**', 'next-env.d.ts', 'playwright-report/**'] }, + ...compat.extends('next/core-web-vitals', 'next/typescript'), + { + rules: { + // Sprachkonvention: Oberflaechentexte gehoeren nach lib/i18n/de.ts, + // nie hart ins JSX. Siehe CLAUDE.md. + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, + ], + '@typescript-eslint/no-explicit-any': 'error', + }, + }, +] diff --git a/web/lib/auth/permissions.ts b/web/lib/auth/permissions.ts new file mode 100644 index 0000000..942513d --- /dev/null +++ b/web/lib/auth/permissions.ts @@ -0,0 +1,57 @@ +/** + * Rechte-Enum aus docs/03-auth-und-rechte.md. RoleMapping.permissions ist in der + * Datenbank ein String[], diese Liste ist die verbindliche Menge gültiger Werte + * und die Grundlage der Kästchen im Adminbereich. + */ +export const PERMISSIONS = [ + 'case.read', + 'case.create', + 'case.edit', + 'case.close', + 'case.reopen', + 'case.delete', + 'case.edit_closed', + 'entry.create', + 'entry.correct', + 'entry.edit_own', + 'entry.edit_any', + 'entry.retract', + 'personnel.read', + 'personnel.edit', + 'template.manage', + 'roles.manage', + 'audit.read', + 'export.approve', + 'admin', +] as const + +export type Permission = (typeof PERMISSIONS)[number] + +/** + * Diese drei sind im Auslieferungszustand keiner Rolle zugeordnet. Der Leiter + * schaltet sie bewusst frei. Der Adminbereich weist beim Zuweisen darauf hin. + */ +export const OPT_IN_PERMISSIONS: readonly Permission[] = [ + 'entry.edit_own', + 'entry.edit_any', + 'entry.retract', +] + +export function isPermission(value: string): value is Permission { + return (PERMISSIONS as readonly string[]).includes(value) +} + +/** Aufgelöste Rechte eines Nutzers für genau einen Request. */ +export type EffectivePermissions = { + userId: string + /** Höchste Stufe aller Rollen. */ + clearanceLevel: number + /** Vereinigung aller Rollen. */ + permissions: Set + /** Aus BOOTSTRAP_ADMIN_IDS oder Recht 'admin'. */ + isAdmin: boolean +} + +export function can(p: EffectivePermissions, permission: Permission): boolean { + return p.isAdmin || p.permissions.has(permission) +} diff --git a/web/lib/db.ts b/web/lib/db.ts new file mode 100644 index 0000000..e4f63c1 --- /dev/null +++ b/web/lib/db.ts @@ -0,0 +1,14 @@ +import { createPrismaClient, type PrismaClient } from '@afis/db' + +/** + * Ein Client pro Prozess. Im Dev-Server ueberlebt er den Hot Reload ueber + * globalThis, sonst reisst jede Aenderung eine neue Verbindung auf. + * Der Pool liegt im Betrieb hinter pgbouncer im Transaktionsmodus. + */ +const globalForPrisma = globalThis as unknown as { afisPrisma?: PrismaClient } + +export const db: PrismaClient = globalForPrisma.afisPrisma ?? createPrismaClient() + +if (process.env.NODE_ENV !== 'production') { + globalForPrisma.afisPrisma = db +} diff --git a/web/lib/env.ts b/web/lib/env.ts new file mode 100644 index 0000000..23a7dd7 --- /dev/null +++ b/web/lib/env.ts @@ -0,0 +1,56 @@ +import { z } from 'zod' + +/** + * Umgebungsvariablen werden beim Start einmal geprueft. Fehlt etwas, soll der + * Container sofort und mit klarer Meldung sterben statt spaeter beim ersten + * Request. Die Werte stehen im .env-Reiter von Dockge, Vorlage ist .env.example. + */ +const schema = z.object({ + NODE_ENV: z.enum(['development', 'test', 'production']).default('development'), + + DATABASE_URL: z.string().min(1), + DIRECT_DATABASE_URL: z.string().min(1).optional(), + + APP_URL: z.url(), + AUTH_SECRET: z.string().min(32), + + DISCORD_CLIENT_ID: z.string().min(1), + DISCORD_CLIENT_SECRET: z.string().min(1), + DISCORD_BOT_TOKEN: z.string().min(1), + DISCORD_GUILD_ID: z.string().min(1), + + /// Notfallzugang. Diese Discord-IDs haben immer Stufe 5 und alle Rechte, + /// unabhaengig vom Rollen-Mapping. Siehe docs/03-auth-und-rechte.md. + BOOTSTRAP_ADMIN_IDS: z + .string() + .default('') + .transform((v) => v.split(',').map((s) => s.trim()).filter(Boolean)), + + FILES_DIR: z.string().default('/data/files'), + CLAMAV_SOCKET: z.string().default('/var/run/clamav/clamd.sock'), + PDF_SERVICE_URL: z.url().optional(), + + TZ: z.string().default('Europe/Berlin'), +}) + +export type Env = z.infer + +let cached: Env | null = null + +export function getEnv(): Env { + if (cached) return cached + const parsed = schema.safeParse(process.env) + if (!parsed.success) { + const missing = parsed.error.issues + .map((i) => `${i.path.join('.')}: ${i.message}`) + .join('\n ') + throw new Error(`Konfiguration unvollständig:\n ${missing}`) + } + cached = parsed.data + return cached +} + +/** Nur fuer Tests, damit eine geaenderte Umgebung neu gelesen wird. */ +export function resetEnvCache(): void { + cached = null +} diff --git a/web/lib/health/check.ts b/web/lib/health/check.ts new file mode 100644 index 0000000..cde47c5 --- /dev/null +++ b/web/lib/health/check.ts @@ -0,0 +1,77 @@ +import { db } from '@/lib/db' +import { getEnv } from '@/lib/env' +import { pingClamav } from '@/lib/health/clamav' + +export type ComponentState = 'up' | 'degraded' | 'down' + +export type HealthReport = { + status: ComponentState + checkedAt: string + components: Record<'database' | 'discordGateway' | 'clamav', { + status: ComponentState + detail?: string + }> +} + +/** Der Worker gilt als abgehaengt, wenn sein Lebenszeichen aelter ist. */ +const HEARTBEAT_MAX_AGE_MS = 3 * 60_000 + +async function checkDatabase(): Promise<{ status: ComponentState; detail?: string }> { + try { + await db.$queryRaw`SELECT 1` + return { status: 'up' } + } catch (error) { + return { status: 'down', detail: error instanceof Error ? error.message : 'unbekannt' } + } +} + +async function checkDiscordGateway(): Promise<{ status: ComponentState; detail?: string }> { + try { + const beat = await db.serviceHeartbeat.findUnique({ where: { service: 'worker' } }) + if (!beat) return { status: 'down', detail: 'kein Lebenszeichen' } + + const ageMs = Date.now() - beat.at.getTime() + if (ageMs > HEARTBEAT_MAX_AGE_MS) { + return { status: 'down', detail: `Lebenszeichen ${Math.round(ageMs / 1000)} s alt` } + } + if (beat.status !== 'up') { + return { status: beat.status === 'degraded' ? 'degraded' : 'down', detail: beat.detail ?? undefined } + } + return { status: 'up' } + } catch { + return { status: 'down', detail: 'nicht abfragbar' } + } +} + +async function checkClamav(): Promise<{ status: ComponentState; detail?: string }> { + const ok = await pingClamav(getEnv().CLAMAV_SOCKET) + return ok ? { status: 'up' } : { status: 'down', detail: 'clamd antwortet nicht' } +} + +/** + * Sammelt den Zustand der drei Abhaengigkeiten. Die Gesamtbewertung faellt + * bewusst nur auf `down`, wenn die Datenbank weg ist: Worker, clamav und pdf + * haben eigene Healthchecks im Stack, und ein ausgefallener Virenscanner soll + * nicht den ganzen Web-Container als tot markieren. Sichtbar bleibt der Ausfall + * trotzdem, in dieser Antwort und in Dockge am jeweiligen Dienst. + */ +export async function collectHealth(): Promise { + const [database, discordGateway, clamav] = await Promise.all([ + checkDatabase(), + checkDiscordGateway(), + checkClamav(), + ]) + + const status: ComponentState = + database.status === 'down' + ? 'down' + : discordGateway.status === 'up' && clamav.status === 'up' + ? 'up' + : 'degraded' + + return { + status, + checkedAt: new Date().toISOString(), + components: { database, discordGateway, clamav }, + } +} diff --git a/web/lib/health/clamav.ts b/web/lib/health/clamav.ts new file mode 100644 index 0000000..8ad1e07 --- /dev/null +++ b/web/lib/health/clamav.ts @@ -0,0 +1,24 @@ +import net from 'node:net' + +/** + * Fragt clamd ueber den Unix-Socket. Der Socket liegt im geteilten Volume + * clamav_socket, siehe compose.yaml. Antwort auf zPING ist "PONG". + */ +export function pingClamav(socketPath: string, timeoutMs = 2000): Promise { + return new Promise((resolve) => { + let settled = false + const done = (ok: boolean) => { + if (settled) return + settled = true + socket.destroy() + resolve(ok) + } + + const socket = net.createConnection(socketPath) + socket.setTimeout(timeoutMs) + socket.on('connect', () => socket.write('zPING\0')) + socket.on('data', (chunk) => done(chunk.toString().includes('PONG'))) + socket.on('timeout', () => done(false)) + socket.on('error', () => done(false)) + }) +} diff --git a/web/lib/i18n/de.ts b/web/lib/i18n/de.ts new file mode 100644 index 0000000..3804fed --- /dev/null +++ b/web/lib/i18n/de.ts @@ -0,0 +1,160 @@ +/** + * Alle Oberflaechentexte. Nie deutsche Strings hart ins JSX, siehe CLAUDE.md. + * Die Begriffe folgen dem Glossar in docs/01-produkt.md. + * + * Schreibweise nach docs/10-design-system.md: + * - Aktive Verben, die sagen, was passiert: "Vermerk speichern", nicht "Absenden" + * - Dieselbe Bezeichnung durch den ganzen Ablauf + * - Fehler nennen Ursache und naechsten Schritt, ohne Entschuldigung + * - Leere Zustaende sind eine Aufforderung + * - Keine Ausrufezeichen, kein "bitte", kein "erfolgreich" + */ +export const de = { + app: { + name: 'AfiS-Aktensystem', + shortName: 'AfiS', + description: 'Fallakten, Personalakten und Ermittlungen der Abteilung für innere Sicherheit', + }, + + nav: { + dashboard: 'Übersicht', + cases: 'Fallakten', + personnel: 'Personalakten', + search: 'Suche', + admin: 'Verwaltung', + skipToContent: 'Zum Inhalt springen', + }, + + auth: { + signIn: 'Mit Discord anmelden', + signOut: 'Abmelden', + signedInAs: 'Angemeldet als', + notInGuild: { + title: 'Du bist nicht auf dem AfiS-Discord', + body: 'Die Anmeldung setzt eine Mitgliedschaft auf dem Discord-Server voraus. Wende dich an die Abteilungsleitung.', + }, + sessionEnded: { + title: 'Sitzung beendet', + body: 'Deine Rollen haben sich geändert. Melde dich neu an.', + }, + error: { + title: 'Anmeldung nicht möglich', + body: 'Der Anmeldevorgang wurde abgebrochen. Erneut versuchen.', + }, + }, + + clearance: { + label: 'Freigabestufe', + classification: 'Klassifizierung', + level: (n: number) => `Stufe ${n}`, + names: { + 0: 'Offen', + 1: 'Intern', + 2: 'Vertraulich', + 3: 'Geheim', + 4: 'Streng geheim', + 5: 'Leitungssache', + } as Record, + locked: 'Inhalt gesperrt', + lockedHint: (n: number) => `Sichtbar ab Stufe ${n}`, + redacted: 'Geschwärzt', + redactedHint: (n: number) => `Geschwärzt, ab Stufe ${n} sichtbar`, + }, + + case: { + one: 'Fallakte', + many: 'Fallakten', + number: 'Aktenzeichen', + title: 'Titel', + type: 'Fallart', + status: 'Status', + dueAt: 'Wiedervorlage', + outcome: 'Ergebnis', + createdBy: 'Angelegt von', + timeline: 'Verlauf', + sections: 'Abschnitte', + chat: 'Aktenchat', + changes: 'Änderungen', + participants: 'Beteiligte', + links: 'Verknüpfungen', + attachments: 'Anhänge', + empty: 'Noch keine Fallakte. Erste Fallakte anlegen.', + statusNames: { + DRAFT: 'Entwurf', + OPEN: 'Offen', + DORMANT: 'Ruhend', + REVIEW: 'In Prüfung', + CLOSED: 'Abgeschlossen', + ARCHIVED: 'Archiviert', + SEALED: 'Versiegelt', + } as Record, + }, + + entry: { + one: 'Vermerk', + many: 'Vermerke', + create: 'Vermerk speichern', + empty: 'Noch kein Vermerk. Ersten Vermerk anlegen.', + edited: (v: number) => `bearbeitet · v${v}`, + history: 'Änderungsverlauf', + changeReason: 'Begründung', + retracted: (date: string, person: string, reason: string) => + `Eintrag zurückgezogen am ${date} durch ${person} · Begründung: ${reason}`, + types: { + NOTE: 'Vermerk', + INTERROGATION: 'Befragung', + EVIDENCE: 'Beweismittel', + STATUS_CHANGE: 'Statuswechsel', + CORRECTION: 'Korrektur', + SYSTEM: 'System', + } as Record, + }, + + personnel: { + one: 'Personalakte', + many: 'Personalakten', + serviceNumber: 'Dienstnummer', + rank: 'Dienstgrad', + department: 'Abteilung', + empty: 'Noch keine Personalakte. Erste Personalakte anlegen.', + }, + + common: { + save: 'Speichern', + cancel: 'Abbrechen', + undo: 'Rückgängig', + retry: 'Erneut versuchen', + loading: 'Wird geladen', + offline: 'Keine Verbindung, wird nachgesendet', + unknown: 'Unbekannt', + }, + + errors: { + notFound: { + title: 'Nicht gefunden', + body: 'Die Seite gibt es nicht, oder du darfst sie nicht sehen.', + }, + unexpected: { + title: 'Nicht geladen', + body: 'Der Abruf ist fehlgeschlagen. Erneut versuchen.', + }, + conflict: 'Nicht gespeichert, die Akte wurde zwischenzeitlich geändert. Fassungen vergleichen.', + }, + + health: { + heading: 'Systemzustand', + service: 'Dienst', + state: 'Zustand', + checkedAt: (when: string) => `Zustand der Dienste, abgefragt ${when}`, + ok: 'Betriebsbereit', + degraded: 'Eingeschränkt', + down: 'Gestört', + components: { + database: 'Datenbank', + discordGateway: 'Discord-Gateway', + clamav: 'Virenprüfung', + } as Record, + }, +} as const + +export type Messages = typeof de diff --git a/web/middleware.ts b/web/middleware.ts new file mode 100644 index 0000000..89b283d --- /dev/null +++ b/web/middleware.ts @@ -0,0 +1,51 @@ +import { NextResponse, type NextRequest } from 'next/server' + +/** + * Strikte CSP mit Nonce. Kein 'unsafe-inline' fuer Skripte, siehe + * docs/07-dateien-und-sicherheit.md. Next.js liest die CSP aus dem Request und + * haengt den Nonce an seine eigenen Skript-Tags. + * + * Im Dev-Server braucht der React Refresh Runtime 'unsafe-eval'. + */ +export function middleware(request: NextRequest): NextResponse { + const nonce = btoa(crypto.randomUUID()) + const isDev = process.env.NODE_ENV === 'development' + + const csp = [ + `default-src 'self'`, + `script-src 'self' 'nonce-${nonce}' 'strict-dynamic'${isDev ? " 'unsafe-eval'" : ''}`, + // Tailwind erzeugt zur Laufzeit keine Styles, aber Next setzt inline-Styles + // fuer den Bildplatzhalter. Style-Nonces unterstuetzt Next nicht. + `style-src 'self' 'unsafe-inline'`, + `img-src 'self' blob: data:`, + `font-src 'self'`, + // Der SSE-Endpunkt laeuft ueber dieselbe Herkunft. + `connect-src 'self'`, + `object-src 'none'`, + `base-uri 'none'`, + `form-action 'self'`, + `frame-ancestors 'none'`, + `upgrade-insecure-requests`, + ].join('; ') + + const headers = new Headers(request.headers) + headers.set('x-nonce', nonce) + headers.set('content-security-policy', csp) + + const response = NextResponse.next({ request: { headers } }) + response.headers.set('content-security-policy', csp) + return response +} + +export const config = { + matcher: [ + // Statische Assets und Bild-Optimierung brauchen keine CSP-Berechnung. + { + source: '/((?!_next/static|_next/image|fonts|favicon.ico).*)', + missing: [ + { type: 'header', key: 'next-router-prefetch' }, + { type: 'header', key: 'purpose', value: 'prefetch' }, + ], + }, + ], +} diff --git a/web/next-env.d.ts b/web/next-env.d.ts new file mode 100644 index 0000000..830fb59 --- /dev/null +++ b/web/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/web/next.config.ts b/web/next.config.ts new file mode 100644 index 0000000..08f83af --- /dev/null +++ b/web/next.config.ts @@ -0,0 +1,51 @@ +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import type { NextConfig } from 'next' +import bundleAnalyzer from '@next/bundle-analyzer' + +const withBundleAnalyzer = bundleAnalyzer({ enabled: process.env.ANALYZE === 'true' }) + +const nextConfig: NextConfig = { + // Standalone-Build fuer das Container-Image, siehe docker/web.Dockerfile. + output: 'standalone', + // fileURLToPath statt URL.pathname: der Projektpfad enthält ein Leerzeichen, + // das pathname als %20 stehen ließe. Der Standalone-Build landete dadurch in + // einem falsch benannten Unterordner. + outputFileTracingRoot: path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'), + + reactStrictMode: true, + poweredByHeader: false, + + // Der Cloudflare Tunnel komprimiert, im Stack ist dafuer nichts zu tun. + compress: false, + + experimental: { + // Autoren-, Rollen- und Vorlagendaten werden prozesslokal gecacht, + // siehe docs/09-performance-und-ux.md. + staleTimes: { dynamic: 30, static: 180 }, + }, + + async headers() { + return [ + { + source: '/:path*', + headers: [ + { key: 'X-Content-Type-Options', value: 'nosniff' }, + { key: 'Referrer-Policy', value: 'same-origin' }, + { key: 'X-Frame-Options', value: 'DENY' }, + { + key: 'Permissions-Policy', + value: 'camera=(), microphone=(), geolocation=(), interest-cohort=()', + }, + ], + }, + { + // Selbst gehostete Schriften sind unveraenderlich. + source: '/fonts/:file*', + headers: [{ key: 'Cache-Control', value: 'public, max-age=31536000, immutable' }], + }, + ] + }, +} + +export default withBundleAnalyzer(nextConfig) diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..f54fdd3 --- /dev/null +++ b/web/package.json @@ -0,0 +1,48 @@ +{ + "name": "@afis/web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint app lib components tests --max-warnings 0", + "typecheck": "tsc --noEmit", + "test": "vitest run", + "test:watch": "vitest", + "test:e2e": "playwright test", + "analyze": "ANALYZE=true next build" + }, + "dependencies": { + "@afis/db": "workspace:*", + "next": "15.5.25", + "next-auth": "5.0.0-beta.32", + "pg": "8.13.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "uuidv7": "1.0.2", + "zod": "^4.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.2.0", + "@fontsource/ibm-plex-mono": "^5.0.0", + "@fontsource/ibm-plex-sans": "^5.0.0", + "@fontsource/ibm-plex-sans-condensed": "^5.0.0", + "@next/bundle-analyzer": "15.5.25", + "@playwright/test": "1.62.1", + "@tailwindcss/postcss": "4.3.3", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.1.0", + "@types/node": "^22.10.0", + "@types/pg": "^8.11.10", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@vitejs/plugin-react": "^5.0.0", + "eslint": "9.39.5", + "eslint-config-next": "15.5.25", + "jsdom": "^25.0.1", + "tailwindcss": "4.3.3", + "typescript": "5.9.3", + "vitest": "4.1.11" + } +} diff --git a/web/playwright.config.ts b/web/playwright.config.ts new file mode 100644 index 0000000..c9f34e6 --- /dev/null +++ b/web/playwright.config.ts @@ -0,0 +1,32 @@ +import { defineConfig, devices } from '@playwright/test' + +const PORT = Number(process.env.E2E_PORT ?? 3100) +const baseURL = process.env.E2E_BASE_URL ?? `http://127.0.0.1:${PORT}` + +export default defineConfig({ + testDir: './e2e', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 1 : 0, + reporter: process.env.CI ? [['github'], ['html', { open: 'never' }]] : 'list', + use: { + baseURL, + locale: 'de-DE', + timezoneId: 'Europe/Berlin', + trace: 'on-first-retry', + }, + projects: [ + { name: 'chromium', use: { ...devices['Desktop Chrome'] } }, + { name: 'mobil', use: { ...devices['Pixel 7'] } }, + ], + webServer: process.env.E2E_BASE_URL + ? undefined + : { + // Derselbe Standalone-Server, den auch das Container-Image startet. + command: `pnpm build && node .next/standalone/web/server.js`, + url: `${baseURL}/api/health`, + reuseExistingServer: !process.env.CI, + timeout: 180_000, + env: { PORT: String(PORT), HOSTNAME: '127.0.0.1' }, + }, +}) diff --git a/web/postcss.config.mjs b/web/postcss.config.mjs new file mode 100644 index 0000000..a7f73a2 --- /dev/null +++ b/web/postcss.config.mjs @@ -0,0 +1,5 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + }, +} diff --git a/web/public/fonts/ibm-plex-mono-latin-400-normal.woff2 b/web/public/fonts/ibm-plex-mono-latin-400-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0804aaff92260b5359330f63e05b9ac25ccabeee GIT binary patch literal 14708 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 literal 0 HcmV?d00001 diff --git a/web/public/fonts/ibm-plex-sans-condensed-latin-500-normal.woff2 b/web/public/fonts/ibm-plex-sans-condensed-latin-500-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cae454121bab6dccf51a341923c24801eef25f1b GIT binary patch literal 19952 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 literal 0 HcmV?d00001 diff --git a/web/public/fonts/ibm-plex-sans-latin-400-normal.woff2 b/web/public/fonts/ibm-plex-sans-latin-400-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f0ee65dd7f3ed64dc8d674e5c6007a0e7761bd57 GIT binary patch literal 22588 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 R;$T5nL-p?z%LdxSxC2frlW_n5 literal 0 HcmV?d00001 diff --git a/web/public/fonts/ibm-plex-sans-latin-500-normal.woff2 b/web/public/fonts/ibm-plex-sans-latin-500-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6d5527eef47ace16b08cf9932050b83858995e62 GIT binary patch literal 24184 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 azH?yRNXU$pW66TQU)?kJE_oIi5P}vc)!xGZ literal 0 HcmV?d00001 diff --git a/web/public/fonts/ibm-plex-sans-latin-ext-500-normal.woff2 b/web/public/fonts/ibm-plex-sans-latin-ext-500-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6b51734ca52aaf6f69284f0fbee036a63d0cbdeb GIT binary patch literal 16456 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 { + it('enthaelt die Grundpalette aus dem Design-System', () => { + for (const hex of ['#15181a', '#1d2124', '#262b2f', '#3a4147', '#e4e7e4', '#939c99', '#7a97a6']) { + expect(css).toContain(hex) + } + }) + + it('enthaelt alle sechs Klassifizierungsfarben', () => { + for (const hex of ['#8a918d', '#6d8a9c', '#4e8f72', '#b08637', '#b4543c', '#7e5e96']) { + expect(css).toContain(hex) + } + }) + + it('setzt den Eckenradius durchgehend auf 2 px', () => { + const radii = [...css.matchAll(/--radius-[\w-]+:\s*([^;]+);/g)].map((m) => m[1]!.trim()) + expect(radii.length).toBeGreaterThan(0) + for (const value of radii) expect(['0px', '2px']).toContain(value) + }) + + it('kennt keine Schatten ausser dem Fokusring', () => { + const shadows = [...css.matchAll(/--shadow-[\w-]+:\s*([^;]+);/g)].map((m) => m[1]!.trim()) + expect(shadows.length).toBeGreaterThan(0) + for (const value of shadows) expect(value).toBe('none') + }) + + it('respektiert prefers-reduced-motion bei der Schwaerzung', () => { + expect(css).toMatch(/@media \(prefers-reduced-motion: reduce\)/) + }) +}) diff --git a/web/tests/health.test.ts b/web/tests/health.test.ts new file mode 100644 index 0000000..eb6d208 --- /dev/null +++ b/web/tests/health.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, it, vi } from 'vitest' + +vi.mock('@/lib/db', () => ({ + db: { + $queryRaw: vi.fn(async () => [{ '?column?': 1 }]), + serviceHeartbeat: { findUnique: vi.fn(async () => ({ service: 'worker', status: 'up', detail: null, at: new Date() })) }, + }, +})) + +vi.mock('@/lib/env', () => ({ + getEnv: () => ({ CLAMAV_SOCKET: '/var/run/clamav/clamd.sock' }), +})) + +vi.mock('@/lib/health/clamav', () => ({ pingClamav: vi.fn(async () => true) })) + +describe('collectHealth', () => { + it('meldet betriebsbereit, wenn alle drei Abhaengigkeiten antworten', async () => { + const { collectHealth } = await import('@/lib/health/check') + const report = await collectHealth() + expect(report.status).toBe('up') + expect(report.components.database.status).toBe('up') + expect(report.components.discordGateway.status).toBe('up') + expect(report.components.clamav.status).toBe('up') + }) + + it('bleibt nur eingeschraenkt, wenn allein die Virenpruefung ausfaellt', async () => { + const clamav = await import('@/lib/health/clamav') + vi.mocked(clamav.pingClamav).mockResolvedValueOnce(false) + const { collectHealth } = await import('@/lib/health/check') + const report = await collectHealth() + expect(report.status).toBe('degraded') + }) +}) diff --git a/web/tests/i18n.test.ts b/web/tests/i18n.test.ts new file mode 100644 index 0000000..0283390 --- /dev/null +++ b/web/tests/i18n.test.ts @@ -0,0 +1,47 @@ +import { describe, expect, it } from 'vitest' +import { readFileSync, readdirSync, statSync } from 'node:fs' +import { join } from 'node:path' +import { de } from '@/lib/i18n/de' + +describe('Sprachkonvention', () => { + it('kennt alle sechs Freigabestufen', () => { + for (let level = 0; level <= 5; level++) { + expect(de.clearance.names[level]).toBeTypeOf('string') + } + expect(de.clearance.names[3]).toBe('Geheim') + }) + + it('verzichtet auf Ausrufezeichen und Entschuldigungen', () => { + const flat = JSON.stringify(de) + expect(flat).not.toMatch(/!/) + expect(flat.toLowerCase()).not.toMatch(/erfolgreich|entschuldigung/) + }) + + it('haelt deutsche Oberflaechentexte aus dem JSX heraus', () => { + // Umlaute und Eszett sind der billigste verlaessliche Marker fuer einen + // deutschen Text. Alles Sichtbare gehoert nach lib/i18n/de.ts, siehe CLAUDE.md. + const offenders: string[] = [] + const roots = ['app', 'components'] + + function walk(dir: string) { + for (const name of readdirSync(dir)) { + const path = join(dir, name) + if (statSync(path).isDirectory()) { + walk(path) + continue + } + if (!name.endsWith('.tsx')) continue + const source = readFileSync(path, 'utf8') + for (const [index, line] of source.split('\n').entries()) { + const withoutComments = line.replace(/\/\/.*$/, '').replace(/\/\*.*?\*\//g, '') + if (/[äöüÄÖÜß]/.test(withoutComments)) { + offenders.push(`${path}:${index + 1}`) + } + } + } + } + + for (const root of roots) walk(join(process.cwd(), root)) + expect(offenders).toEqual([]) + }) +}) diff --git a/web/tests/setup.ts b/web/tests/setup.ts new file mode 100644 index 0000000..92fc0e5 --- /dev/null +++ b/web/tests/setup.ts @@ -0,0 +1,3 @@ +import '@testing-library/dom' + +process.env.TZ = 'Europe/Berlin' diff --git a/web/tsconfig.json b/web/tsconfig.json new file mode 100644 index 0000000..503406d --- /dev/null +++ b/web/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2023"], + "jsx": "preserve", + "moduleResolution": "Bundler", + "allowJs": true, + "incremental": true, + "plugins": [{ "name": "next" }], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules", "e2e"] +} diff --git a/web/vitest.config.mts b/web/vitest.config.mts new file mode 100644 index 0000000..bc50411 --- /dev/null +++ b/web/vitest.config.mts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vitest/config' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], + resolve: { tsconfigPaths: true }, + test: { + environment: 'jsdom', + globals: true, + include: ['tests/**/*.test.{ts,tsx}'], + setupFiles: ['./tests/setup.ts'], + }, +})