Files
b2b/app/db/mariadb.go
2026-03-11 15:24:00 +01:00

112 lines
2.8 KiB
Go

package db
import (
"fmt"
"log"
"log/slog"
"git.ma-al.com/goc_daniel/b2b/app/config"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var DB *gorm.DB
func init() {
if DB == nil {
dbconn, err := newMySQLDB(&config.Get().Database)
if err != nil {
slog.Error("⚠️ No connection to database was possible to establish", "error", err.Error())
}
DB = dbconn
}
}
func Get() *gorm.DB {
return DB
}
// newMySQLDB creates a new MariaDB/MySQL database connection
func newMySQLDB(cfg *config.DatabaseConfig) (*gorm.DB, error) {
dsn := cfg.GetDSN()
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Error),
})
if err != nil {
return nil, fmt.Errorf("failed to connect to database: %w", err)
}
sqlDB, err := db.DB()
if err != nil {
return nil, fmt.Errorf("failed to get database instance: %w", err)
}
// Connection pool settings
sqlDB.SetMaxIdleConns(cfg.MaxIdleConns)
sqlDB.SetMaxOpenConns(cfg.MaxOpenConns)
sqlDB.SetConnMaxLifetime(cfg.ConnMaxLifetime)
log.Println("✓ Database connection established successfully")
return db, nil
}
// // RunMigrations runs all database migrations
// func RunMigrations() error {
// if DB == nil {
// return fmt.Errorf("database connection not established")
// }
// log.Println("Running database migrations...")
// // Add your models here for AutoMigrate
// // Example: err := db.AutoMigrate(&model.Customer{})
// err := DB.AutoMigrate(&model.Customer{})
// if err != nil {
// return fmt.Errorf("failed to run migrations: %w", err)
// }
// log.Println("✓ Database migrations completed successfully")
// return nil
// }
// // SeedAdminUser creates a default admin user if one doesn't exist
// // Call this function with admin credentials after migrations
// func SeedAdminUser(adminEmail, adminPassword string) error {
// log.Println("✓ Admin seeding ready - implement with your User model")
// // Example implementation when you have a User model:
// // var count int64
// // db.Model(&model.User{}).Where("role = ?", "admin").Count(&count)
// // if count > 0 {
// // log.Println("✓ Admin user already exists")
// // return nil
// // }
// // hashedPassword, err := bcrypt.GenerateFromPassword([]byte(adminPassword), bcrypt.DefaultCost)
// // if err != nil {
// // return fmt.Errorf("failed to hash password: %w", err)
// // }
// // admin := model.User{
// // Email: adminEmail,
// // Password: string(hashedPassword),
// // Role: "admin",
// // IsActive: true,
// // }
// // if err := db.Create(&admin).Error; err != nil {
// // return err
// // }
// // log.Printf("✓ Created admin user: %s", adminEmail)
// // Suppress unused variable warning
// _, _ = bcrypt.GenerateFromPassword([]byte(adminPassword), bcrypt.DefaultCost)
// return nil
// }