|
|
@@ -1,11 +1,13 @@
|
|
|
package controller
|
|
|
|
|
|
import (
|
|
|
- "github.com/gin-gonic/gin"
|
|
|
"net/http"
|
|
|
"one-api/common"
|
|
|
"one-api/model"
|
|
|
"strconv"
|
|
|
+ "strings"
|
|
|
+
|
|
|
+ "github.com/gin-gonic/gin"
|
|
|
)
|
|
|
|
|
|
func GetAllTokens(c *gin.Context) {
|
|
|
@@ -106,6 +108,56 @@ func GetTokenStatus(c *gin.Context) {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+func GetTokenUsage(c *gin.Context) {
|
|
|
+ authHeader := c.GetHeader("Authorization")
|
|
|
+ if authHeader == "" {
|
|
|
+ c.JSON(http.StatusUnauthorized, gin.H{
|
|
|
+ "success": false,
|
|
|
+ "message": "No Authorization header",
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ parts := strings.Split(authHeader, " ")
|
|
|
+ if len(parts) != 2 || strings.ToLower(parts[0]) != "bearer" {
|
|
|
+ c.JSON(http.StatusUnauthorized, gin.H{
|
|
|
+ "success": false,
|
|
|
+ "message": "Invalid Bearer token",
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ tokenKey := parts[1]
|
|
|
+
|
|
|
+ token, err := model.GetTokenByKey(tokenKey, true)
|
|
|
+ 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{
|
|
|
+ "code": true,
|
|
|
+ "message": "ok",
|
|
|
+ "data": gin.H{
|
|
|
+ "object": "token_usage",
|
|
|
+ "id": token.Id,
|
|
|
+ "name": token.Name,
|
|
|
+ "total_granted": token.RemainQuota + token.UsedQuota,
|
|
|
+ "total_used": token.UsedQuota,
|
|
|
+ "total_available": token.RemainQuota,
|
|
|
+ "unlimited_quota": token.UnlimitedQuota,
|
|
|
+ "expires_at": expiredAt,
|
|
|
+ },
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
func AddToken(c *gin.Context) {
|
|
|
token := model.Token{}
|
|
|
err := c.ShouldBindJSON(&token)
|