package app import ( "encoding/json" "errors" "git.echol.cn/loser/st/server/global" "git.echol.cn/loser/st/server/model/app" "git.echol.cn/loser/st/server/model/app/request" "git.echol.cn/loser/st/server/model/app/response" "gorm.io/datatypes" ) type AIPresetService struct{} // CreateAIPreset 创建预设 func (s *AIPresetService) CreateAIPreset(userID uint, req *request.CreateAIPresetRequest) (*app.AIPreset, error) { // 将 content 转换为 JSON configBytes, err := json.Marshal(req.Content) if err != nil { return nil, errors.New("配置格式错误") } preset := &app.AIPreset{ Name: req.Name, UserID: &userID, PresetType: req.Type, Config: datatypes.JSON(configBytes), IsSystem: false, IsDefault: false, } if err := global.GVA_DB.Create(preset).Error; err != nil { return nil, err } return preset, nil } // UpdateAIPreset 更新预设 func (s *AIPresetService) UpdateAIPreset(userID uint, presetID uint, req *request.UpdateAIPresetRequest) error { // 检查预设是否存在且属于当前用户 var preset app.AIPreset if err := global.GVA_DB.Where("id = ? AND user_id = ?", presetID, userID).First(&preset).Error; err != nil { return errors.New("预设不存在或无权限") } // 系统预设不允许修改 if preset.IsSystem { return errors.New("系统预设不允许修改") } // 将 content 转换为 JSON configBytes, err := json.Marshal(req.Content) if err != nil { return errors.New("配置格式错误") } // 更新 updates := map[string]interface{}{ "name": req.Name, "preset_type": req.Type, "config": datatypes.JSON(configBytes), } if err := global.GVA_DB.Model(&preset).Updates(updates).Error; err != nil { return err } return nil } // DeleteAIPreset 删除预设 func (s *AIPresetService) DeleteAIPreset(userID uint, presetID uint) error { // 检查预设是否存在且属于当前用户 var preset app.AIPreset if err := global.GVA_DB.Where("id = ? AND user_id = ?", presetID, userID).First(&preset).Error; err != nil { return errors.New("预设不存在或无权限") } // 系统预设不允许删除 if preset.IsSystem { return errors.New("系统预设不允许删除") } if err := global.GVA_DB.Delete(&preset).Error; err != nil { return err } return nil } // GetAIPreset 获取预设详情 func (s *AIPresetService) GetAIPreset(userID uint, presetID uint) (*response.AIPresetResponse, error) { var preset app.AIPreset // 可以查看自己的预设或系统预设 if err := global.GVA_DB.Where("id = ? AND (user_id = ? OR is_system = true)", presetID, userID).First(&preset).Error; err != nil { return nil, errors.New("预设不存在") } return response.ToAIPresetResponse(&preset), nil } // GetAIPresetList 获取预设列表 func (s *AIPresetService) GetAIPresetList(userID uint, req *request.AIPresetSearch) ([]response.AIPresetResponse, int64, error) { var presets []app.AIPreset var total int64 db := global.GVA_DB.Model(&app.AIPreset{}) // 只查询自己的预设和系统预设 db = db.Where("user_id = ? OR is_system = true", userID) // 搜索条件 if req.Name != "" { db = db.Where("name LIKE ?", "%"+req.Name+"%") } if req.Type != "" { db = db.Where("preset_type = ?", req.Type) } // 获取总数 if err := db.Count(&total).Error; err != nil { return nil, 0, err } // 分页查询 offset := (req.Page - 1) * req.PageSize if err := db.Order("is_default DESC, updated_at DESC"). Offset(offset). Limit(req.PageSize). Find(&presets).Error; err != nil { return nil, 0, err } // 转换为响应格式 var result []response.AIPresetResponse for _, preset := range presets { result = append(result, *response.ToAIPresetResponse(&preset)) } return result, total, nil } // DuplicateAIPreset 复制预设 func (s *AIPresetService) DuplicateAIPreset(userID uint, presetID uint) (*app.AIPreset, error) { // 获取原预设 var original app.AIPreset if err := global.GVA_DB.Where("id = ? AND (user_id = ? OR is_system = true)", presetID, userID).First(&original).Error; err != nil { return nil, errors.New("预设不存在") } // 创建副本 duplicate := &app.AIPreset{ Name: original.Name + " (副本)", UserID: &userID, PresetType: original.PresetType, Config: original.Config, IsSystem: false, IsDefault: false, } if err := global.GVA_DB.Create(duplicate).Error; err != nil { return nil, err } return duplicate, nil } // SetDefaultPreset 设置默认预设 func (s *AIPresetService) SetDefaultPreset(userID uint, presetID uint) error { // 检查预设是否存在且属于当前用户 var preset app.AIPreset if err := global.GVA_DB.Where("id = ? AND user_id = ?", presetID, userID).First(&preset).Error; err != nil { return errors.New("预设不存在或无权限") } // 开启事务 tx := global.GVA_DB.Begin() defer func() { if r := recover(); r != nil { tx.Rollback() } }() // 取消当前用户的所有默认预设 if err := tx.Model(&app.AIPreset{}).Where("user_id = ?", userID).Update("is_default", false).Error; err != nil { tx.Rollback() return err } // 设置新的默认预设 if err := tx.Model(&preset).Update("is_default", true).Error; err != nil { tx.Rollback() return err } return tx.Commit().Error }