Bedrud использует веб-фреймворк Fiber (API в стиле Express для Go).
Логика маршрутизации
Маршруты определены в internal/server/server.go. Мы группируем маршруты для удобного применения middleware или префиксов.
Основные группы:
/api/auth: Публичные и защищённые маршруты для аутентификации./api/room: Защищённые маршруты для управления комнатами./api/admin: Маршруты, доступные только пользователям с рольюsuperadmin./livekit: Специальная группа прокси, отправляющая запросы на встроенный аудио/видео сервер LiveKit.
Специализированная логика обработчиков
Управление комнатами (internal/handlers/room.go)
RoomHandler осуществляет перевод между метаданными комнат Bedrud и медиадвижком LiveKit.
1. Создание комнаты
При создании комнаты через POST /api/room/create:
- Нормализация: Имена комнат обрезаются и переводятся в нижний регистр.
- Автогенерация: Если имя не указано, Bedrud генерирует случайное URL-безопасное имя (например,
fancy-blue-whale). - Синхронизированное создание: Бэкенд сначала вызывает внутренний API LiveKit для создания медиасеанса, затем сохраняет метаданные в локальной базе данных.
2. Присоединение и токены
Когда пользователь присоединяется через POST /api/room/join:
- Управление доступом: Бэкенд проверяет существование комнаты и права пользователя.
- Генерация токена: Подписанный JWT (Join Token) генерируется с:
Identity: ID пользователя из Bedrud.Name: Отображаемое имя пользователя.Grants: Определённые разрешения, такие какCanJoin,CanPublish,CanSubscribe.
- Клиентский рукопожатие: Фронтенд получает как локальные метаданные комнаты, так и токен LiveKit для начала WebRTC-соединения.
Администрирование и управление пользователями (internal/handlers/users.go)
Маршруты в /api/admin строго охраняются middleware RequireAccess("superadmin").
1. Управление пользователями
UsersHandler позволяет администраторам:
- Список всех пользователей: Получить полный каталог зарегистрированных пользователей, включая их провайдера аутентификации и метаданные последнего входа.
- Обновление статуса: Мгновенно активировать или деактивировать доступ к аккаунту. Деактивация пользователя немедленно блокирует его возможность входа или обновления токенов.
2. Обзор комнат
Маршруты администратора позволяют просматривать все активные и исторические комнаты на всей платформе, независимо от того, кто их создал. Это предназначено для модерации платформы.
Жизненный цикл запроса
-
Запрос поступает: Fiber получает HTTP-запрос.
-
Middleware:
recover: Предотвращает сбой сервера при возникновении ошибки.cors: Обрабатывает совместное использование ресурсов между источниками (CORS).Protected: (Опционально) Проверяет наличие действительного JWT в заголовкеAuthorization.
-
Обработчик: Вызывается функция из
internal/handlers.- Она разбирает тело JSON (если есть) с использованием
c.BodyParser. - Она вызывает необходимый Service или Repository.
- Она возвращает JSON-ответ с использованием
c.JSON.
- Она разбирает тело JSON (если есть) с использованием
Пример: обработчик создания комнаты
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)
}Статические файлы (фронтенд)
Веб-фронтенд встроен в бинарный файл Go во время сборки. Fiber отдаёт файлы React из директории frontend/ с использованием filesystem.New.
Любой маршрут, не начинающийся с /api, перенаправляется на index.html React-приложения. Это обеспечивает клиентскую маршрутизацию без 404-ошибок при обновлении страницы.