1
0

token.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. package controller
  2. import (
  3. "net/http"
  4. "one-api/common"
  5. "one-api/model"
  6. "strconv"
  7. "github.com/gin-gonic/gin"
  8. )
  9. func GetAllTokens(c *gin.Context) {
  10. userId := c.GetInt("id")
  11. pageInfo := common.GetPageQuery(c)
  12. tokens, err := model.GetAllUserTokens(userId, pageInfo.GetStartIdx(), pageInfo.GetPageSize())
  13. if err != nil {
  14. common.ApiError(c, err)
  15. return
  16. }
  17. total, _ := model.CountUserTokens(userId)
  18. pageInfo.SetTotal(int(total))
  19. pageInfo.SetItems(tokens)
  20. common.ApiSuccess(c, pageInfo)
  21. return
  22. }
  23. func SearchTokens(c *gin.Context) {
  24. userId := c.GetInt("id")
  25. keyword := c.Query("keyword")
  26. token := c.Query("token")
  27. tokens, err := model.SearchUserTokens(userId, keyword, token)
  28. if err != nil {
  29. common.ApiError(c, err)
  30. return
  31. }
  32. c.JSON(http.StatusOK, gin.H{
  33. "success": true,
  34. "message": "",
  35. "data": tokens,
  36. })
  37. return
  38. }
  39. func GetToken(c *gin.Context) {
  40. id, err := strconv.Atoi(c.Param("id"))
  41. userId := c.GetInt("id")
  42. if err != nil {
  43. common.ApiError(c, err)
  44. return
  45. }
  46. token, err := model.GetTokenByIds(id, userId)
  47. if err != nil {
  48. common.ApiError(c, err)
  49. return
  50. }
  51. c.JSON(http.StatusOK, gin.H{
  52. "success": true,
  53. "message": "",
  54. "data": token,
  55. })
  56. return
  57. }
  58. func GetTokenStatus(c *gin.Context) {
  59. tokenId := c.GetInt("token_id")
  60. userId := c.GetInt("id")
  61. token, err := model.GetTokenByIds(tokenId, userId)
  62. if err != nil {
  63. common.ApiError(c, err)
  64. return
  65. }
  66. expiredAt := token.ExpiredTime
  67. if expiredAt == -1 {
  68. expiredAt = 0
  69. }
  70. c.JSON(http.StatusOK, gin.H{
  71. "object": "credit_summary",
  72. "total_granted": token.RemainQuota,
  73. "total_used": 0, // not supported currently
  74. "total_available": token.RemainQuota,
  75. "expires_at": expiredAt * 1000,
  76. })
  77. }
  78. func GetTokenTags(c *gin.Context) {
  79. tags, err := model.GetPaginatedTags(0, 1000) // 获取所有标签
  80. if err != nil {
  81. common.ApiError(c, err)
  82. return
  83. }
  84. // 过滤掉空标签
  85. filteredTags := make([]string, 0)
  86. for _, tag := range tags {
  87. if tag != nil && *tag != "" {
  88. filteredTags = append(filteredTags, *tag)
  89. }
  90. }
  91. c.JSON(http.StatusOK, gin.H{
  92. "success": true,
  93. "message": "",
  94. "data": filteredTags,
  95. })
  96. return
  97. }
  98. func AddToken(c *gin.Context) {
  99. token := model.Token{}
  100. err := c.ShouldBindJSON(&token)
  101. if err != nil {
  102. common.ApiError(c, err)
  103. return
  104. }
  105. if len(token.Name) > 30 {
  106. c.JSON(http.StatusOK, gin.H{
  107. "success": false,
  108. "message": "令牌名称过长",
  109. })
  110. return
  111. }
  112. key, err := common.GenerateKey()
  113. if err != nil {
  114. c.JSON(http.StatusOK, gin.H{
  115. "success": false,
  116. "message": "生成令牌失败",
  117. })
  118. common.SysError("failed to generate token key: " + err.Error())
  119. return
  120. }
  121. cleanToken := model.Token{
  122. UserId: c.GetInt("id"),
  123. Name: token.Name,
  124. Key: key,
  125. CreatedTime: common.GetTimestamp(),
  126. AccessedTime: common.GetTimestamp(),
  127. ExpiredTime: token.ExpiredTime,
  128. RemainQuota: token.RemainQuota,
  129. UnlimitedQuota: token.UnlimitedQuota,
  130. ModelLimitsEnabled: token.ModelLimitsEnabled,
  131. ModelLimits: token.ModelLimits,
  132. AllowIps: token.AllowIps,
  133. Group: token.Group,
  134. RateLimitPerMinute: token.RateLimitPerMinute,
  135. RateLimitPerDay: token.RateLimitPerDay,
  136. LastRateLimitReset: 0,
  137. ChannelTag: token.ChannelTag,
  138. TotalUsageLimit: token.TotalUsageLimit,
  139. }
  140. err = cleanToken.Insert()
  141. if err != nil {
  142. common.ApiError(c, err)
  143. return
  144. }
  145. c.JSON(http.StatusOK, gin.H{
  146. "success": true,
  147. "message": "",
  148. })
  149. return
  150. }
  151. func DeleteToken(c *gin.Context) {
  152. id, _ := strconv.Atoi(c.Param("id"))
  153. userId := c.GetInt("id")
  154. err := model.DeleteTokenById(id, userId)
  155. if err != nil {
  156. common.ApiError(c, err)
  157. return
  158. }
  159. c.JSON(http.StatusOK, gin.H{
  160. "success": true,
  161. "message": "",
  162. })
  163. return
  164. }
  165. func UpdateToken(c *gin.Context) {
  166. userId := c.GetInt("id")
  167. statusOnly := c.Query("status_only")
  168. token := model.Token{}
  169. err := c.ShouldBindJSON(&token)
  170. if err != nil {
  171. common.ApiError(c, err)
  172. return
  173. }
  174. if len(token.Name) > 30 {
  175. c.JSON(http.StatusOK, gin.H{
  176. "success": false,
  177. "message": "令牌名称过长",
  178. })
  179. return
  180. }
  181. cleanToken, err := model.GetTokenByIds(token.Id, userId)
  182. if err != nil {
  183. common.ApiError(c, err)
  184. return
  185. }
  186. if token.Status == common.TokenStatusEnabled {
  187. if cleanToken.Status == common.TokenStatusExpired && cleanToken.ExpiredTime <= common.GetTimestamp() && cleanToken.ExpiredTime != -1 {
  188. c.JSON(http.StatusOK, gin.H{
  189. "success": false,
  190. "message": "令牌已过期,无法启用,请先修改令牌过期时间,或者设置为永不过期",
  191. })
  192. return
  193. }
  194. if cleanToken.Status == common.TokenStatusExhausted && cleanToken.RemainQuota <= 0 && !cleanToken.UnlimitedQuota {
  195. c.JSON(http.StatusOK, gin.H{
  196. "success": false,
  197. "message": "令牌可用额度已用尽,无法启用,请先修改令牌剩余额度,或者设置为无限额度",
  198. })
  199. return
  200. }
  201. }
  202. if statusOnly != "" {
  203. cleanToken.Status = token.Status
  204. } else {
  205. // If you add more fields, please also update token.Update()
  206. cleanToken.Name = token.Name
  207. cleanToken.ExpiredTime = token.ExpiredTime
  208. cleanToken.RemainQuota = token.RemainQuota
  209. cleanToken.UnlimitedQuota = token.UnlimitedQuota
  210. cleanToken.ModelLimitsEnabled = token.ModelLimitsEnabled
  211. cleanToken.ModelLimits = token.ModelLimits
  212. cleanToken.AllowIps = token.AllowIps
  213. cleanToken.Group = token.Group
  214. cleanToken.RateLimitPerMinute = token.RateLimitPerMinute
  215. cleanToken.RateLimitPerDay = token.RateLimitPerDay
  216. cleanToken.ChannelTag = token.ChannelTag
  217. cleanToken.TotalUsageLimit = token.TotalUsageLimit
  218. }
  219. err = cleanToken.Update()
  220. if err != nil {
  221. common.ApiError(c, err)
  222. return
  223. }
  224. c.JSON(http.StatusOK, gin.H{
  225. "success": true,
  226. "message": "",
  227. "data": cleanToken,
  228. })
  229. return
  230. }
  231. type TokenBatch struct {
  232. Ids []int `json:"ids"`
  233. }
  234. func DeleteTokenBatch(c *gin.Context) {
  235. tokenBatch := TokenBatch{}
  236. if err := c.ShouldBindJSON(&tokenBatch); err != nil || len(tokenBatch.Ids) == 0 {
  237. c.JSON(http.StatusOK, gin.H{
  238. "success": false,
  239. "message": "参数错误",
  240. })
  241. return
  242. }
  243. userId := c.GetInt("id")
  244. count, err := model.BatchDeleteTokens(tokenBatch.Ids, userId)
  245. if err != nil {
  246. common.ApiError(c, err)
  247. return
  248. }
  249. c.JSON(http.StatusOK, gin.H{
  250. "success": true,
  251. "message": "",
  252. "data": count,
  253. })
  254. }