Files
ai_proxy/server/service/app/ai_api_key.go

108 lines
3.0 KiB
Go

package app
import (
"crypto/rand"
"encoding/hex"
"fmt"
"time"
"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/common/request"
)
type AiApiKeyService struct{}
// GenerateApiKey 生成API密钥
func (s *AiApiKeyService) GenerateApiKey() string {
bytes := make([]byte, 32)
rand.Read(bytes)
return "sk-" + hex.EncodeToString(bytes)
}
// CreateAiApiKey 创建API密钥
func (s *AiApiKeyService) CreateAiApiKey(apiKey *app.AiApiKey) error {
if apiKey.Key == "" {
apiKey.Key = s.GenerateApiKey()
}
return global.GVA_DB.Create(apiKey).Error
}
// DeleteAiApiKey 删除API密钥
func (s *AiApiKeyService) DeleteAiApiKey(id uint, userID uint) error {
return global.GVA_DB.Where("id = ? AND user_id = ?", id, userID).Delete(&app.AiApiKey{}).Error
}
// UpdateAiApiKey 更新API密钥
func (s *AiApiKeyService) UpdateAiApiKey(apiKey *app.AiApiKey, userID uint) error {
return global.GVA_DB.Where("user_id = ?", userID).Updates(apiKey).Error
}
// GetAiApiKey 查询API密钥
func (s *AiApiKeyService) GetAiApiKey(id uint, userID uint) (apiKey app.AiApiKey, err error) {
err = global.GVA_DB.Where("id = ? AND user_id = ?", id, userID).First(&apiKey).Error
return
}
// GetAiApiKeyList 获取API密钥列表
func (s *AiApiKeyService) GetAiApiKeyList(info request.PageInfo, userID uint) (list []app.AiApiKey, total int64, err error) {
limit := info.PageSize
offset := info.PageSize * (info.Page - 1)
db := global.GVA_DB.Model(&app.AiApiKey{}).Where("user_id = ?", userID)
err = db.Count(&total).Error
if err != nil {
return
}
err = db.Limit(limit).Offset(offset).Order("id desc").Find(&list).Error
return
}
// ValidateApiKey 验证API密钥
func (s *AiApiKeyService) ValidateApiKey(key string) (*app.AiApiKey, error) {
var apiKey app.AiApiKey
if err := global.GVA_DB.Where("key = ? AND enabled = ?", key, true).First(&apiKey).Error; err != nil {
return nil, fmt.Errorf("无效的API密钥")
}
// 检查是否过期
if apiKey.ExpiresAt != nil && time.Now().Unix() > *apiKey.ExpiresAt {
return nil, fmt.Errorf("API密钥已过期")
}
return &apiKey, nil
}
// CheckModelPermission 检查模型权限
func (s *AiApiKeyService) CheckModelPermission(apiKey *app.AiApiKey, model string) bool {
// 如果没有限制,允许所有模型
if len(apiKey.AllowedModels) == 0 {
return true
}
// 检查模型是否在允许列表中
for _, allowedModel := range apiKey.AllowedModels {
if allowedModel == model || allowedModel == "*" {
return true
}
}
return false
}
// CheckPresetPermission 检查预设权限
func (s *AiApiKeyService) CheckPresetPermission(apiKey *app.AiApiKey, presetName string) bool {
// 如果没有限制,允许所有预设
if len(apiKey.AllowedPresets) == 0 {
return true
}
// 检查预设是否在允许列表中
for _, allowedPreset := range apiKey.AllowedPresets {
if allowedPreset == presetName || allowedPreset == "*" {
return true
}
}
return false
}