Bedrud از GORM به عنوان ORM استفاده میکند و هم SQLite و هم PostgreSQL را پشتیبانی میکند.
دیتابیسهای پشتیبانیشده
- SQLite: بهطور پیشفرض برای توسعه آسان و نصبهای کوچک استفاده میشود. دیتابیس در یک فایل ذخیره میشود (معمولاً
bedrud.db). - PostgreSQL: برای محیطهای تولید با کاربران زیاد توصیه میشود.
نوع دیتابیس و جزئیات اتصال را در config.yaml زیر بخش database: پیکربندی کنید.
ساختار فایل SQLite
هنگام استفاده از SQLite، Bedrud حالت WAL (Write-Ahead Log) را برای عملکرد بهتر خواندن همزمان فعال میکند. این دو فایل اضافی در کنار دیتابیس اصلی ایجاد میکند:
| فایل | هدف |
|---|---|
bedrud-local.db | فایل اصلی دیتابیس |
bedrud-local.db-shm | فایل حافظه مشترک — دسترسی بین خوانندگان و نویسندگان را هماهنگ میکند |
bedrud-local.db-wal | Write-Ahead Log — نوشتههای جدید ابتدا به اینجا میروند، سپس به دیتابیس اصلی منتقل میشوند |
این فایلها طبیعی هستند. هنگام شروع سرور به طور خودکار ایجاد و در خاموشسازی تمیز پاک میشوند. اگر سرور خراب شود، SQLite به طور خودکار بازیابی میکند — بدون از دست دادن داده.
برای غیرفعال کردن حالت WAL (توصیه نمیشود)، PRAGMA journal_mode=DELETE; را در تنظیمات SQLite قرار دهید، اما انتظار خواندن همزمان کندتر را داشته باشید.
مدلهای اصلی
مدلها در 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 دستی نیست.