initial: ZeroTier-like P2P mesh VPN server with multi-tenant Web UI
This commit is contained in:
84
internal/database/database.go
Normal file
84
internal/database/database.go
Normal file
@@ -0,0 +1,84 @@
|
||||
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")
|
||||
}
|
||||
Reference in New Issue
Block a user