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

Bedrud использует GORM в качестве ORM с поддержкой как SQLite, так и PostgreSQL.

Поддерживаемые базы данных

  • SQLite: Используется по умолчанию для удобной разработки и небольших установок. База данных хранится в файле (обычно bedrud.db).
  • PostgreSQL: Рекомендуется для продакшен-сред с большим количеством пользователей.

Вы можете настроить тип базы данных и параметры подключения в файле config.yaml в разделе database:.

Основные модели

Модели расположены в internal/models/. Вот самые важные из них:

User (user.go)

Хранит информацию об аккаунте, включая учётные данные и роли.

Room (room.go)

Представляет сеанс встречи. Использует встроенные структуры GORM для организации настроек. Вместо отдельной таблицы или JSON-блока, поля RoomSettings (такие как allow_chat, allow_video) хранятся непосредственно в таблице rooms с префиксом settings_ (например, settings_allow_chat). Это обеспечивает чистую модель в Go при сохранении плоской, производительной структуры базы данных.

Passkey (passkey.go)

Хранит публичные ключи FIDO2/WebAuthn для беспарольного входа.

Пользовательские типы: StringArray

Стандартные SQL-базы данных по-разному обрабатывают массивы (PostgreSQL имеет встроенные массивы, SQLite - нет). Для обеспечения совместимости Bedrud определяет тип StringArray в internal/models/user.go.

  • Он реализует sql.Scanner и driver.Valuer.
  • В PostgreSQL используется встроенный тип text[].
  • В SQLite массив сериализуется в строку (например, {admin,user}) для хранения.

Управление внешними ключами

AutoMigrate от GORM не обрабатывает составные первичные ключи (например, room_participants).

В internal/database/migrations.go Bedrud вручную выполняет операторы ALTER TABLE, чтобы гарантировать правильное применение ограничений внешних ключей (таких как ON DELETE CASCADE) в продакшене (PostgreSQL).

Паттерн Repository

Бэкенд использует паттерн Repository для доступа к базе данных. Обработчики не вызывают GORM напрямую - они используют репозиторий.

Пример:

// В обработчике:
user, err := h.userRepo.GetByEmail(email)
 
// В репозитории:
func (r *UserRepository) GetByEmail(email string) (*models.User, error) {
    var user models.User
    err := r.db.Where("email = ?", email).First(&user).Error
    return &user, err
}

Автоматические миграции

При запуске сервера автоматически выполняется «AutoMigrate». Это создаёт или обновляет таблицы базы данных на основе структур Go в internal/models. Ручные операторы CREATE TABLE не требуются для простых изменений схемы.