fixed blocking important issues
This commit is contained in:
@@ -318,6 +318,12 @@ func (s *Service) ValidateToken(tokenString string) (*TokenValidationResult, err
|
||||
"user_id": claims.UserID,
|
||||
"error": err.Error(),
|
||||
})
|
||||
return &TokenValidationResult{
|
||||
Valid: false,
|
||||
Claims: nil,
|
||||
Error: "session validation unavailable",
|
||||
Expired: false,
|
||||
}, nil
|
||||
} else if invalidated {
|
||||
return &TokenValidationResult{
|
||||
Valid: false,
|
||||
|
||||
@@ -25,14 +25,9 @@ func (m *MockRedisClient) Get(ctx context.Context, key string) (string, error) {
|
||||
return args.String(0), args.Error(1)
|
||||
}
|
||||
|
||||
func (m *MockRedisClient) Incr(ctx context.Context, key string) (int64, error) {
|
||||
args := m.Called(ctx, key)
|
||||
return args.Get(0).(int64), args.Error(1)
|
||||
}
|
||||
|
||||
func (m *MockRedisClient) Expire(ctx context.Context, key string, expiration time.Duration) error {
|
||||
func (m *MockRedisClient) IncrWithExpire(ctx context.Context, key string, expiration time.Duration) (int64, error) {
|
||||
args := m.Called(ctx, key, expiration)
|
||||
return args.Error(0)
|
||||
return args.Get(0).(int64), args.Error(1)
|
||||
}
|
||||
|
||||
func (m *MockRedisClient) Del(ctx context.Context, keys ...string) error {
|
||||
|
||||
+1
-14
@@ -5,8 +5,6 @@ import (
|
||||
"time"
|
||||
|
||||
"tm/pkg/redis"
|
||||
|
||||
redisv9 "github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
// Allow returns whether the request is within limit for the given key.
|
||||
@@ -15,21 +13,10 @@ func Allow(ctx context.Context, client redis.Client, key string, limit int64, wi
|
||||
return true, nil
|
||||
}
|
||||
|
||||
count, err := client.Incr(ctx, key)
|
||||
count, err := client.IncrWithExpire(ctx, key, window)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if count == 1 {
|
||||
if err := client.Expire(ctx, key, window); err != nil {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
|
||||
return count <= limit, nil
|
||||
}
|
||||
|
||||
// IsNotFound reports whether err indicates a missing Redis key.
|
||||
func IsNotFound(err error) bool {
|
||||
return err == redisv9.Nil
|
||||
}
|
||||
|
||||
+23
-12
@@ -23,8 +23,7 @@ type Config struct {
|
||||
type Client interface {
|
||||
Set(ctx context.Context, key string, value interface{}, expiration time.Duration) error
|
||||
Get(ctx context.Context, key string) (string, error)
|
||||
Incr(ctx context.Context, key string) (int64, error)
|
||||
Expire(ctx context.Context, key string, expiration time.Duration) error
|
||||
IncrWithExpire(ctx context.Context, key string, expiration time.Duration) (int64, error)
|
||||
Del(ctx context.Context, keys ...string) error
|
||||
Exists(ctx context.Context, keys ...string) (int64, error)
|
||||
Close() error
|
||||
@@ -72,6 +71,28 @@ func NewClient(config *Config, logger logger.Logger) (Client, error) {
|
||||
return &client{rdb: rdb}, nil
|
||||
}
|
||||
|
||||
const incrWithExpireScript = `
|
||||
local current = redis.call("INCR", KEYS[1])
|
||||
if current == 1 then
|
||||
redis.call("EXPIRE", KEYS[1], ARGV[1])
|
||||
else
|
||||
local ttl = redis.call("TTL", KEYS[1])
|
||||
if ttl == -1 then
|
||||
redis.call("EXPIRE", KEYS[1], ARGV[1])
|
||||
end
|
||||
end
|
||||
return current
|
||||
`
|
||||
|
||||
// IncrWithExpire atomically increments a counter and ensures the key has a TTL.
|
||||
func (c *client) IncrWithExpire(ctx context.Context, key string, expiration time.Duration) (int64, error) {
|
||||
seconds := int64(expiration.Seconds())
|
||||
if seconds < 1 {
|
||||
seconds = 1
|
||||
}
|
||||
return c.rdb.Eval(ctx, incrWithExpireScript, []string{key}, seconds).Int64()
|
||||
}
|
||||
|
||||
// Set sets a key-value pair with expiration
|
||||
func (c *client) Set(ctx context.Context, key string, value interface{}, expiration time.Duration) error {
|
||||
return c.rdb.Set(ctx, key, value, expiration).Err()
|
||||
@@ -82,16 +103,6 @@ func (c *client) Get(ctx context.Context, key string) (string, error) {
|
||||
return c.rdb.Get(ctx, key).Result()
|
||||
}
|
||||
|
||||
// Incr increments a key's integer value.
|
||||
func (c *client) Incr(ctx context.Context, key string) (int64, error) {
|
||||
return c.rdb.Incr(ctx, key).Result()
|
||||
}
|
||||
|
||||
// Expire sets a timeout on a key.
|
||||
func (c *client) Expire(ctx context.Context, key string, expiration time.Duration) error {
|
||||
return c.rdb.Expire(ctx, key, expiration).Err()
|
||||
}
|
||||
|
||||
// Del deletes one or more keys
|
||||
func (c *client) Del(ctx context.Context, keys ...string) error {
|
||||
return c.rdb.Del(ctx, keys...).Err()
|
||||
|
||||
Reference in New Issue
Block a user