Bedrud از GORM به عنوان ORM استفاده میکند و هم SQLite و هم PostgreSQL را پشتیبانی میکند.
دیتابیسهای پشتیبانیشده
- SQLite: بهطور پیشفرض برای توسعه آسان و نصبهای کوچک استفاده میشود. دیتابیس در یک فایل ذخیره میشود (معمولاً
bedrud.db). - PostgreSQL: برای محیطهای تولید با کاربران زیاد توصیه میشود.
نوع دیتابیس و جزئیات اتصال را در config.yaml زیر بخش database: پیکربندی کنید.
مدلهای اصلی
مدلها در internal/models/ قرار دارند. مهمترین آنها:
User (user.go)
اطلاعات حساب شامل credentials و نقشها را ذخیره میکند.
Room (room.go)
یک جلسه جلسه را نشان میدهد. از Embedded Structهای GORM برای سازماندهی تنظیمات استفاده میکند.
بهجای یک جدول جداگانه یا blob JSON، فیلدهای RoomSettings (مثل allow_chat، allow_video) مستقیماً در جدول rooms با پیشوند settings_ ذخیره میشوند (مثلاً settings_allow_chat). این یک مدل تمیز در Go فراهم میکند و همزمان ساختار دیتابیس flat و کارآمد را حفظ میکند.
Passkey (passkey.go)
کلیدهای عمومی FIDO2/WebAuthn را برای ورود بدون رمز عبور ذخیره میکند.
نوع سفارشی: StringArray
دیتابیسهای SQL استاندارد آرایهها را متفاوت مدیریت میکنند (PostgreSQL آرایه بومی دارد، SQLite ندارد). برای حفظ سازگاری، Bedrud نوع StringArray را در internal/models/user.go تعریف کرده است.
sql.Scannerوdriver.Valuerرا پیادهسازی میکند.- در PostgreSQL از نوع بومی
text[]استفاده میکند. - در SQLite آرایه را به string سریالایز میکند (مثلاً
{admin,user}) برای ذخیرهسازی.
مدیریت Foreign Key
AutoMigrate در GORM کلیدهای اصلی ترکیبی (مثل room_participants) را مدیریت نمیکند.
در internal/database/migrations.go، Bedrud با اجرای دستی ALTER TABLE مطمئن میشود که محدودیتهای foreign key (مثل ON DELETE CASCADE) بهدرستی در تولید (PostgreSQL) اعمال شدهاند.
الگوی Repository
backend از الگوی Repository برای دسترسی به دیتابیس استفاده میکند. Handlerها مستقیماً با GORM صحبت نمیکنند — از یک repository استفاده میکنند.
مثال:
// در handler:
user, err := h.userRepo.GetByEmail(email)
// در 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
}Migration خودکار
هنگام شروع سرور، AutoMigrate بهطور خودکار اجرا میشود. این کار جداول دیتابیس را بر اساس ساختارهای Go در internal/models ایجاد یا بهروزرسانی میکند. برای تغییرات ساده schema نیازی به CREATE TABLE دستی نیست.