199 lines
5.2 KiB
Go
199 lines
5.2 KiB
Go
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
|
|
}
|