155 lines
4.0 KiB
Go
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
|
|
}
|