Commit Graph

4 Commits

Author SHA1 Message Date
Matthias Hochmeister
2e56a92b70 fix(tests): Coverage-Pruefung lauffaehig machen und Drift-Allowlist haerten
BLOCKING-Befunde aus "Tests & Sicherheitshaertung":

1) Coverage-Pfad war nie ausfuehrbar: @vitest/coverage-v8 fehlte in den
   devDependencies, obwohl vitest.config coverage.provider "v8" setzt und
   test:coverage "vitest run --coverage" aufruft. Paket passend zu vitest
   ^3.2 ergaenzt und installiert. coverage.include zog ganze Verzeichnisse
   (src/lib/search, src/lib/geo) ein - inkl. DB-/HTTP-gebundener Wrapper
   (Drizzle gegen Postgres, Nominatim/OSRM), die offline nicht laufen und
   die globale Schwelle verwaesserten. Scope auf die REINE, offline
   testbare Logik beschraenkt (perFile-Schwellen), I/O-Wrapper und reine
   Typ-Module ausgenommen (per Integrations-/E2E-Tests abgesichert).
   Fehlende Branch-Abdeckung in geo/eintreffzeit.ts mit Tests fuer
   Einzel-Haversine-Fallback, reine Koordinaten-lose Liste und fehlende
   OSRM-distances-Zeile geschlossen. npm run test:coverage: Exit 0,
   Schwellen (Lines/Stmts/Funcs >=90, Branches >=80) erfuellt.

2) Driftschutz zu permissiv: isPublic() in tests/support/route-scan.ts
   stufte ueber `route.startsWith(p)` jeden reinen String-Praefix als
   oeffentlich ein (z. B. /loginhelp, /api/healthz, /api/authentication)
   und liess solche Routen dem Auth-Gating-Driftcheck entkommen. Die
   redundante dritte Bedingung entfernt; exakter Treffer und echtes
   Unterpfad-Segment (p + "/") sind korrekt und ausreichend. Negativ-
   Testfall ergaenzt.

Verifiziert (offline): tsc --noEmit (0), vitest run (233 passed,
7 DB-Tests deferred), test:coverage (Exit 0). DB-/Server-/Browser-
abhaengige Schritte deferred (kein Postgres/Server im Sandbox).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 14:42:25 +02:00
Matthias Hochmeister
9927711192 fix(deploy): vollständige pg-Closure + funktionierender RUN_SEED im Runner-Image
Zwei BLOCKING-Befunde für "Deployment (Docker + externes Traefik)":

1) pg-Laufzeit-Closure unvollständig: pg-types/lib/binaryParsers.js macht
   eager require('pg-int8'), postgres-interval/index.js require('xtend/mutable').
   Beide lagen NICHT im Runner-Image -> node docker/migrate.mjs crasht beim
   Container-Start mit ERR_MODULE_NOT_FOUND, Deploy kaputt. Fix: COPY für
   pg-int8 + xtend ergänzt. Neuer Test berechnet die reale Closure aus
   node_modules und schlägt fehl, sobald ein Paket nicht ins Image kopiert
   wird (schützt vor erneutem Brechen bei pg/drizzle-Updates).

2) RUN_SEED toter Pfad: entrypoint.sh rief docker/seed.mjs auf, das nie
   existierte -> RUN_SEED=true no-opte still zu leerem Katalog. Fix:
   scripts/build-seed-bundle.mjs bündelt src/db/seed (inkl. Schema + Daten,
   pg/drizzle-orm extern) per esbuild zu selbstständigem docker/seed.mjs;
   im builder erzeugt und ins Runner-Image kopiert. entrypoint.sh bricht
   jetzt laut ab, wenn RUN_SEED=true und das Bundle fehlt, statt still zu
   überspringen. docker/seed.mjs ist generiert -> gitignored.

Verifiziert offline: tsc --noEmit, vitest (deployment + seed-Daten, 36 grün),
Bundle baut + lädt sauber (externe Imports nur pg/drizzle-orm, exit 1 ohne
DATABASE_URL). docker build/run sind im Sandbox deferred (kein Docker/Postgres).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 12:54:59 +02:00
Matthias Hochmeister
4707844dbc Workstream 1: Projekt-Fundament & Design-System (Phase 0)
Greenfield-Next.js-15-App-Router-Gerüst (TS strict) mit:
- Route-Groups (auth)/(app) inkl. loading/error/not-found je Group;
  Guard-Slot-Kommentar im (app)/layout.tsx (vom Auth-WS zu füllen).
- "Amtlich"/Netzknoten-Designsystem: Tailwind-Tokens (Navy #1B3A5B,
  Signalrot #E2231A, Anthrazit, Nebelgrau, bereit/Wartung), tabular-nums,
  Serif-Display/Inter-Sans via CSS-Variablen, Inline-SVG-Logo.
- Radix-Basiskomponenten (button/input/label/badge/tabs/dialog/select/
  switch/slider); StatusBadge entspricht asset_status.
- Kanonisches src/lib/env.ts (Zod, Fail-Fast) mit ALLEN DB-/Auth-/Geo-Slots
  inkl. AUTH_URL; isHttps-Ableitung. Zentrale i18n-Tabelle de.ts + t().
- Drizzle-Setup: client.ts (Pool-Singleton), leeres schema/index.ts-Barrel
  (KEIN Migrations-Eigentümer), drizzle.config.ts, .env.example.
- next.config.ts: output:standalone, experimental.authInterrupts,
  Security-Header. Vitest + Fail-Fast-Env-Test (TDD, 5/5 grün).

Bewusst KEINE Auth-Logik und KEINE fachlichen Tabellen.

Verifikation: typecheck/lint/test grün; npm run build erzeugt
.next/standalone/server.js; curl /anmelden -> lang="de" + FlorianNetz.
next/font/google durch CSS-Variablen ersetzt (air-gapped-Build).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 16:57:01 +02:00
Claude
f9e045ebed Add FlorianNetz design specification
Login-only mutual-aid platform for Austrian volunteer fire brigades to
list vehicles/equipment, searchable by other brigades and sorted by
fastest-arriving (drive-time ETA). Next.js + PostgreSQL/Drizzle + Auth.js
(Authentik OIDC + local argon2id), dynamic admin-curated Merkmal system,
self-hosted OSRM/Nominatim, Docker Compose behind external Traefik.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 14:11:50 +02:00