Interactive Classroom ist eine Mehr-Service-Anwendung für digitale Kurse mit:
Environments) und darin enthaltenen
SessionsEin frischer Clone kann lokal direkt gestartet werden:
./scripts/start.shdocker compose up --buildDanach ist die Anwendung unter http://localhost
erreichbar.
Typische Entwicklungs-URLs:
http://localhosthttp://localhost:8080http://localhost:1234/healthhttp://localhost:5050Optional:
.env.example nach .env kopieren, falls du
Defaults überschreiben willst.env funktionieren die lokalen Dev-Defaults
bereitsZusätzliche Architektur- und Ablaufbilder liegen im Ordner
images/ und sind auch direkt im README eingebunden:
Der aktuelle Stand ist kein reines Backend-Projekt mehr, sondern ein komplettes System mit Frontend, API, Realtime und Whiteboard.
Das React-Frontend in apps/web enthält aktuell:
Die Express-API in apps/api enthält aktuell:
Der Collab-Service in apps/collab enthält aktuell:
apps/web: React/Vite-Frontendapps/api: Express-API für Auth, Kurse, Sessions und
Session-Realtimeapps/collab: Hocuspocus/Y.js-Service für das
Whiteboarddb: PostgreSQLredis: Realtime-Backplane für Hocuspocustraefik: Reverse Proxymigrate: Prisma-Migrationen beim Startpgadmin: optionale DB-Oberfläche für EntwicklungZusätzlich zum Mermaid-Überblick gibt es eine visuelle Gesamtübersicht als SVG:
flowchart LR
Browser -->|HTTP| Traefik
Browser -->|REST + Stream| API
Browser -->|WS Y.js| Collab
Traefik --> API1[api-1]
Traefik --> API2[api-2]
Traefik --> WEB[web]
API1 --> Postgres[(PostgreSQL)]
API2 --> Postgres
API1 -->|LISTEN/NOTIFY| Postgres
API2 -->|LISTEN/NOTIFY| Postgres
Collab --> Postgres
Collab --> Redis[(Redis)]
Die Anwendung verwendet ein Access-/Refresh-Token-Modell:
POST /api/auth/login, register oder
guest liefern ein accessTokenHttpOnly-Cookie
gesetztPOST /api/auth/refresh
aufgerufen401 versucht das Frontend automatisch genau einen
Refresh und wiederholt den RequestDas bedeutet:
Authorization: Bearer <token>Der Ablauf ist zusätzlich als Diagramm dokumentiert:
Ein Environment ist der übergeordnete Kursraum.
Ein Environment hat:
codeEine Session ist eine konkrete Durchführung innerhalb eines Kurses.
Eine Session hat:
codeOPEN, CLOSED,
ENDEDDie Board-Struktur ist inzwischen deutlich größer als in der alten README:
documentNameorientationbackgroundTemplatewidthheightboard_documents gespeichertIm Shared-Bereich gilt aktuell:
OPEN seinDiese Regel wird doppelt abgesichert:
Persönliche Boards sind an ein Session-Mitglied gekoppelt. Dort arbeitet der Besitzer in seinem eigenen Bereich. Shared Boards können außerdem als persönliche Kopie übernommen werden.
Session-Daten laufen nicht über Y.js, sondern über einen API-Stream:
sequenceDiagram
participant Browser
participant API
participant Postgres
Browser->>API: GET /api/sessions/:code/stream
API->>Browser: initiales Session-Snapshot
API->>Postgres: LISTEN session_updates
Postgres-->>API: NOTIFY
API-->>Browser: neues Session-Snapshot
Das Whiteboard selbst läuft über Hocuspocus und Y.js:
sequenceDiagram
participant Browser
participant Collab
participant Redis
participant Postgres
Browser->>Collab: WebSocket connect + JWT
Collab->>Postgres: lade Snapshot aus board_documents
Collab->>Redis: verteile Y.js-Updates
Browser->>Collab: Zeichnen / Bild / Seiten-Änderung
Collab->>Postgres: speichere Snapshot
Collab->>Postgres: aktualisiere Projektion
Die alte Datenbankbeschreibung im README wurde ausgelagert, weil das Modell inzwischen deutlich umfangreicher ist.
Die aktuelle Dokumentation findest du hier:
Sie enthält:
Zusätzlich gibt es eine visuelle Datenbankübersicht:
POST /api/auth/loginPOST /api/auth/registerPOST /api/auth/guestPOST /api/auth/refreshPOST /api/auth/logoutGET /api/auth/meGET /api/environmentsPOST /api/environmentsPOST /api/environments/join/:codePATCH /api/environments/:environmentIdPOST /api/environments/:environmentId/templatesPATCH /api/environments/:environmentId/templates/:templateIdPATCH /api/environments/:environmentId/members/:userIdDELETE /api/environments/:environmentIdGET /api/sessionsPOST /api/sessionsPATCH /api/sessions/:sessionIdPOST /api/sessions/:sessionId/boardsPATCH /api/sessions/:sessionId/boards/:boardIdDELETE /api/sessions/:sessionId/boards/:boardIdGET /api/sessions/:codeGET /api/sessions/:code/streamPOST /api/sessions/:code/joinPOST /api/sessions/:sessionId/boards/:boardId/copy-personalPOST /api/sessions/:sessionId/openPOST /api/sessions/:sessionId/closePOST /api/sessions/:sessionId/leaveDELETE /api/sessions/:codePOST /api/sessions/:sessionId/active-memberDie UI ist aktuell in drei Hauptseiten aufgeteilt:
apps/web/src/pages/
LoginPage/
LoginPage.jsx
LoginPage.css
DashboardPage/
DashboardPage.jsx
DashboardPage.css
BoardPage/
BoardPage.jsx
BoardPage.css
Weitere wichtige Frontend-Dateien:
apps/web/src/App.jsx: Routing und Silent-Login beim
Startapps/web/src/store/authStore.js: Access Token und
User-Stateapps/web/src/lib/api.js: API-Wrapper mit Auto-Refresh
bei 401apps/web/src/hooks/useYjs.js: Y.js-Integration für
Pages, Elemente, Undo/Redo und SyncDer aktuelle Kern der Datenbank besteht aus:
usersuser_auth_providersrefresh_tokensenvironmentsenvironment_membershipsenvironment_board_templatessessionssession_memberssession_turn_historysession_eventsspacesboardsboard_elementsboard_write_accessboard_eventsboard_documentsLISTEN/NOTIFY.