Bedrud verwendet das Fiber-Webframework (Express-ähnliche API für Go).
Routing-Logik
Die Routen sind in internal/server/server.go definiert. Wir gruppieren Routen, um Middleware oder Präfixe einfach anzuwenden.
Hauptgruppen:
/api/auth: Öffentliche und geschützte Routen für die Authentifizierung./api/room: Geschützte Routen für die Raumverwaltung./api/admin: Routen, die auf Benutzer mit der Rollesuperadminbeschränkt sind./livekit: Eine spezielle Proxy-Gruppe, die Anfragen an den eingebetteten LiveKit-Audio/Video-Server weiterleitet.
Spezialisierte Handler-Logik
Raumverwaltung (internal/handlers/room.go)
Der RoomHandler übersetzt zwischen Bedruds Raum-Metadaten und LiveKits Medien-Engine.
1. Raumerstellung
Wenn ein Raum über POST /api/room/create erstellt wird:
- Normalisierung: Raumnamen werden getrimmt und in Kleinbuchstaben umgewandelt.
- Automatische Generierung: Wenn kein Name angegeben wird, generiert Bedrud einen zufälligen, URL-sicheren Namen (z. B.
fancy-blue-whale). - Synchronisierte Erstellung: Das Backend ruft zuerst die interne LiveKit-API auf, um die Mediensitzung zu erstellen, und speichert dann die Metadaten in der lokalen Datenbank.
2. Beitreten und Tokens
Wenn ein Benutzer über POST /api/room/join beitritt:
- Zugriffskontrolle: Das Backend prüft, ob der Raum existiert und ob der Benutzer berechtigt ist.
- Token-Generierung: Ein signiertes JWT (Join Token) wird generiert mit:
Identity: Die Benutzer-ID aus Bedrud.Name: Der Anzeigename des Benutzers.Grants: Spezifische Berechtigungen wieCanJoin,CanPublish,CanSubscribe.
- Client-Handshake: Das Frontend erhält sowohl die lokalen Raum-Metadaten als auch das LiveKit-Token, um die WebRTC-Verbindung aufzubauen.
Admin- & Benutzerverwaltung (internal/handlers/users.go)
Routen unter /api/admin werden streng durch die Middleware RequireAccess("superadmin") geschützt.
1. Benutzerverwaltung
Der UsersHandler ermöglicht Administratoren:
- Alle Benutzer auflisten: Abrufen eines vollständigen Verzeichnisses registrierter Benutzer inklusive ihres Auth-Providers und letzter Anmelde-Metadaten.
- Status aktualisieren: Kontozugriff sofort aktivieren oder deaktivieren. Die Deaktivierung eines Benutzers blockiert ihn sofort an der Anmeldung oder der Aktualisierung seiner Tokens.
2. Raumübersicht
Admin-Routen ermöglichen das Auflisten aller aktiven und historischen Räume auf der gesamten Plattform, unabhängig davon, wer sie erstellt hat. Dies dient der Plattform-Moderation.
Anfrage-Lebenszyklus
-
Anfrage geht ein: Fiber empfängt die HTTP-Anfrage.
-
Middleware:
recover: Verhindert, dass der Server bei einem Fehler abstürzt.cors: Verwaltet Cross-Origin Resource Sharing.Protected: (Optional) Prüft auf ein gültiges JWT imAuthorization-Header.
-
Handler: Die Funktion in
internal/handlerswird aufgerufen.- Sie verarbeitet den JSON-Body (falls vorhanden) mit
c.BodyParser. - Sie ruft den notwendigen Service oder das Repository auf.
- Sie gibt eine JSON-Antwort mit
c.JSONzurück.
- Sie verarbeitet den JSON-Body (falls vorhanden) mit
Beispiel: Raum-Erstellungs-Handler
func (h *RoomHandler) CreateRoom(c *fiber.Ctx) error {
var input struct {
Name string `json:"name"`
}
// 1. Parse Input
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
}
// 2. Business Logic (via Repository)
room := &models.Room{Name: input.Name}
if err := h.roomRepo.Create(room); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to create room"})
}
// 3. Response
return c.Status(201).JSON(room)
}Statische Dateien (Frontend)
Das Web-Frontend ist zur Build-Zeit eingebettet in das Go-Binary. Fiber stellt die React-Dateien aus dem Verzeichnis frontend/ über filesystem.New bereit.
Jede Route, die nicht mit /api beginnt, wird zur index.html der React-App weitergeleitet. Dies ermöglicht clientseitiges Routing ohne 404-Fehler beim Seitenrefresh.