129 lines
3.2 KiB
Go
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
|
|
}
|