# Architektur-Dokumentation - Lead-Architekt ## ๐Ÿ›๏ธ System-Architektur-รœbersicht ### Architektur-Typ **Single Page Application (SPA)** mit Client-Side Routing ### Architektur-Pattern - **Component-Based Architecture** (React) - **Container/Presentational Pattern** - **Data Mode Routing** (React Router v7) --- ## ๐ŸŽฏ Architektur-Ziele 1. **Skalierbarkeit:** Modulare Komponenten fรผr einfache Erweiterung 2. **Wartbarkeit:** Klare Trennung von UI und Business Logic 3. **Performance:** Code-Splitting, Lazy Loading 4. **Type-Safety:** TypeScript fรผr robuste Typisierung 5. **Konsistenz:** Design System mit Material-UI --- ## ๐Ÿ—บ๏ธ Anwendungs-Hierarchie ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ App.tsx โ”‚ โ”‚ (RouterProvider) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ” โ”‚ Login โ”‚ โ”‚ Dashboardโ”‚ โ”‚ /login โ”‚ โ”‚ /admin โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Veranstalter โ”‚ โ”‚ TurnierErstellen โ”‚ โ”‚ TurnierAnsicht โ”‚ โ”‚ Verwaltung โ”‚ โ”‚ /veranstaltung/ โ”‚ โ”‚ /turnier/ โ”‚ โ”‚ /veranstalter โ”‚ โ”‚ :id โ”‚ โ”‚ :veranstaltung โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ Id/:nr โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ Veranstaltung- โ”‚ โ”‚ โ”‚ รœbersicht โ”‚ โ”‚ โ”‚ (Turnier-Karten) โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚Stammdatenโ”‚ โ”‚ Organisation โ”‚ โ”‚ Bewerbe โ”‚ โ”‚ Artikel โ”‚ โ”‚ Abrechnung โ”‚ โ”‚ Tab โ”‚ โ”‚ Tab โ”‚ โ”‚ Tab โ”‚ โ”‚ Tab โ”‚ โ”‚ Tab โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚Nennungen โ”‚ โ”‚ Startlisten โ”‚ โ”‚Ergebnislistenโ”‚ โ”‚ โ”‚ Tab โ”‚ โ”‚ Tab โ”‚ โ”‚ Tab โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ ``` --- ## ๐Ÿ—๏ธ Komponenten-Architektur ### Layer-Struktur ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Presentation Layer โ”‚ โ”‚ (React Components - UI Only) โ”‚ โ”‚ - Login.tsx โ”‚ โ”‚ - Dashboard.tsx โ”‚ โ”‚ - TurnierAnsicht.tsx โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Container Layer โ”‚ โ”‚ (Smart Components - State Management) โ”‚ โ”‚ - StammdatenTab.tsx โ”‚ โ”‚ - BewerbeTab.tsx โ”‚ โ”‚ - AbrechnungTab.tsx โ”‚ โ”‚ - NennungenTab.tsx โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Component Library Layer โ”‚ โ”‚ (Reusable Components) โ”‚ โ”‚ - PferdReiterEingabe.tsx โ”‚ โ”‚ - NennungenTabelle.tsx โ”‚ โ”‚ - Bewerbsliste.tsx โ”‚ โ”‚ - VerkaufBuchungen.tsx โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Material-UI Layer โ”‚ โ”‚ (Design System - MUI Components) โ”‚ โ”‚ - Box, Paper, Button, TextField, etc. โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Style Layer โ”‚ โ”‚ (Tailwind CSS v4 + CSS Variables) โ”‚ โ”‚ - theme.css โ”‚ โ”‚ - fonts.css โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐Ÿ”„ Routing-Architektur ### React Router v7 Data Mode ```typescript // routes.tsx const router = createBrowserRouter([ { path: "/", element: , }, { path: "/admin", element: , }, { path: "/veranstalter", element: , }, { path: "/veranstaltung/:id", element: , }, { path: "/turnier/:veranstaltungId/:nr", element: , }, ]); ``` ### URL-Struktur ``` / โ†’ Login /admin โ†’ Dashboard (Veranstaltungs-รœbersicht) /veranstalter โ†’ Veranstalter-Verwaltung /veranstaltung/neu โ†’ Neue Veranstaltung (mit Veranstalter-Auswahl) /veranstaltung/:id โ†’ Veranstaltung-รœbersicht (Turnier-Karten) /turnier/:veranstaltungId/neu โ†’ Neues Turnier โ†’ Stammdaten /turnier/:veranstaltungId/:nr โ†’ Turnier-Ansicht (8 Tabs) ``` --- ## ๐Ÿ’พ Daten-Architektur ### Aktueller Stand: **Client-Side Mock Data** ```typescript // Dashboard.tsx export const veranstaltungenData = [ { id: number, name: string, veranstalter: string, ort: string, startDatum: string, endDatum: string, status: 'geplant' | 'laufend' | 'abgeschlossen', turniere: Turnier[] } ] ``` ### Datenmodell-Hierarchie ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Veranstalter โ”‚ โ”‚ (Verein/Club) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ 1:n โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Veranstaltung โ”‚ โ”‚ (Event) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ 1:n โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Turnier โ”‚ โ”‚ (Competition) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ 1:n โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Bewerb โ”‚ โ”‚ (Contest) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Reiter โ”‚ โ”‚ (Rider) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ n:m โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Nennung โ”‚ โ”‚ (Registration) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ n:m โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Pferd โ”‚ โ”‚ (Horse) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Buchung โ”‚ โ”‚ (Transaction) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐ŸŽจ Design System-Architektur ### Material-UI Theme ```typescript // Primรคrfarbe: Indigo primary: { main: '#3F51B5', light : '#7986CB', dark : '#303F9F', } // Font-GrรถรŸen (kompakt fรผr Desktop) fontSize: { xs: '10px', sm : '11px', md : '13px', lg : '15px', } ``` ### Tailwind CSS v4 Integration ```css /* theme.css */ @theme { --color-primary: #3f51b5; --color-primary-hover: #303f9f; --font-size-xs: 10px; --font-size-sm: 11px; --font-size-md: 13px; } ``` --- ## ๐Ÿ” Authentifizierung-Architektur ### Aktuell: **Demo-Modus** ```typescript // Login.tsx const DEMO_USER = 'admin'; const DEMO_PASSWORD = 'Admin#1234'; ``` ### Geplant: **JWT-basierte Authentifizierung** ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Client โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ Backend โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ Database โ”‚ โ”‚ React โ”‚ Login โ”‚ API โ”‚ Verify โ”‚ Users โ”‚ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ JWT Token โ”‚ โ”‚ โ”‚ โ”‚ API Calls โ”‚ โ”‚ (with Token) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถโ”‚ โ”‚ โ”‚ โ”‚โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Response โ”‚ ``` --- ## ๐Ÿ“Š State Management-Architektur ### Aktuell: **React useState** ```typescript // Lokaler Component State const [activeTab, setActiveTab] = useState(0); const [nennungen, setNennungen] = useState([]); const [selectedPferd, setSelectedPferd] = useState(null); ``` ### Empfehlung fรผr Skalierung: #### Option 1: **React Context API** (fรผr mittlere Komplexitรคt) ```typescript // TurnierContext.tsx const TurnierContext = createContext(); export function TurnierProvider({children}) { const [turnier, setTurnier] = useState(); const [bewerbe, setBewerbe] = useState([]); return ( { children } ) ; } ``` #### Option 2: **Zustand** (empfohlen fรผr groรŸe Apps) ```typescript // store/turnierStore.ts import {create} from 'zustand'; export const useTurnierStore = create((set) => ({ turnier: null, bewerbe: [], setTurnier: (turnier) => set({turnier}), addBewerb: (bewerb) => set((state) => ({ bewerbe: [...state.bewerbe, bewerb] })), })); ``` #### Option 3: **React Query / TanStack Query** (fรผr Server State) ```typescript // hooks/useTurnier.ts import {useQuery} from '@tanstack/react-query'; export function useTurnier(id: string) { return useQuery({ queryKey: ['turnier', id], queryFn: () => fetchTurnier(id), }); } ``` --- ## ๐Ÿ”Œ Backend-Integration (Geplant) ### Option 1: **REST API** ``` GET /api/veranstaltungen POST /api/veranstaltungen GET /api/veranstaltungen/:id PUT /api/veranstaltungen/:id DELETE /api/veranstaltungen/:id GET /api/veranstaltungen/:id/turniere POST /api/veranstaltungen/:id/turniere GET /api/turniere/:id PUT /api/turniere/:id GET /api/turniere/:id/bewerbe POST /api/turniere/:id/bewerbe PUT /api/bewerbe/:id GET /api/turniere/:id/nennungen POST /api/nennungen GET /api/reiter/:id/nennungen GET /api/pferde/:id/nennungen GET /api/turniere/:id/buchungen POST /api/buchungen GET /api/reiter/:id/buchungen ``` ### Option 2: **GraphQL** (empfohlen fรผr komplexe Queries) ```graphql query GetTurnier($id: ID!) { turnier(id: $id) { id name stammdaten { znsDaten oetoTyp } bewerbe { id name klasse } nennungen { id reiter { vorname, nachname } pferd { name } bewerb { name } } buchungen { id text soll haben saldo } } } ``` ### Option 3: **Supabase** (empfohlen fรผr Rapid Development) ```typescript // supabase/client.ts import {createClient} from '@supabase/supabase-js'; export const supabase = createClient( process.env.SUPABASE_URL, process.env.SUPABASE_ANON_KEY ); // Beispiel: Turniere abrufen const {data, error} = await supabase .from('turniere') .select('*, veranstaltung(name), bewerbe(*)') .eq('id', turnierId); ``` --- ## ๐Ÿš€ Performance-Optimierungen ### 1. **Code-Splitting** ```typescript // Lazy Loading fรผr Tabs const BewerbeTab = lazy(() => import('./turnier/BewerbeTab')); const AbrechnungTab = lazy(() => import('./turnier/AbrechnungTab')); }> { activeTab === 2 && } ``` ### 2. **Memoization** ```typescript // React.memo fรผr teure Components export const NennungenTabelle = memo(({nennungen, selectedPferd}) => { // ... }); // useMemo fรผr teure Berechnungen const gesamtSaldo = useMemo(() => { return buchungen.reduce((sum, b) => sum + b.saldo, 0); }, [buchungen]); ``` ### 3. **Virtualisierung** (fรผr groรŸe Listen) ```typescript import {FixedSizeList} from 'react-window'; {({index, style}) => (
{bewerbe[index].name} < /div> ) } ``` --- ## ๐Ÿ”’ Sicherheits-Architektur ### Geplante Security Features: 1. **Authentication & Authorization** - JWT Tokens mit Refresh - Role-Based Access Control (RBAC) - Session Management 2. **Input Validation** - Client-Side: React Hook Form + Zod - Server-Side: Express Validator / Joi 3. **XSS Protection** - Content Security Policy (CSP) - Sanitization von User Inputs 4. **CSRF Protection** - CSRF Tokens fรผr State-Changing Operations --- ## ๐Ÿ“ฆ Deployment-Architektur ### Empfohlener Stack: ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Vercel/ โ”‚ โ†’ Frontend Hosting (React SPA) โ”‚ Netlify โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ HTTPS โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Backend API โ”‚ โ†’ Node.js / Express / Nest.js โ”‚ (Railway/ โ”‚ โ”‚ Render/AWS) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Database โ”‚ โ†’ PostgreSQL (Supabase / RDS) โ”‚ (Supabase/ โ”‚ โ”‚ AWS RDS) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### CI/CD Pipeline: ``` GitHub Push โ”‚ โ–ผ GitHub Actions โ”‚ โ”œโ”€โ”€โ–ถ Lint & Type Check โ”‚ โ”œโ”€โ”€โ–ถ Unit Tests โ”‚ โ”œโ”€โ”€โ–ถ Build โ”‚ โ””โ”€โ”€โ–ถ Deploy to Vercel ``` --- ## ๐Ÿ“ˆ Skalierungs-Strategie ### Phase 1: **Prototyp** (Aktuell) - Client-Side Mock Data - React useState - Keine Backend-Integration ### Phase 2: **MVP** - Supabase Backend - REST API Integration - Basic Authentication - React Query fรผr Server State ### Phase 3: **Production** - Dedizierter Backend-Server - GraphQL API (optional) - Redis Caching - WebSocket fรผr Real-Time Updates - Zustand fรผr Global State ### Phase 4: **Enterprise** - Microservices-Architektur - Event-Driven Architecture - CQRS Pattern - Message Queue (RabbitMQ / Kafka) - Multi-Tenant Support --- ## ๐Ÿงช Testing-Strategie ### Unit Tests ```typescript // BewerbeTab.test.tsx import {render, screen} from '@testing-library/react'; import {BewerbeTab} from './BewerbeTab'; test('renders bewerbe table', () => { render(); expect(screen.getByText('Bewerbs-รœbersicht')).toBeInTheDocument(); }); ``` ### Integration Tests ```typescript // TurnierAnsicht.integration.test.tsx test('tab navigation works', async () => { render(); const bewerbeTab = screen.getByText('Bewerbe'); await userEvent.click(bewerbeTab); expect(screen.getByText('Bewerbs-รœbersicht')).toBeInTheDocument(); }); ``` ### E2E Tests (Playwright / Cypress) ```typescript // e2e/turnier.spec.ts test('create new turnier', async ({page}) => { await page.goto('/admin'); await page.click('text=Neue Veranstaltung'); await page.click('text=RFV Musterstadt'); await page.fill('[name="name"]', 'Frรผhjahrsturnier 2026'); await page.click('text=Speichern'); await expect(page.locator('text=Frรผhjahrsturnier 2026')).toBeVisible(); }); ``` --- ## ๐Ÿ“š Architektur-Entscheidungen (ADRs) ### ADR-001: React Router Data Mode **Status:** Angenommen **Kontext:** Benรถtigen Client-Side Routing mit mehreren verschachtelten Routen **Entscheidung:** React Router v7 mit Data Mode Pattern **Konsequenzen:** Einfache Navigation, aber keine SSR ### ADR-002: Material-UI als Design System **Status:** Angenommen **Kontext:** Benรถtigen professionelles Design System fรผr Desktop-App **Entscheidung:** Material-UI v6 (Material Design 3) **Konsequenzen:** Konsistentes Design, aber grรถรŸere Bundle-Size ### ADR-003: Tailwind CSS fรผr Custom Styles **Status:** Angenommen **Kontext:** Benรถtigen Utility-First CSS fรผr schnelles Styling **Entscheidung:** Tailwind CSS v4 zusรคtzlich zu MUI **Konsequenzen:** Flexibles Styling, aber zwei CSS-Systeme ### ADR-004: TypeScript fรผr Type-Safety **Status:** Angenommen **Kontext:** Komplexe Datenstrukturen benรถtigen Type-Safety **Entscheidung:** TypeScript statt JavaScript **Konsequenzen:** Bessere DX, aber lรคngere Compile-Zeit --- ## ๐Ÿ”ฎ Zukunfts-Roadmap ### Q2 2026 - [ ] Supabase Backend-Integration - [ ] REST API fรผr alle CRUD-Operationen - [ ] PDF-Export fรผr Startlisten/Rechnungen - [ ] Excel-Export ### Q3 2026 - [ ] Real-Time Collaboration (WebSockets) - [ ] Mobile-Responsive Layout - [ ] Offline-Modus (PWA) - [ ] Multi-Language Support (i18n) ### Q4 2026 - [ ] GraphQL API - [ ] Advanced Analytics Dashboard - [ ] Email-Benachrichtigungen - [ ] Zahlungs-Gateway Integration --- **Dokumentiert von:** Lead-Architekt **Version:** 1.0 **Datum:** 2026-03-24