Bedrud verwendet GORM als ORM und unterstützt sowohl SQLite als auch PostgreSQL.
Unterstützte Datenbanken
- SQLite: Standardmäßig für einfache Entwicklung und kleine Installationen verwendet. Die Datenbank wird in einer Datei gespeichert (üblicherweise
bedrud.db). - PostgreSQL: Empfohlen für Produktionsumgebungen mit vielen Benutzern.
Sie können den Datenbanktyp und die Verbindungsdetails in der Datei config.yaml im Abschnitt database: konfigurieren.
Kernmodelle
Die Modelle befinden sich in internal/models/. Hier sind die wichtigsten:
User (user.go)
Speichert Kontoinformationen einschließlich Anmeldedaten und Rollen.
Room (room.go)
Repräsentiert eine Meeting-Sitzung. Sie verwendet GORMs Embedded Structs, um Einstellungen zu organisieren.
Anstelle einer separaten Tabelle oder eines JSON-Blobs werden die RoomSettings-Felder (wie allow_chat, allow_video) direkt in der rooms-Tabelle mit dem Präfix settings_ gespeichert (z. B. settings_allow_chat). Dies bietet ein sauberes Modell in Go und erhält gleichzeitig eine flache, performante Datenbankstruktur.
Passkey (passkey.go)
Speichert FIDO2/WebAuthn-Public-Keys für passwortloses Login.
Benutzerdefinierter Typ: StringArray
Standard-SQL-Datenbanken verarbeiten Arrays unterschiedlich (PostgreSQL hat native Arrays, SQLite nicht). Um die Kompatibilität zu gewährleisten, definiert Bedrud einen StringArray-Typ in internal/models/user.go.
- Er implementiert
sql.Scannerunddriver.Valuer. - In PostgreSQL verwendet er den nativen
text[]-Typ. - In SQLite serialisiert er das Array in einen String (z. B.
{admin,user}) zur Speicherung.
Fremdschlüsselverwaltung
GORMs AutoMigrate verarbeitet keine zusammengesetzten Primärschlüssel (z. B. room_participants).
In internal/database/migrations.go führt Bedrud manuell ALTER TABLE-Anweisungen aus, um sicherzustellen, dass Fremdschlüssel-Beschränkungen (wie ON DELETE CASCADE) in der Produktion (PostgreSQL) korrekt angewendet werden.
Repository-Muster
Das Backend verwendet das Repository-Muster für den Datenbankzugriff. Handler rufen GORM nicht direkt auf – sie verwenden ein Repository.
Beispiel:
// In handler:
user, err := h.userRepo.GetByEmail(email)
// In repository:
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
}Automatische Migrationen
Beim Serverstart werden automatisch „AutoMigrate”-Operationen ausgeführt. Diese erstellen oder aktualisieren Datenbanktabellen basierend auf den Go-Strukturen in internal/models. Für einfache Schema-Änderungen sind keine manuellen CREATE TABLE-Anweisungen erforderlich.