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