Files
sheetless-server/src/database/connection.go

75 lines
1.8 KiB
Go

package database
import (
"log"
"path/filepath"
"sheetless-server/config"
"sheetless-server/models"
"golang.org/x/crypto/bcrypt"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
var DB *gorm.DB
func InitDatabase() {
var err error
databaseFile := filepath.Join(config.AppConfig.ConfigDirectory, "sheetless.db")
DB, err = gorm.Open(sqlite.Open(databaseFile), &gorm.Config{})
if err != nil {
log.Fatal("Failed to connect to database:", err)
}
tables, err := DB.Migrator().GetTables()
if err != nil {
log.Fatal("Failed to list tables of database:", err)
}
isNewDatabase := len(tables) == 0
// Auto migrate the schema
err = DB.AutoMigrate(&models.User{}, &models.Sheet{}, &models.Composer{})
if err != nil {
log.Fatal("Failed to migrate database:", err)
}
if isNewDatabase {
createDefaultAdminUser()
}
log.Println("Database connected and migrated successfully")
}
func createDefaultAdminUser() {
// Check if admin user already exists
var existingUser models.User
err := DB.Where("email = ?", config.AppConfig.Admin.Email).First(&existingUser).Error
if err == nil {
// Admin user already exists, don't recreate
log.Printf("Admin user already exists: %s", config.AppConfig.Admin.Email)
return
}
// Hash the admin password
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(config.AppConfig.Admin.Password), bcrypt.DefaultCost)
if err != nil {
log.Printf("Failed to hash admin password: %v", err)
return
}
// Create admin user
adminUser := models.User{
Username: "admin",
Email: config.AppConfig.Admin.Email,
Password: string(hashedPassword),
}
if err := DB.Create(&adminUser).Error; err != nil {
log.Printf("Failed to create admin user: %v", err)
return
}
log.Printf("Default admin user created with email: %s", config.AppConfig.Admin.Email)
}