612d68f56f
Go + Vue 管理台,SQLite 持久化;支持隧道/域名穿透、域名转发插件链、访客认证、 IP 规则、API Key、Docker 单镜像部署;配置通过 Web 系统设置管理,无需 YAML 文件。 Co-authored-by: Cursor <cursoragent@cursor.com>
72 lines
1.6 KiB
Go
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
|
|
}
|