Files
st/server/service/app/ai_preset.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
}