ai-gateway/controller/token.go

258 lines
5.8 KiB
Go
Raw Normal View History

2023-04-23 03:31:00 +00:00
package controller
import (
2024-04-05 02:18:42 +00:00
"fmt"
2023-04-23 03:31:00 +00:00
"github.com/gin-gonic/gin"
2024-01-28 11:38:58 +00:00
"github.com/songquanpeng/one-api/common/config"
2024-04-21 11:43:23 +00:00
"github.com/songquanpeng/one-api/common/ctxkey"
2024-01-28 11:38:58 +00:00
"github.com/songquanpeng/one-api/common/helper"
2024-04-05 02:18:42 +00:00
"github.com/songquanpeng/one-api/common/network"
"github.com/songquanpeng/one-api/common/random"
2024-01-28 11:38:58 +00:00
"github.com/songquanpeng/one-api/model"
2023-04-23 03:31:00 +00:00
"net/http"
"strconv"
)
func GetAllTokens(c *gin.Context) {
2024-04-21 11:43:23 +00:00
userId := c.GetInt(ctxkey.Id)
2023-04-23 03:31:00 +00:00
p, _ := strconv.Atoi(c.Query("p"))
if p < 0 {
p = 0
}
order := c.Query("order")
tokens, err := model.GetAllUserTokens(userId, p*config.ItemsPerPage, config.ItemsPerPage, order)
2023-04-23 03:31:00 +00:00
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
"data": tokens,
})
return
}
func SearchTokens(c *gin.Context) {
2024-04-21 11:43:23 +00:00
userId := c.GetInt(ctxkey.Id)
2023-04-23 03:31:00 +00:00
keyword := c.Query("keyword")
tokens, err := model.SearchUserTokens(userId, keyword)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
"data": tokens,
})
return
}
func GetToken(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
2024-04-21 11:43:23 +00:00
userId := c.GetInt(ctxkey.Id)
2023-04-23 03:31:00 +00:00
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
2023-04-23 04:43:10 +00:00
token, err := model.GetTokenByIds(id, userId)
2023-04-23 03:31:00 +00:00
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
"data": token,
})
return
}
func GetTokenStatus(c *gin.Context) {
2024-04-21 11:43:23 +00:00
tokenId := c.GetInt(ctxkey.TokenId)
userId := c.GetInt(ctxkey.Id)
token, err := model.GetTokenByIds(tokenId, userId)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
expiredAt := token.ExpiredTime
if expiredAt == -1 {
expiredAt = 0
}
c.JSON(http.StatusOK, gin.H{
"object": "credit_summary",
"total_granted": token.RemainQuota,
"total_used": 0, // not supported currently
"total_available": token.RemainQuota,
"expires_at": expiredAt * 1000,
})
}
2024-04-05 02:18:42 +00:00
func validateToken(c *gin.Context, token model.Token) error {
if len(token.Name) > 30 {
return fmt.Errorf("令牌名称过长")
}
if token.Subnet != nil && *token.Subnet != "" {
2024-04-05 09:25:28 +00:00
err := network.IsValidSubnets(*token.Subnet)
2024-04-05 02:18:42 +00:00
if err != nil {
return fmt.Errorf("无效的网段:%s", err.Error())
}
}
return nil
}
2023-04-23 03:31:00 +00:00
func AddToken(c *gin.Context) {
token := model.Token{}
err := c.ShouldBindJSON(&token)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
2024-04-05 02:18:42 +00:00
err = validateToken(c, token)
if err != nil {
2023-04-23 04:43:10 +00:00
c.JSON(http.StatusOK, gin.H{
"success": false,
2024-04-05 02:18:42 +00:00
"message": fmt.Sprintf("参数错误:%s", err.Error()),
2023-04-23 04:43:10 +00:00
})
return
}
2024-04-05 02:18:42 +00:00
2023-04-23 04:43:10 +00:00
cleanToken := model.Token{
2024-04-21 11:43:23 +00:00
UserId: c.GetInt(ctxkey.Id),
Name: token.Name,
Key: random.GenerateKey(),
CreatedTime: helper.GetTimestamp(),
AccessedTime: helper.GetTimestamp(),
ExpiredTime: token.ExpiredTime,
RemainQuota: token.RemainQuota,
UnlimitedQuota: token.UnlimitedQuota,
2024-04-04 03:18:21 +00:00
Models: token.Models,
Subnet: token.Subnet,
2023-04-23 04:43:10 +00:00
}
err = cleanToken.Insert()
2023-04-23 03:31:00 +00:00
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
"data": cleanToken,
2023-04-23 03:31:00 +00:00
})
return
}
func DeleteToken(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
2024-04-21 11:43:23 +00:00
userId := c.GetInt(ctxkey.Id)
2023-04-23 04:43:10 +00:00
err := model.DeleteTokenById(id, userId)
2023-04-23 03:31:00 +00:00
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
})
return
}
func UpdateToken(c *gin.Context) {
2024-04-21 11:43:23 +00:00
userId := c.GetInt(ctxkey.Id)
statusOnly := c.Query("status_only")
2023-04-23 03:31:00 +00:00
token := model.Token{}
err := c.ShouldBindJSON(&token)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
2024-04-05 02:18:42 +00:00
err = validateToken(c, token)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
2024-04-05 02:18:42 +00:00
"message": fmt.Sprintf("参数错误:%s", err.Error()),
})
return
}
2023-04-23 04:43:10 +00:00
cleanToken, err := model.GetTokenByIds(token.Id, userId)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
2024-04-05 18:03:59 +00:00
if token.Status == model.TokenStatusEnabled {
if cleanToken.Status == model.TokenStatusExpired && cleanToken.ExpiredTime <= helper.GetTimestamp() && cleanToken.ExpiredTime != -1 {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": "令牌已过期,无法启用,请先修改令牌过期时间,或者设置为永不过期",
})
return
}
2024-04-05 18:03:59 +00:00
if cleanToken.Status == model.TokenStatusExhausted && cleanToken.RemainQuota <= 0 && !cleanToken.UnlimitedQuota {
c.JSON(http.StatusOK, gin.H{
"success": false,
2023-05-16 04:09:17 +00:00
"message": "令牌可用额度已用尽,无法启用,请先修改令牌剩余额度,或者设置为无限额度",
})
return
}
}
if statusOnly != "" {
cleanToken.Status = token.Status
} else {
// If you add more fields, please also update token.Update()
cleanToken.Name = token.Name
cleanToken.ExpiredTime = token.ExpiredTime
2023-05-16 04:09:17 +00:00
cleanToken.RemainQuota = token.RemainQuota
cleanToken.UnlimitedQuota = token.UnlimitedQuota
cleanToken.Models = token.Models
cleanToken.Subnet = token.Subnet
}
2023-04-23 04:43:10 +00:00
err = cleanToken.Update()
2023-04-23 03:31:00 +00:00
if err != nil {
c.JSON(http.StatusOK, gin.H{
"success": false,
"message": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"message": "",
2023-04-23 04:43:10 +00:00
"data": cleanToken,
2023-04-23 03:31:00 +00:00
})
return
}