No description
  • TypeScript 80.4%
  • Svelte 14.5%
  • JavaScript 4%
  • CSS 0.8%
  • FreeMarker 0.2%
Find a file
Robin Franke 61445571dd
All checks were successful
CI Frontend / lint-frontend (pull_request) Has been skipped
CI Meta / conventional-commit (pull_request) Has been skipped
CI Frontend / test-frontend (pull_request) Has been skipped
E2E / e2e (pull_request) Has been skipped
CI Backend / lint-backend (pull_request) Has been skipped
CI Backend / test-backend (pull_request) Has been skipped
CI Backend / lint-backend (push) Successful in 56s
CI Frontend / lint-frontend (push) Successful in 1m16s
CI Meta / conventional-commit (push) Has been skipped
CI Backend / test-backend (push) Successful in 3m49s
CI Frontend / test-frontend (push) Successful in 1m58s
CD / build-and-push (push) Successful in 2m23s
feat(frontend): add import/export UI, i18n, BFF proxy fix, E2E tests (#296)
refs #15

Frontend:
- Import dialog (5 steps: Upload, Parse, Preview, Submit, Result)
- Export buttons (JSON + CSV) with archived-filter passthrough
- Example file popup with copy-to-clipboard
- i18n texts (de + en) for import/export flow
- t() function extended with params interpolation
- Toast component gains optional testId prop
- BFF proxy preserves original Content-Type header
- tick() between state updates to prevent Svelte 5 race condition
- Non-2xx HTTP responses handled with error details

E2E:
- 3 isolated spec files (export, import-csv, import-json)
- 10 test fixture files for manual validation
- test-coverage.json updated
2026-07-11 21:58:57 +02:00
.gitea chore(infra): CI-Workflows bei Draft-PRs skippen + .gitattributes fuer konsistente Line-Endings (#291) 2026-07-10 11:49:10 +02:00
.husky ci(root): husky-pre-commit + Lint im Integrationstest 2026-06-26 19:41:32 +02:00
.opencode refactor(frontend): zentrale Test-Infrastruktur + Component-Rendering-Tests + Coverage (#269) 2026-07-08 19:46:04 +02:00
backend feat(backend): add mass import/export with all-or-nothing transaction (#296) 2026-07-11 21:58:40 +02:00
docs feat(backend): add mass import/export with all-or-nothing transaction (#296) 2026-07-11 21:58:40 +02:00
e2e feat(frontend): add import/export UI, i18n, BFF proxy fix, E2E tests (#296) 2026-07-11 21:58:57 +02:00
frontend feat(frontend): add import/export UI, i18n, BFF proxy fix, E2E tests (#296) 2026-07-11 21:58:57 +02:00
keycloak feat(infra): add Dockerfiles and update compose for unified build 2026-07-04 15:00:29 +02:00
scripts chore: add postinstall cascade and restructure commit layout 2026-07-10 00:22:11 +02:00
shared/design-tokens fix(keycloak): Hintergrundfarbe an Landingpage angeglichen 2026-06-28 12:09:47 +02:00
.env.example fix(infra): make BACKEND_ORIGIN dynamic, update .env.example 2026-07-04 16:25:01 +02:00
.gitattributes chore(infra): CI-Workflows bei Draft-PRs skippen + .gitattributes fuer konsistente Line-Endings (#291) 2026-07-10 11:49:10 +02:00
.gitignore chore: .worktrees/ zu .gitignore hinzugefuegt 2026-07-08 18:38:43 +02:00
.nvmrc chore(backend,frontend): upgrade node to 24 LTS (Krypton) 2026-07-02 19:09:38 +02:00
.prettierignore feat: ESLint (flat config) + Prettier implementiert 2026-06-26 15:23:31 +02:00
.prettierrc feat: ESLint (flat config) + Prettier implementiert 2026-06-26 15:23:31 +02:00
AGENTS.md feat(backend): User-Locale bei KC-User-Create setzen (locale=de) (#295) 2026-07-11 14:09:49 +02:00
docker-compose.yml fix(cicd): E2E-CI ohne Port-Konflikte, PR-Checks immer, strip-ports.mjs, run-rm (#238) 2026-07-05 20:51:56 +02:00
lint-staged.config.js feat(e2e): Phase 2 Vollausbau + testid-Pflicht in allen Templates 2026-07-05 00:53:07 +02:00
logo.svg refactor(brand): Hexagon-Logo mit Doppelrand, Schatten und gebogenem Text 2026-07-01 22:19:54 +02:00
package-lock.json chore(infra): Backend-Docker-Image von unnoetigen Dateien befreien (#276) 2026-07-08 23:52:07 +02:00
package.json chore: add postinstall cascade and restructure commit layout 2026-07-10 00:22:11 +02:00
projektstatistik-events.json chore(doc): reworded Zentrale Identitaet 2026-07-05 13:40:39 +02:00
README.md feat(backend): User-Locale bei KC-User-Create setzen (locale=de) (#295) 2026-07-11 14:09:49 +02:00

FamilienFeierPlaner

Personen-, Kontakt- und Event-Management-System (Gaesteliste & Zahlungsabgleich).

Architektur

  • Frontend — SvelteKit (BFF via adapter-cloudflare, Fallback adapter-node) + shadcn-svelte + Tailwind CSS v4 + Orval (API-Typgenerierung)
  • Backend — Node.js (Fastify) REST API + Prisma (ORM/Migrationen) + jose (JWT-Validierung) + AES-256-GCM (Application-Layer-Verschluesselung)
  • Datenbank — PostgreSQL mit Gruppen/Haushalte, Composite-Rollen, Event-Planning-Mode, Soft-Delete
  • Auth — Keycloak (OAuth2 / PKCE) mit Person-User-Trennung, Composite-Realm-Rollen (app-admin, event-admin, template-admin)

Verzeichnisstruktur

├── shared/design-tokens/tokens.css  Gemeinsame CSS-Custom-Properties (Farben, Schriften, Abstaende)
├── frontend/       SvelteKit-App (BFF via adapter-cloudflare) + shadcn-svelte + Tailwind + Orval
├── backend/        Fastify REST API + Prisma + jose + OpenAPI-Spezifikation
├── keycloak/       Keycloak-Realm-Export + Custom Login-Theme (Design-Tokens-konform)
├── scripts/patterns/  Log-Pattern-Dateien fuer den Integrationstest (docker-test.mjs)
└── docs/           Technische Spezifikationen (Design-Dokument)

Erste Schritte

Voraussetzungen: Docker & Docker Compose

# Umgebungsvariablen aus Vorlage kopieren und ENCRYPTION_KEY anpassen
cp .env.example .env

# Backend-Abhaengigkeiten installieren (fuer lokale TypeScript-Entwicklung)
cd backend && npm install

# Vollen Stack starten
docker compose up --build

Damit werden gestartet:

  • PostgreSQL (Port 5432) — relationale Datenbank
  • Keycloak (Port 8080, Admin: admin / admin) — Authentifizierung
  • Fastify-Backend (Port 3000) — REST API inkl. Swagger-UI (/docs) mit OAuth2-Integration (HTTP/1.1; mit TLS-Zertifikaten in ./certs/ automatisch HTTP/2 + HTTPS)
  • Frontend (Port 5173 Dev / Port 8788 wrangler pages dev) — SvelteKit + Tailwind + shadcn-svelte

Keycloak-Provisioning

Beim ersten Backend-Start wird Keycloak automatisch vorkonfiguriert:

  1. Realm-Import via --import-realm: Realm familienfeierplaner, Clients (backend-api, frontend-app, swagger-ui) und Realm-Rollen (app-admin, event-admin, template-admin) werden angelegt.
  2. Benutzer-Provisioning via Keycloak Admin API: Fuenf Testbenutzer werden mit zufaelligen 12-Zeichen-Passwoertern angelegt und die Passwoerter auf der Konsole ausgegeben.

Alle Benutzer erhalten beim Anlegen in Keycloak automatisch locale=de als User-Locale (gesteuert ueber DEFAULT_USER_LOCALE in backend/src/lib/i18n-config.ts).

Benutzer Rolle
Max Mustermann App-Admin
Petra Musterfrau App-Benutzer
Thomas Koenig App-Benutzer
Lisa Winter App-Benutzer
Anna Schmidt App-Benutzer

Frontend-Entwicklung

Das Frontend ist eine SvelteKit-App mit Tailwind CSS und shadcn-svelte:

cd frontend

# Abhaengigkeiten installieren (nach dem ersten Klonen)
npm install

# TypeScript-Typen aus der OpenAPI-Spezifikation generieren
npm run generate:api

# Dev-Server starten (Port 5173, HMR via Vite)
npm run dev

# Produktions-Build (adapter-cloudflare)
npm run build

# Cloudflare-Pages-Preview (Build + wrangler pages dev, Port 8788)
npm run preview:pages

wrangler pages dev: Fuer den Production-Preview benoetigt wrangler eigene Umgebungsvariablen — siehe .dev.vars.example (Kopie als .dev.vars).

Integrationstest

Ein automatisiertes Skript baut den gesamten Container-Stack, startet ihn und scannt Build-Output sowie Container-Logs auf Fehler und Warnungen. Anschliessend werden Playwright-E2E-Tests ausgefuehrt:

npm run test:integration

Das Skript erkennt automatisch, ob docker oder podman installiert ist. Mit Podman kann auch via Umgebungsvariable explizit gesteuert werden:

CONTAINER_CMD=podman npm run test:integration

Voraussetzung: Docker & Docker Compose (bzw. Podman + podman-compose), laufende Container-Engine.

Fuer reine Backend-Build-Tests (Lint + Kompilieren + Unit-Tests, ohne Container):

npm --prefix backend run test:build

E2E-Tests (Playwright)

Nach dem Health-Check fuehrt npm run test:integration automatisch Playwright-E2E-Tests aus.

Die E2E-Tests koennen auch manuell gestartet werden:

docker compose --profile integration-test run --rm e2e-runner npx playwright test

Health-Check pruefen:

curl http://localhost:3000/health
# {"status":"ok","database":"connected","keycloak":"reachable"}

Fahrplan

Der aktuelle Fortschritt wird in Gitea Milestones getrackt. Einzelne Aufgaben sind als Gitea Issues hinterlegt.

Sicherheit & Betrieb

Details zu Verschluesselung, Authentifizierung, Autorisierung, Audit-Log und Backup: → Authentifizierung & SecurityAutorisierungsmatrixBetrieb & Wartung

Technisches Design

docs/design.md

API-Spezifikation

Die gesamte REST-API ist als OpenAPI 3.1-Spezifikation dokumentiert:

backend/openapi.yaml

Konventionen

AGENTS.md