Files
ai_proxy/server/service/app/ai_preset_binding.go
2026-03-03 06:05:51 +08:00

155 lines
4.0 KiB
Go

package app
import (
"errors"
"git.echol.cn/loser/ai_proxy/server/global"
"git.echol.cn/loser/ai_proxy/server/model/app"
"git.echol.cn/loser/ai_proxy/server/model/app/request"
"git.echol.cn/loser/ai_proxy/server/model/app/response"
"gorm.io/gorm"
)
type PresetBindingService struct{}
// CreateBinding 创建预设绑定
func (s *PresetBindingService) CreateBinding(req *request.CreateBindingRequest) error {
// 检查预设是否存在
var preset app.AiPreset
if err := global.GVA_DB.First(&preset, req.PresetID).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return errors.New("预设不存在")
}
return err
}
// 检查提供商是否存在
var provider app.AiProvider
if err := global.GVA_DB.First(&provider, req.ProviderID).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return errors.New("提供商不存在")
}
return err
}
// 检查是否已存在相同的绑定
var count int64
err := global.GVA_DB.Model(&app.AiPresetBinding{}).
Where("preset_id = ? AND provider_id = ?", req.PresetID, req.ProviderID).
Count(&count).Error
if err != nil {
return err
}
if count > 0 {
return errors.New("该绑定已存在")
}
binding := app.AiPresetBinding{
PresetID: req.PresetID,
ProviderID: req.ProviderID,
Priority: req.Priority,
IsActive: true,
}
return global.GVA_DB.Create(&binding).Error
}
// UpdateBinding 更新预设绑定
func (s *PresetBindingService) UpdateBinding(req *request.UpdateBindingRequest) error {
var binding app.AiPresetBinding
if err := global.GVA_DB.First(&binding, req.ID).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return errors.New("绑定不存在")
}
return err
}
updates := map[string]interface{}{
"priority": req.Priority,
"is_active": req.IsActive,
}
return global.GVA_DB.Model(&binding).Updates(updates).Error
}
// DeleteBinding 删除预设绑定
func (s *PresetBindingService) DeleteBinding(id uint) error {
var binding app.AiPresetBinding
if err := global.GVA_DB.First(&binding, id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return errors.New("绑定不存在")
}
return err
}
return global.GVA_DB.Delete(&binding).Error
}
// GetBindingList 获取绑定列表
func (s *PresetBindingService) GetBindingList(req *request.GetBindingListRequest) (list []response.BindingInfo, total int64, err error) {
db := global.GVA_DB.Model(&app.AiPresetBinding{})
// 条件查询
if req.ProviderID > 0 {
db = db.Where("provider_id = ?", req.ProviderID)
}
if req.PresetID > 0 {
db = db.Where("preset_id = ?", req.PresetID)
}
// 获取总数
err = db.Count(&total).Error
if err != nil {
return nil, 0, err
}
// 分页查询
if req.Page > 0 && req.PageSize > 0 {
offset := (req.Page - 1) * req.PageSize
db = db.Offset(offset).Limit(req.PageSize)
}
var bindings []app.AiPresetBinding
err = db.Preload("Preset").Preload("Provider").Order("priority ASC, created_at DESC").Find(&bindings).Error
if err != nil {
return nil, 0, err
}
// 转换为响应格式
list = make([]response.BindingInfo, len(bindings))
for i, binding := range bindings {
list[i] = response.BindingInfo{
ID: binding.ID,
PresetID: binding.PresetID,
PresetName: binding.Preset.Name,
ProviderID: binding.ProviderID,
ProviderName: binding.Provider.Name,
Priority: binding.Priority,
IsActive: binding.IsActive,
CreatedAt: binding.CreatedAt,
UpdatedAt: binding.UpdatedAt,
}
}
return list, total, nil
}
// GetBindingsByProvider 根据提供商获取绑定的预设列表
func (s *PresetBindingService) GetBindingsByProvider(providerID uint) ([]app.AiPreset, error) {
var bindings []app.AiPresetBinding
err := global.GVA_DB.Where("provider_id = ? AND is_active = ?", providerID, true).
Preload("Preset").
Order("priority ASC").
Find(&bindings).Error
if err != nil {
return nil, err
}
presets := make([]app.AiPreset, len(bindings))
for i, binding := range bindings {
presets[i] = binding.Preset
}
return presets, nil
}