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 не требуются для простых изменений схемы.