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) }