tokenFactory/setting/rate_limit_user_whitelist.go

71 lines
1.5 KiB
Go

package setting
import (
"encoding/json"
"fmt"
"sort"
"sync"
)
var RateLimitUserWhitelist = map[int]struct{}{}
var RateLimitUserWhitelistMutex sync.RWMutex
func RateLimitUserWhitelist2JSONString() string {
RateLimitUserWhitelistMutex.RLock()
defer RateLimitUserWhitelistMutex.RUnlock()
ids := make([]int, 0, len(RateLimitUserWhitelist))
for id := range RateLimitUserWhitelist {
ids = append(ids, id)
}
sort.Ints(ids)
jsonBytes, err := json.Marshal(ids)
if err != nil {
return "[]"
}
return string(jsonBytes)
}
func UpdateRateLimitUserWhitelistByJSONString(jsonStr string) error {
var ids []int
if err := json.Unmarshal([]byte(jsonStr), &ids); err != nil {
return err
}
next := make(map[int]struct{}, len(ids))
for _, id := range ids {
if id <= 0 {
return fmt.Errorf("invalid user id in whitelist: %d", id)
}
next[id] = struct{}{}
}
RateLimitUserWhitelistMutex.Lock()
defer RateLimitUserWhitelistMutex.Unlock()
RateLimitUserWhitelist = next
return nil
}
func CheckRateLimitUserWhitelistJSON(jsonStr string) error {
var ids []int
if err := json.Unmarshal([]byte(jsonStr), &ids); err != nil {
return err
}
for _, id := range ids {
if id <= 0 {
return fmt.Errorf("invalid user id in whitelist: %d", id)
}
}
return nil
}
func IsUserInRateLimitWhitelist(userId int) bool {
if userId <= 0 {
return false
}
RateLimitUserWhitelistMutex.RLock()
defer RateLimitUserWhitelistMutex.RUnlock()
_, ok := RateLimitUserWhitelist[userId]
return ok
}