feat: complete shared database tenant sharding
This commit is contained in:
@@ -128,6 +128,9 @@ type groupMessageRuntime interface {
|
||||
AllowRate(tenantID types.TenantID, scope string, limit int, window time.Duration) (bool, int, time.Duration, error)
|
||||
ClaimShortState(namespace, id string, ttl time.Duration) (bool, error)
|
||||
ClaimShortStateValue(namespace, id, value string, ttl time.Duration) (bool, bool, error)
|
||||
SetShortStateValue(namespace, id, value string, ttl time.Duration) error
|
||||
GetShortStateValue(namespace, id string) (string, bool, error)
|
||||
DeleteShortState(namespace, id string) error
|
||||
ShortStateExists(namespace, id string) (bool, error)
|
||||
StoreLoginSession(token []byte, session LoginSession, ttl time.Duration) error
|
||||
}
|
||||
@@ -266,6 +269,28 @@ func ClaimShortStateValue(namespace, id, value string, ttl time.Duration) (bool,
|
||||
return claimed, sameValue, true, err
|
||||
}
|
||||
|
||||
func SetShortStateValue(namespace, id, value string, ttl time.Duration) (bool, error) {
|
||||
if groupMsgRuntime == nil || namespace == "" || id == "" || value == "" {
|
||||
return false, nil
|
||||
}
|
||||
return true, groupMsgRuntime.SetShortStateValue(namespace, id, value, ttl)
|
||||
}
|
||||
|
||||
func GetShortStateValue(namespace, id string) (string, bool, bool, error) {
|
||||
if groupMsgRuntime == nil || namespace == "" || id == "" {
|
||||
return "", false, false, nil
|
||||
}
|
||||
value, found, err := groupMsgRuntime.GetShortStateValue(namespace, id)
|
||||
return value, found, true, err
|
||||
}
|
||||
|
||||
func DeleteShortState(namespace, id string) (bool, error) {
|
||||
if groupMsgRuntime == nil || namespace == "" || id == "" {
|
||||
return false, nil
|
||||
}
|
||||
return true, groupMsgRuntime.DeleteShortState(namespace, id)
|
||||
}
|
||||
|
||||
func RevokeLoginToken(tenantID types.TenantID, token []byte, ttl time.Duration) (bool, error) {
|
||||
if groupMsgRuntime == nil || !tenantID.IsValid() || len(token) == 0 || ttl <= 0 {
|
||||
return false, nil
|
||||
@@ -1272,6 +1297,28 @@ func (r *redisGroupMessageRuntime) ClaimShortStateValue(namespace, id, value str
|
||||
return false, existing == value, nil
|
||||
}
|
||||
|
||||
func (r *redisGroupMessageRuntime) SetShortStateValue(namespace, id, value string, ttl time.Duration) error {
|
||||
if ttl <= 0 {
|
||||
ttl = time.Duration(r.cfg.ShortTTL) * time.Second
|
||||
}
|
||||
return r.client.Set(context.Background(), r.shortStateKey(namespace, id), value, ttl).Err()
|
||||
}
|
||||
|
||||
func (r *redisGroupMessageRuntime) GetShortStateValue(namespace, id string) (string, bool, error) {
|
||||
value, err := r.client.Get(context.Background(), r.shortStateKey(namespace, id)).Result()
|
||||
if err == redis.Nil {
|
||||
return "", false, nil
|
||||
}
|
||||
if err != nil {
|
||||
return "", false, err
|
||||
}
|
||||
return value, true, nil
|
||||
}
|
||||
|
||||
func (r *redisGroupMessageRuntime) DeleteShortState(namespace, id string) error {
|
||||
return r.client.Del(context.Background(), r.shortStateKey(namespace, id)).Err()
|
||||
}
|
||||
|
||||
func (r *redisGroupMessageRuntime) ShortStateExists(namespace, id string) (bool, error) {
|
||||
count, err := r.client.Exists(context.Background(), r.shortStateKey(namespace, id)).Result()
|
||||
return count > 0, err
|
||||
@@ -1450,7 +1497,7 @@ func (r *redisGroupMessageRuntime) loginSessionKey(tokenHash string) string {
|
||||
|
||||
func (r *redisGroupMessageRuntime) cacheTTL(namespace string) time.Duration {
|
||||
ttl := r.cfg.CacheTTL
|
||||
if namespace == "verification" || namespace == "action_token" {
|
||||
if namespace == "verification" || namespace == "action_token" || namespace == "login_lockout" {
|
||||
ttl = r.cfg.ShortTTL
|
||||
}
|
||||
return time.Duration(ttl) * time.Second
|
||||
|
||||
Reference in New Issue
Block a user