Add event query api

Signed-off-by: Asai Neko <sugar@sne.moe>
This commit is contained in:
2025-12-28 01:05:47 +08:00
parent b6003544c8
commit b3fe91444d
8 changed files with 79 additions and 43 deletions

View File

@@ -4,19 +4,16 @@ import (
"context"
"crypto/rand"
"encoding/base64"
"errors"
"fmt"
"nixcn-cms/data"
"time"
"github.com/golang-jwt/jwt/v5"
"github.com/google/uuid"
"github.com/redis/go-redis/v9"
"github.com/spf13/viper"
)
type Token struct {
UserID uuid.UUID
Application string
}
@@ -26,9 +23,9 @@ type JwtClaims struct {
}
// Generate jwt clames
func (self *Token) NewClaims() JwtClaims {
func (self *Token) NewClaims(userId uuid.UUID) JwtClaims {
return JwtClaims{
UserID: self.UserID,
UserID: userId,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(viper.GetDuration("ttl.access_ttl"))),
IssuedAt: jwt.NewNumericDate(time.Now()),
@@ -38,8 +35,8 @@ func (self *Token) NewClaims() JwtClaims {
}
// Generate access token
func (self *Token) GenerateAccessToken() (string, error) {
claims := self.NewClaims()
func (self *Token) GenerateAccessToken(userId uuid.UUID) (string, error) {
claims := self.NewClaims(userId)
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
secret := viper.GetString("secrets.jwt_secret")
signedToken, err := token.SignedString([]byte(secret))
@@ -59,9 +56,9 @@ func (self *Token) GenerateRefreshToken() (string, error) {
}
// Issue both access and refresh token
func (self *Token) IssueTokens() (string, string, error) {
func (self *Token) IssueTokens(userId uuid.UUID) (string, string, error) {
// Gen atk
access, err := self.GenerateAccessToken()
access, err := self.GenerateAccessToken(userId)
if err != nil {
return "", "", err
}
@@ -80,14 +77,14 @@ func (self *Token) IssueTokens() (string, string, error) {
if err := data.Redis.Set(
ctx,
"refresh:"+refresh,
self.UserID.String(),
userId.String(),
ttl,
).Err(); err != nil {
return "", "", err
}
// user -> refresh tokens
userSetKey := "user:" + self.UserID.String() + ":refresh_tokens"
userSetKey := "user:" + userId.String() + ":refresh_tokens"
if err := data.Redis.SAdd(
ctx,
@@ -109,49 +106,52 @@ func (self *Token) RefreshAccessToken(refreshToken string) (string, error) {
ctx := context.Background()
key := "refresh:" + refreshToken
userIDStr, err := data.Redis.Get(ctx, key).Result()
if err != nil {
if err == redis.Nil {
return "", errors.New("invalid refresh token")
}
return "", err
}
userID, err := uuid.Parse(userIDStr)
userIdStr, err := data.Redis.Get(ctx, key).Result()
if err != nil {
return "", err
}
self.UserID = userID
userId, err := uuid.Parse(userIdStr)
if err != nil {
return "", err
}
// Generate access token
return self.GenerateAccessToken()
return self.GenerateAccessToken(userId)
}
func (self *Token) RenewRefreshToken(refreshToken string) (string, error) {
err := self.RevokeRefreshToken(refreshToken)
ctx := context.Background()
ttl := viper.GetDuration("ttl.refresh_ttl")
key := "refresh:" + refreshToken
userIdStr, err := data.Redis.Get(ctx, key).Result()
if err != nil {
return "", err
}
refresh, err := self.GenerateRefreshToken()
if err != nil {
return "", err
}
// Store to redis
ctx := context.Background()
ttl := viper.GetDuration("ttl.refresh_ttl")
err = self.RevokeRefreshToken(refreshToken)
if err != nil {
return "", err
}
// refresh -> user
if err := data.Redis.Set(
ctx,
"refresh:"+refresh,
self.UserID.String(),
userIdStr,
ttl,
).Err(); err != nil {
return "", err
}
// user -> refresh tokens
userSetKey := "user:" + self.UserID.String() + ":refresh_tokens"
userSetKey := "user:" + userIdStr + ":refresh_tokens"
if err := data.Redis.SAdd(
ctx,