Files
opencatd-open/internal/controller/user_token.go
2025-04-16 18:01:27 +08:00

219 lines
4.8 KiB
Go

package controller
import (
"net/http"
"opencatd-open/internal/dto"
"opencatd-open/internal/model"
"opencatd-open/internal/utils"
"strconv"
"strings"
"github.com/duke-git/lancet/v2/slice"
"github.com/gin-gonic/gin"
)
func (a Api) CreateToken(c *gin.Context) {
userid := c.GetInt64("user_id")
user, err := a.userService.GetByID(c, userid)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
if len(user.Tokens) >= 20 {
dto.Fail(c, http.StatusForbidden, "user has reached the maximum number of tokens")
return
}
var token model.Token
err = c.ShouldBindJSON(&token)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
token.UserID = userid
err = a.tokenService.CreateToken(c, &token)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
dto.Success(c, nil)
}
func (a Api) ListToken(c *gin.Context) {
limit, _ := strconv.Atoi(c.DefaultQuery("pageSize", "20"))
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
offset := (page - 1) * limit
active := c.QueryArray("active[]")
if !slice.ContainSubSlice([]string{"true", "false"}, active) {
dto.Fail(c, http.StatusBadRequest, "active must be true or false")
}
tokens, total, err := a.tokenService.ListToken(c, limit, offset, active)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
dto.Success(c, gin.H{
"total": total,
"tokens": tokens,
})
}
func (a Api) GetToken(c *gin.Context) {
id, _ := strconv.ParseInt(c.Param("id"), 10, 64)
token, err := a.tokenService.GetToken(c, id)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
dto.Success(c, token)
}
func (a Api) ResetToken(c *gin.Context) {
id, err := strconv.ParseInt(c.Param("id"), 10, 64)
if err != nil {
dto.Fail(c, http.StatusBadRequest, err.Error())
return
}
token, err := a.tokenService.GetToken(c, id)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
if token == nil {
dto.Fail(c, http.StatusNotFound, "token not found")
return
}
token.UsedQuota = utils.ToPtr(int64(0))
err = a.tokenService.UpdateToken(c, token)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
dto.Success(c, nil)
}
func (a Api) UpdateToken(c *gin.Context) {
id, err := strconv.ParseInt(c.Param("id"), 10, 64)
if err != nil {
dto.Fail(c, http.StatusBadRequest, err.Error())
return
}
var token model.Token
err = c.ShouldBindJSON(&token)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
token.ID = id
if token.UserID == 0 {
dto.Fail(c, http.StatusBadRequest, "user_id is required")
return
}
var _token *model.Token
user, err := a.userService.GetByID(c, token.UserID)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
if len(user.Tokens) == 0 {
dto.Fail(c, http.StatusForbidden, "user has no tokens")
return
} else {
if findtoken, ok := slice.Find(user.Tokens,
func(idx int, t model.Token) bool {
return t.ID == id
}); ok {
_token = findtoken
_token.User = user
} else {
dto.Fail(c, http.StatusForbidden, "user has no tokens")
return
}
}
// 更新_token信息
if token.Name != "" {
_token.Name = token.Name
}
if token.Key != "" {
_token.Key = token.Key
}
if token.Active != nil {
_token.Active = token.Active
}
if token.Quota != nil {
_token.Quota = token.Quota
}
if token.UnlimitedQuota != nil {
_token.UnlimitedQuota = token.UnlimitedQuota
}
if token.ExpiredAt != nil {
_token.ExpiredAt = token.ExpiredAt
}
err = a.tokenService.UpdateToken(c, _token)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
dto.Success(c, nil)
}
func (a Api) DeleteToken(c *gin.Context) {
id, err := strconv.ParseInt(c.Param("id"), 10, 64)
if err != nil {
dto.Fail(c, http.StatusBadRequest, err.Error())
return
}
err = a.tokenService.DeleteToken(c, id)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
dto.Success(c, nil)
}
func (a Api) TokenOption(c *gin.Context) {
option := strings.ToLower(c.Param("option"))
var batchid dto.BatchIDRequest
err := c.ShouldBind(&batchid)
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
if batchid.UserID == nil {
dto.Fail(c, 400, "user_id is required")
return
}
switch option {
case "enable":
err = a.tokenService.EnableTokens(c, *batchid.UserID, batchid.IDs)
case "disable":
err = a.tokenService.DisableTokens(c, *batchid.UserID, batchid.IDs)
case "delete":
err = a.tokenService.DeleteTokens(c, *batchid.UserID, batchid.IDs)
default:
dto.Fail(c, 400, "invalid option, only support enable, disable, delete")
return
}
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
dto.Success(c, nil)
}