Files
Meshray-Manager/internal/service/settings.go
T
2026-06-30 15:14:37 +08:00

129 lines
3.2 KiB
Go

package service
import (
"encoding/json"
"errors"
"fmt"
"git.zkcoi.com/zkcoi/meshray/internal/model"
sqlite "git.zkcoi.com/zkcoi/meshray/internal/store/sqlite"
"go.uber.org/zap"
"gorm.io/gorm"
)
// SettingsService 系统设置服务
type SettingsService struct {
store *sqlite.Store
logger *zap.Logger
}
// NewSettingsService 创建系统设置服务
func NewSettingsService(store *sqlite.Store, logger *zap.Logger) *SettingsService {
return &SettingsService{
store: store,
logger: logger,
}
}
// GetSettings 获取系统设置(单例)
func (s *SettingsService) GetSettings() (*model.SystemSetting, error) {
var setting model.SystemSetting
// 尝试查找 ID=1 的记录
result := s.store.DB().First(&setting, 1)
if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
// 如果不存在,创建默认设置
setting = model.SystemSetting{
ID: 1,
ServerIP: "",
ServerPort: 51820,
LogLevel: "info",
LogFormat: "console",
MaxBackups: 7,
MaxAge: 30,
Theme: "light",
Language: "zh-CN",
}
if err := s.store.DB().Create(&setting).Error; err != nil {
return nil, fmt.Errorf("创建默认设置失败:%w", err)
}
s.logger.Info("已创建默认系统设置")
return &setting, nil
}
return nil, fmt.Errorf("查询设置失败:%w", result.Error)
}
return &setting, nil
}
// UpdateSettings 更新系统设置
func (s *SettingsService) UpdateSettings(updates map[string]interface{}) (*model.SystemSetting, error) {
// 先获取现有设置
setting, err := s.GetSettings()
if err != nil {
return nil, err
}
// JSON 序列化 updates,确保数据有效
data, err := json.Marshal(updates)
if err != nil {
return nil, fmt.Errorf("序列化更新数据失败:%w", err)
}
// 反序列化到临时对象,过滤无效字段
var validUpdates map[string]interface{}
if err := json.Unmarshal(data, &validUpdates); err != nil {
return nil, fmt.Errorf("解析更新数据失败:%w", err)
}
// 移除敏感字段和不可变字段
delete(validUpdates, "id")
delete(validUpdates, "created_at")
delete(validUpdates, "updated_at")
// 构建 GORM 的 Updates map
updatesMap := make(map[string]interface{})
for key, value := range validUpdates {
// 驼峰转蛇形转换(可选,这里直接使用前端传来的键名)
updatesMap[key] = value
}
// 执行更新
if err := s.store.DB().Model(&setting).Updates(updatesMap).Error; err != nil {
return nil, fmt.Errorf("更新设置失败:%w", err)
}
s.logger.Info("系统设置已更新", zap.Any("updates", updates))
// 返回最新数据
return s.GetSettings()
}
// ResetSettings 重置为默认设置
func (s *SettingsService) ResetSettings() (*model.SystemSetting, error) {
_, err := s.GetSettings()
if err != nil {
return nil, err
}
defaultSetting := model.SystemSetting{
ID: 1,
ServerIP: "",
ServerPort: 51820,
LogLevel: "info",
LogFormat: "console",
MaxBackups: 7,
MaxAge: 30,
Theme: "light",
Language: "zh-CN",
}
if err := s.store.DB().Save(&defaultSetting).Error; err != nil {
return nil, fmt.Errorf("重置设置失败:%w", err)
}
s.logger.Info("系统设置已重置为默认值")
return &defaultSetting, nil
}