Files
Wormhole/internal/store/settings.go
T
rose_cat707 612d68f56f feat: Wormhole 内网穿透与反向代理网关
Go + Vue 管理台,SQLite 持久化;支持隧道/域名穿透、域名转发插件链、访客认证、
IP 规则、API Key、Docker 单镜像部署;配置通过 Web 系统设置管理,无需 YAML 文件。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-23 12:15:02 +08:00

72 lines
1.6 KiB
Go

package store
import (
"encoding/json"
"errors"
"time"
"github.com/wormhole/wormhole/internal/config"
"gorm.io/gorm"
)
const systemSettingsID = 1
type SystemSettings struct {
ID uint `gorm:"primaryKey" json:"id"`
Payload string `gorm:"type:text;not null" json:"-"`
UpdatedAt time.Time `json:"updated_at"`
}
func (s *Store) ensureSystemSettings() error {
var row SystemSettings
err := s.db.First(&row, systemSettingsID).Error
if err == nil {
return nil
}
if !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
cfg := config.Default()
payload, err := json.Marshal(cfg)
if err != nil {
return err
}
return s.db.Create(&SystemSettings{
ID: systemSettingsID,
Payload: string(payload),
}).Error
}
func (s *Store) LoadConfig() (*config.Config, error) {
if err := s.ensureSystemSettings(); err != nil {
return nil, err
}
var row SystemSettings
if err := s.db.First(&row, systemSettingsID).Error; err != nil {
return nil, err
}
cfg := config.Default()
if err := json.Unmarshal([]byte(row.Payload), cfg); err != nil {
return nil, err
}
cfg.Database.Path = config.DefaultDBPath
cfg.Normalize()
return cfg, nil
}
func (s *Store) SaveConfig(cfg *config.Config) error {
if err := s.ensureSystemSettings(); err != nil {
return err
}
cfg.Database.Path = config.DefaultDBPath
cfg.Normalize()
payload, err := json.Marshal(cfg)
if err != nil {
return err
}
return s.db.Model(&SystemSettings{}).Where("id = ?", systemSettingsID).Updates(map[string]interface{}{
"payload": string(payload),
"updated_at": time.Now(),
}).Error
}