No new TalkTime DB table — reads Synapse's room list directly and cross-references the existing chat_rooms table for team/org attribution. Delete goes straight to Synapse. Status set to In Progress. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0143yYvjesjHndBACoweyK67
4.8 KiB
4.8 KiB
PROJ-14: Synapse Raum-Übersicht (System-Admin)
Status: Planned Created: 2026-09-12
Summary
Liste aller Matrix-Räume auf der angebundenen Synapse-Instanz für SYSTEM_ADMIN, unabhängig von TalkTime-Team-/Vereinszuordnung — nachgebaut aus synapse-admin's Raum-Übersicht. Nutzt Synapse Admin API (GET /_synapse/admin/v1/rooms), keine neue TalkTime-Datenbanktabelle nötig.
Dependencies
- Requires: PROJ-13 (SYSTEM_ADMIN-Rolle) — Zugriffsschutz
- Requires: PROJ-9 (Synapse-Integration) — nutzt bestehenden
services/synapse.ts-Wrapper
User Stories
- Als SYSTEM_ADMIN will ich alle Matrix-Räume sehen (Name, Mitgliederzahl, Erstellungsdatum), um einen Überblick über die Gesamtnutzung zu haben.
- Als SYSTEM_ADMIN will ich erkennen, welcher Raum zu welchem TalkTime-Team/Verein gehört (Abgleich mit
chat_rooms-Tabelle), um Zuordnung nachvollziehen zu können. - Als SYSTEM_ADMIN will ich einen verwaisten Raum (keine TalkTime-Zuordnung mehr, z.B. nach Datenbereinigung) direkt löschen/purgen können.
Acceptance Criteria
GET /api/system-admin/rooms— SYSTEM_ADMIN-only, ruft_synapse/admin/v1/roomsab, reichert um TalkTime-Zuordnung an (JOIN gegen lokalechat_rooms-Tabelle übermatrix_room_id)- Frontend-Tabelle: Raumname, Mitgliederzahl, TalkTime-Zuordnung (Vereinsname + Team, oder "nicht zugeordnet"), Erstellungsdatum
DELETE /api/system-admin/rooms/:roomId— purged den Raum bei Synapse; falls inchat_roomsverzeichnet, wird der lokale Eintrag ebenfalls gelöscht (kaskadiert nicht automatisch, da externe ID)- Bestätigungsdialog vor dem Löschen (destruktive Aktion, analog Mitglied-Löschen aus PROJ-3)
- Pagination (Synapse Admin API liefert selbst paginiert,
from/limit-Parameter durchreichen)
Edge Cases
- Raum ist ein aktiver Team-Raum (in
chat_roomsverzeichnet, Team existiert noch) → Löschen weiterhin technisch möglich, aber Warnhinweis im Dialog ("Dieser Raum ist aktiv einem Team zugeordnet — Team-Chat wird dadurch zerstört") - Synapse nicht erreichbar → Fehleranzeige, keine leere Liste vortäuschen
- Sehr viele Räume (>1000) → Pagination zwingend, nicht alles auf einmal laden
- Raum bereits gelöscht (Race Condition, zwei Admins gleichzeitig) → Synapse liefert Fehler, Frontend zeigt generische Fehlermeldung statt Absturz
Non-Goals
- Raum-Inhalte einsehen (Nachrichten lesen) — reine Metadaten-Übersicht, kein Nachrichten-Zugriff für Admin
- Raum-Einstellungen ändern (Name, History-Visibility) über dieses Panel — nur Übersicht + Löschen
Tech Design (Solution Architect)
A) Komponenten-Struktur
System-Admin-Bereich (NEU, "/system-admin")
└── Seite "Räume"
├── Tabelle: Raumname | Mitglieder | Zuordnung (Verein/Team oder "nicht zugeordnet") | Erstellt am | Aktion
├── "Weiter"/"Zurück"-Paginierung (analog Mitgliederliste aus PROJ-3)
└── Löschen-Bestätigungsdialog (analog Mitglied-Löschen aus PROJ-3)
Erste Unterseite im neuen System-Admin-Bereich — die Navigation dorthin (aktuell ein Button, der ins Leere zeigt, siehe PROJ-13) bekommt jetzt ein echtes Ziel.
B) Datenfluss (in einfachen Worten)
Es wird keine neue Tabelle in der TalkTime-Datenbank angelegt. Der Ablauf:
- Backend fragt Synapse nach der Liste aller Räume (Name, Mitgliederzahl, Erstellungsdatum) — das ist reine Server-Information, die Synapse selbst schon führt.
- Backend gleicht diese Liste gegen die bereits vorhandene TalkTime-Tabelle ab, in der steht, welcher Matrix-Raum zu welchem Team/Verein gehört (dieselbe Tabelle, die auch der Chat aus PROJ-11 nutzt).
- Ergebnis: eine kombinierte Liste, die sowohl "reine Synapse-Info" als auch "TalkTime-Zuordnung, falls vorhanden" zeigt.
- Löschen eines Raums geht direkt an Synapse; falls der Raum in der TalkTime-Zuordnung stand, wird dieser Eintrag ebenfalls entfernt, damit keine verwaiste Zuordnung auf einen nicht mehr existierenden Raum zurückbleibt.
C) Tech-Entscheidungen (Begründung)
- Keine eigene Datenspeicherung der Raumliste: Synapse ist bereits die "Quelle der Wahrheit" für Räume — eine Kopie in TalkTime pflegen hieße, zwei Datenstände synchron halten zu müssen, ohne echten Nutzen.
- Zugriffsschutz über die in PROJ-13 gebaute Prüfung: Kein neuer Berechtigungsmechanismus, konsistent mit allen anderen System-Admin-Funktionen.
- Löschen bricht Chat für aktive Teams bewusst nicht automatisch ab: Ein Löschen-Button, der aktive Team-Chats stillschweigend verschont, wäre für einen Admin verwirrend ("warum lässt sich das nicht löschen?"). Stattdessen: löschen ist möglich, aber mit deutlicher Warnung vorher.
D) Abhängigkeiten (neue Pakete)
Keine — nutzt die bestehende Synapse-Anbindung aus PROJ-9/PROJ-11.
Offene Voraussetzung
Erfordert PROJ-13 (Berechtigungsprüfung) als Grundlage — bereits umgesetzt.