ソースを参照

Fix channel model length issue

Fixes #691

---

For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/Calcium-Ion/new-api/issues/691?shareId=XXXX-XXXX-XXXX-XXXX).
Calcium-Ion 1 年間 前
コミット
239bc46965
3 ファイル変更102 行追加91 行削除
  1. 11 0
      controller/channel.go
  2. 1 1
      model/ability.go
  3. 90 90
      model/cache.go

+ 11 - 0
controller/channel.go

@@ -274,6 +274,17 @@ func AddChannel(c *gin.Context) {
 		}
 		localChannel := channel
 		localChannel.Key = key
+		// Validate the length of the model name
+		models := strings.Split(localChannel.Models, ",")
+		for _, model := range models {
+			if len(model) > 256 {
+				c.JSON(http.StatusOK, gin.H{
+					"success": false,
+					"message": fmt.Sprintf("模型名称过长: %s", model),
+				})
+				return
+			}
+		}
 		channels = append(channels, localChannel)
 	}
 	err = model.BatchInsertChannels(channels)

+ 1 - 1
model/ability.go

@@ -12,7 +12,7 @@ import (
 
 type Ability struct {
 	Group     string  `json:"group" gorm:"type:varchar(64);primaryKey;autoIncrement:false"`
-	Model     string  `json:"model" gorm:"type:varchar(64);primaryKey;autoIncrement:false"`
+	Model     string  `json:"model" gorm:"type:varchar(256);primaryKey;autoIncrement:false"`
 	ChannelId int     `json:"channel_id" gorm:"primaryKey;autoIncrement:false;index"`
 	Enabled   bool    `json:"enabled"`
 	Priority  *int64  `json:"priority" gorm:"bigint;default:0;index"`

+ 90 - 90
model/cache.go

@@ -14,102 +14,102 @@ import (
 //func CacheGetUserGroup(id int) (group string, err error) {
 //	if !common.RedisEnabled {
 //		return GetUserGroup(id)
-//	}
-//	group, err = common.RedisGet(fmt.Sprintf("user_group:%d", id))
-//	if err != nil {
-//		group, err = GetUserGroup(id)
-//		if err != nil {
-//			return "", err
-//		}
-//		err = common.RedisSet(fmt.Sprintf("user_group:%d", id), group, time.Duration(constant.UserId2GroupCacheSeconds)*time.Second)
-//		if err != nil {
-//			common.SysError("Redis set user group error: " + err.Error())
-//		}
-//	}
-//	return group, err
-//}
+	//	}
+	//	group, err = common.RedisGet(fmt.Sprintf("user_group:%d", id))
+	//	if err != nil {
+	//		group, err = GetUserGroup(id)
+	//		if err != nil {
+	//			return "", err
+	//		}
+	//		err = common.RedisSet(fmt.Sprintf("user_group:%d", id), group, time.Duration(constant.UserId2GroupCacheSeconds)*time.Second)
+	//		if err != nil {
+	//			common.SysError("Redis set user group error: " + err.Error())
+	//		}
+	//	}
+	//	return group, err
+	//}
 //
-//func CacheGetUsername(id int) (username string, err error) {
-//	if !common.RedisEnabled {
-//		return GetUsernameById(id)
-//	}
-//	username, err = common.RedisGet(fmt.Sprintf("user_name:%d", id))
-//	if err != nil {
-//		username, err = GetUsernameById(id)
-//		if err != nil {
-//			return "", err
-//		}
-//		err = common.RedisSet(fmt.Sprintf("user_name:%d", id), username, time.Duration(constant.UserId2GroupCacheSeconds)*time.Second)
-//		if err != nil {
-//			common.SysError("Redis set user group error: " + err.Error())
-//		}
-//	}
-//	return username, err
-//}
+	//func CacheGetUsername(id int) (username string, err error) {
+	//	if !common.RedisEnabled {
+	//		return GetUsernameById(id)
+	//	}
+	//	username, err = common.RedisGet(fmt.Sprintf("user_name:%d", id))
+	//	if err != nil {
+	//		username, err = GetUsernameById(id)
+	//		if err != nil {
+	//			return "", err
+	//		}
+	//		err = common.RedisSet(fmt.Sprintf("user_name:%d", id), username, time.Duration(constant.UserId2GroupCacheSeconds)*time.Second)
+	//		if err != nil {
+	//			common.SysError("Redis set user group error: " + err.Error())
+	//		}
+	//	}
+	//	return username, err
+	//}
 //
-//func CacheGetUserQuota(id int) (quota int, err error) {
-//	if !common.RedisEnabled {
-//		return GetUserQuota(id)
-//	}
-//	quotaString, err := common.RedisGet(fmt.Sprintf("user_quota:%d", id))
-//	if err != nil {
-//		quota, err = GetUserQuota(id)
-//		if err != nil {
-//			return 0, err
-//		}
-//		return quota, nil
-//	}
-//	quota, err = strconv.Atoi(quotaString)
-//	return quota, nil
-//}
+	//func CacheGetUserQuota(id int) (quota int, err error) {
+	//	if !common.RedisEnabled {
+	//		return GetUserQuota(id)
+	//	}
+	//	quotaString, err := common.RedisGet(fmt.Sprintf("user_quota:%d", id))
+	//	if err != nil {
+	//		quota, err = GetUserQuota(id)
+	//		if err != nil {
+	//			return 0, err
+	//		}
+	//		return quota, nil
+	//	}
+	//	quota, err = strconv.Atoi(quotaString)
+	//	return quota, nil
+	//}
 //
-//func CacheUpdateUserQuota(id int) error {
-//	if !common.RedisEnabled {
-//		return nil
-//	}
-//	quota, err := GetUserQuota(id)
-//	if err != nil {
-//		return err
-//	}
-//	return cacheSetUserQuota(id, quota)
-//}
+	//func CacheUpdateUserQuota(id int) error {
+	//	if !common.RedisEnabled {
+	//		return nil
+	//	}
+	//	quota, err := GetUserQuota(id)
+	//	if err != nil {
+	//		return err
+	//	}
+	//	return cacheSetUserQuota(id, quota)
+	//}
 //
-//func cacheSetUserQuota(id int, quota int) error {
-//	err := common.RedisSet(fmt.Sprintf("user_quota:%d", id), fmt.Sprintf("%d", quota), time.Duration(constant.UserId2QuotaCacheSeconds)*time.Second)
-//	return err
-//}
+	//func cacheSetUserQuota(id int, quota int) error {
+	//	err := common.RedisSet(fmt.Sprintf("user_quota:%d", id), fmt.Sprintf("%d", quota), time.Duration(constant.UserId2QuotaCacheSeconds)*time.Second)
+	//	return err
+	//}
 //
-//func CacheDecreaseUserQuota(id int, quota int) error {
-//	if !common.RedisEnabled {
-//		return nil
-//	}
-//	err := common.RedisDecrease(fmt.Sprintf("user_quota:%d", id), int64(quota))
-//	return err
-//}
+	//func CacheDecreaseUserQuota(id int, quota int) error {
+	//	if !common.RedisEnabled {
+	//		return nil
+	//	}
+	//	err := common.RedisDecrease(fmt.Sprintf("user_quota:%d", id), int64(quota))
+	//	return err
+	//}
 //
-//func CacheIsUserEnabled(userId int) (bool, error) {
-//	if !common.RedisEnabled {
-//		return IsUserEnabled(userId)
-//	}
-//	enabled, err := common.RedisGet(fmt.Sprintf("user_enabled:%d", userId))
-//	if err == nil {
-//		return enabled == "1", nil
-//	}
+	//func CacheIsUserEnabled(userId int) (bool, error) {
+	//	if !common.RedisEnabled {
+	//		return IsUserEnabled(userId)
+	//	}
+	//	enabled, err := common.RedisGet(fmt.Sprintf("user_enabled:%d", userId))
+	//	if err == nil {
+	//		return enabled == "1", nil
+	//	}
 //
-//	userEnabled, err := IsUserEnabled(userId)
-//	if err != nil {
-//		return false, err
-//	}
-//	enabled = "0"
-//	if userEnabled {
-//		enabled = "1"
-//	}
-//	err = common.RedisSet(fmt.Sprintf("user_enabled:%d", userId), enabled, time.Duration(constant.UserId2StatusCacheSeconds)*time.Second)
-//	if err != nil {
-//		common.SysError("Redis set user enabled error: " + err.Error())
-//	}
-//	return userEnabled, err
-//}
+	//	userEnabled, err := IsUserEnabled(userId)
+	//	if err != nil {
+	//		return false, err
+	//	}
+	//	enabled = "0"
+	//	if userEnabled {
+	//		enabled = "1"
+	//	}
+	//	err = common.RedisSet(fmt.Sprintf("user_enabled:%d", userId), enabled, time.Duration(constant.UserId2StatusCacheSeconds)*time.Second)
+	//	if err != nil {
+	//		common.SysError("Redis set user enabled error: " + err.Error())
+	//	}
+	//	return userEnabled, err
+	//}
 
 var group2model2channels map[string]map[string][]*Channel
 var channelsIDM map[int]*Channel
@@ -181,7 +181,7 @@ func CacheGetRandomSatisfiedChannel(group string, model string, retry int) (*Cha
 	}
 
 	// if memory cache is disabled, get channel directly from database
-	if !common.MemoryCacheEnabled {
+	if (!common.MemoryCacheEnabled) {
 		return GetRandomSatisfiedChannel(group, model, retry)
 	}
 	channelSyncLock.RLock()