Initial commit
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user