Files
zeromesh/internal/database/database.go

85 lines
1.5 KiB
Go

package database
import (
"fmt"
"log/slog"
"gorm.io/driver/mysql"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"zeromesh/internal/config"
"zeromesh/internal/model"
)
type DB struct {
*gorm.DB
}
func Init(cfg *config.DatabaseConfig) (*DB, error) {
var db *gorm.DB
var err error
switch cfg.Driver {
case "mysql":
dsn := cfg.BuildDSN()
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
case "sqlite":
fallthrough
default:
db, err = gorm.Open(sqlite.Open(cfg.SQLite.Path), &gorm.Config{})
}
if err != nil {
return nil, fmt.Errorf("open database: %w", err)
}
sqlDB, err := db.DB()
if err != nil {
return nil, fmt.Errorf("get sql db: %w", err)
}
if cfg.Driver == "mysql" {
sqlDB.SetMaxIdleConns(cfg.MySQL.MaxIdleConns)
sqlDB.SetMaxOpenConns(cfg.MySQL.MaxOpenConns)
}
if cfg.AutoMigrate {
if err := db.AutoMigrate(
&model.User{},
&model.Network{},
&model.NetworkMember{},
&model.Node{},
&model.Config{},
&model.ApiLog{},
&model.ErrorLog{},
); err != nil {
return nil, fmt.Errorf("auto migrate: %w", err)
}
}
if cfg.InitData {
seedData(db)
}
slog.Info("database initialized", "driver", cfg.Driver)
return &DB{db}, nil
}
func seedData(db *gorm.DB) {
var count int64
db.Model(&model.Config{}).Count(&count)
if count > 0 {
return
}
defaults := []model.Config{
{Key: "allow_register", Value: "true"},
{Key: "default_network_pool", Value: "10.147.0.0/16"},
}
for _, c := range defaults {
db.Create(&c)
}
slog.Info("seed data inserted")
}