mirror of
https://github.com/HugeFrog24/go-telegram-bot.git
synced 2026-03-02 00:14:34 +00:00
md formatting doesnt work yet Started implementing owner feature Add .gitattributes to enforce LF line endings Temporary commit before merge Updated owner management Updated json and gitignore Proceed with role management Again, CI Fix some lint errors Implemented screening Per-bot API keys implemented Use getRoleByName func Fix unused imports Upgrade actions rm unused function Upgrade action Fix unaddressed errors
64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
func initDB() (*gorm.DB, error) {
|
|
newLogger := logger.New(
|
|
log.New(log.Writer(), "\r\n", log.LstdFlags),
|
|
logger.Config{
|
|
SlowThreshold: time.Second,
|
|
LogLevel: logger.Info,
|
|
Colorful: false,
|
|
},
|
|
)
|
|
|
|
db, err := gorm.Open(sqlite.Open("bot.db"), &gorm.Config{
|
|
Logger: newLogger,
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to connect to database: %w", err)
|
|
}
|
|
|
|
// AutoMigrate the models
|
|
err = db.AutoMigrate(&BotModel{}, &ConfigModel{}, &Message{}, &User{}, &Role{})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to migrate database schema: %w", err)
|
|
}
|
|
|
|
// Enforce unique owner per bot using raw SQL
|
|
// Note: SQLite doesn't support partial indexes, but we can simulate it by making a unique index on (BotID, IsOwner)
|
|
// and ensuring that IsOwner can only be true for one user per BotID.
|
|
// This approach allows multiple users with IsOwner=false for the same BotID,
|
|
// but only one user can have IsOwner=true per BotID.
|
|
err = db.Exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_bot_owner ON users (bot_id, is_owner) WHERE is_owner = 1;`).Error
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create unique index for bot owners: %w", err)
|
|
}
|
|
|
|
err = createDefaultRoles(db)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return db, nil
|
|
}
|
|
|
|
func createDefaultRoles(db *gorm.DB) error {
|
|
roles := []string{"user", "admin", "owner"}
|
|
for _, roleName := range roles {
|
|
var role Role
|
|
if err := db.FirstOrCreate(&role, Role{Name: roleName}).Error; err != nil {
|
|
return fmt.Errorf("failed to create default role %s: %w", roleName, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|