Bedrud Документация

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. Обзор комнат

Маршруты администратора позволяют просматривать все активные и исторические комнаты на всей платформе, независимо от того, кто их создал. Это предназначено для модерации платформы.

Жизненный цикл запроса

  1. Запрос поступает: Fiber получает HTTP-запрос.

  2. Middleware:

    • recover: Предотвращает сбой сервера при возникновении ошибки.
    • cors: Обрабатывает совместное использование ресурсов между источниками (CORS).
    • Protected: (Опционально) Проверяет наличие действительного JWT в заголовке Authorization.
  3. Обработчик: Вызывается функция из internal/handlers.

    • Она разбирает тело JSON (если есть) с использованием c.BodyParser.
    • Она вызывает необходимый Service или Repository.
    • Она возвращает JSON-ответ с использованием c.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-ошибок при обновлении страницы.