Files
FL-Akademie/docs/HANDBUCH.md

109 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Handbuch FL-Akademie LMS
Technische und organisatorische Dokumentation des **implementierten Stands**. Ergänzt [PLAN.md](PLAN.md) (Vision & Roadmap).
---
## 1. Rollen (NextAuth + Prisma)
| Rolle (`Role`) | Zweck |
|----------------|--------|
| `LEARNER` | Standard-Lernende |
| `INSTRUCTOR` | vorbereitet für spätere Dozenten-Features |
| `ADMIN` | voller Zugriff auf `/admin` |
Die Rolle liegt im **JWT** und wird über `middleware.ts` für `/admin` geprüft. `/portal` ist für **alle angemeldeten** Nutzer.
---
## 2. Öffentliche Website
- **Startseite `/`:** Inhalte (Hero, CTAs, Vorteils-Kacheln) kommen aus der Tabelle **`LandingPage`** (`id = "default"`, Feld `content` als JSON). Fallback-Logik in `lib/landing.ts`, wenn keine oder ungültige Daten vorliegen.
- **Kurse:** Veröffentlichte Kurse (`published = true`), Einschreibung über API nur bei **Preis 0** (kostenpflichtige Kurse: Hinweis in UI, Zahlung noch nicht angebunden).
---
## 3. Mitgliederbereich (`/portal`)
- **Übersicht:** Eingeschriebene Kurse, Fortschrittsbalken (abgeschlossene vs. gesamte veröffentlichte Lektionen), Links zum Lernen, zum Kurrikulum, zum Zertifikat (falls vorhanden).
- **Kurs wiederholen:** Link startet wieder bei der ersten Lektion; optional **„Fortschritt zurücksetzen“** (löscht `LessonProgress` und ggf. `Certificate` für diesen Kurs).
- **Konto `/portal/account`:** Passwort ändern (`POST /api/portal/password` aktuelles Passwort prüfen, neues hashen mit bcrypt).
- **Zertifikate `/portal/certificates`:** Liste ausgestellter Urkunden mit Link zur öffentlichen Ansicht.
---
## 4. Administration (`/admin`)
Nur mit Rolle **`ADMIN`** erreichbar (sonst Redirect nach `/portal`).
| Route | Funktion |
|-------|----------|
| `/admin` | Übersicht mit Verweisen |
| `/admin/courses` | Alle Kurse (inkl. Entwürfe), Link „Neuer Kurs“ |
| `/admin/courses/new` | Neuanlage: Titel, Slug, Beschreibung, Autor-Name, Preis (EUR), Abo-Intervall, Veröffentlicht |
| `/admin/courses/[id]/edit` | Stammdaten bearbeiten; **Module** und **Lektionen** hinzufügen (Lektion: optionaler Slug, HTML-Inhalt) |
| `/admin/users` | Nutzerliste (ohne Passwort): E-Mail, Name, Rolle, Anzahl Einschreibungen & Zertifikate |
| `/admin/landing` | Startseiten-Texte und bis zu 6 Vorteils-Kacheln; **Speichern wirkt sofort** auf `/` |
---
## 5. Zertifikate (Certificate of completion)
- **Ausstellung:** Sobald ein Nutzer **alle veröffentlichten Lektionen** eines Kurses als abgeschlossen markiert hat, legt `lib/certificates.ts` (`syncCertificateForCourse`) einen **`Certificate`**-Datensatz mit eindeutigem **`code`** an (Format z.B. `FA-…`).
- **Widerruf:** Entfernen einzelner Lektions-Abschlüsse oder „Fortschritt zurücksetzen“ löscht das Zertifikat wieder, sobald der Kurs nicht mehr vollständig ist.
- **Öffentliche Seite:** `/zertifikat/[code]` Name, Kurstitel, Datum, Verifikationscode; Drucklayout blendet Kopf-/Fußzeile aus (`@media print` in `app/globals.css`).
Auslöser nach Abschluss: `POST /api/progress` ruft `syncCertificateForCourse` auf.
---
## 6. Datenmodell (Prisma)
Wesentliche Modelle:
- `User`, `Course`, `CourseModule`, `Lesson`, `Enrollment`, `LessonProgress`
- `Category`, `CourseCategory` (Seed / spätere Filter)
- **`LandingPage`** eine Zeile `default` für Startseiten-JSON
- **`Certificate`** `@@unique([userId, courseId])`, `code` global eindeutig
Migrationen unter `prisma/migrations/`.
---
## 7. Docker Compose
| Service | Beschreibung |
|---------|----------------|
| `db` | `postgres:16-alpine`, Volume `postgres_data` |
| `web` | Build aus `Dockerfile`, Entrypoint `scripts/docker-entrypoint.sh` |
Umgebungsvariablen im Compose u.a. `NEXT_TELEMETRY_DISABLED=1`.
**Befehle:**
```bash
docker compose up --build -d # im Hintergrund
docker compose logs -f web # Logs
docker compose down # stoppen
```
---
## 8. Sicherheitshinweise (Produktion)
- `NEXTAUTH_SECRET` und `NEXTAUTH_URL` korrekt setzen.
- Credentials-Login ist für Dev/MVP gedacht für Produktion OAuth oder stärkere Passwortrichtlinien erwägen.
- Admin-Oberfläche nicht ohne Absicherung (TLS, Netzwerk) exponieren.
---
## 9. Git-Remote
Standard-Remote nach Klon/Push:
```text
https://git.loepperts.com/loepperts/FL-Akademie.git
```
Branch: `main` (empfohlen).