Abitur-Planer – technische Übersicht
Architektur, Datenflüsse, Regel-Engine und Deployment-Hinweise für die neue Abitur-Planungs-App.
1. Architektur
Frontend und Backend laufen innerhalb der bestehenden Next.js 14 App. Authentifizierung erfolgt über Firebase (Magic-Link). API-Routen werden mit einem Firebase-ID-Token geschützt und nutzen Firestore als persistenten Speicher. Integrationen wie Notion und die Regel-/Optimierungslogik leben in einer separaten Workspace-Library@johannstein/abitur-planner
.
flowchart TD browser[Browser UI] api[Next.js API-Routen] notion[Notion API] firestore[(Firestore)] logic[@johannstein/abitur-planner] browser -->|REST + Firebase ID Token| api api --> logic api --> firestore api -->|optional Sync| notion logic --> firestore
2. Datenmodell
Die folgenden Strukturen werden in Firestore pro Nutzer gespeichert. Multi-Tenancy ergibt sich durch den Firebase-UID-Namespace. Secrets werden mit AES-256-GCM verschlüsselt (Schlüssel via PLANNER_ENCRYPTION_KEY
).
CourseSelection { courseId: string isEnrolled: boolean isLeistungskurs: boolean examRole: 'LK1'|'LK2'|'PF3'|'PF4'|'PF5'|null isBilingual?: boolean } SemesterGrade { courseId: string semester: 'Q1'|'Q2'|'Q3'|'Q4' points: number | null source: 'notion' | 'manual' | 'autofill' locked: boolean } NotionSettings { enabled: boolean integrationTokenEncrypted?: string databaseIdEncrypted?: string lastSyncedAt?: string }
3. Regel-Engine & Optimierer
- Regel-Engine: deklarativ über TypScript-Definitionen mit Unit-Tests (Vitest) abgedeckt. Bewertet Kernpflichten (Deutsch/Mathe durchgehend, Naturwissenschaft, PF-Zuordnung etc.).
- Optimierer: heuristische Auswahl der besten 24 GK-Halbjahre plus automatische Einbringung aller LKs und Deutsch. Rechnet den Punktschnitt in eine approximierte Abiturnote um und liefert Begründungen.
- Autofillout: Projektion leerer Noten anhand bestehender Durchschnittswerte mit wählbarer Leistungs-Abweichung (–20 % bis +50 %).
4. Notion-Integration
- In Notion eine interne Integration anlegen, Token kopieren.
- Database-ID der Noten-Datenbank (Spalten: Kurs, Ø Q1–Ø Q4) ermitteln.
- Im Abitur-Planer Token & Database-ID eingeben, optional „Zugangsdaten speichern“ aktivieren.
- Synchronisation lädt alle Kurse (ausgenommen „Insgesamt“/„Organisation“), sperrt übernommene Werte und lässt leere Felder editierbar.
- Manuelle Noten bleiben erhalten; Überschreiben erfolgt nur nach Bestätigung.
Die API kommuniziert ausschließlich serverseitig mit Notion, Tokens verlassen den Server nie im Klartext.
5. Deployment
Build- und Start-Kommandos entsprechen dem bestehenden Setup (pnpm + pm2).
# .env.production NEXT_PUBLIC_FIREBASE_API_KEY=… NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=… NEXT_PUBLIC_FIREBASE_PROJECT_ID=… NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=… NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=… NEXT_PUBLIC_FIREBASE_APP_ID=… GOOGLE_SERVICE_ACCOUNT_KEY_B64=… PLANNER_ENCRYPTION_KEY=32+ character secret # pm2 ecosystem uses npm run start pnpm install --frozen-lockfile pnpm --filter web build pm2 restart ecosystem.config.js --only web
6. Anwender-Workflow
- Login via Magic-Link, anschließend Abitur-Planer öffnen.
- Kursbelegung im Dialog prüfen und Rollen (LK/PF) setzen.
- Noten aus Notion synchronisieren oder manuell/über Autofillout ergänzen.
- Regel-Check beobachten, Verstöße per Button „Einbringen“ und Optimierer korrigieren.
- Optimale Einbringung speichern und für spätere Sessions wieder laden.