This repository has been archived by the owner on Oct 15, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgcurtain.go
100 lines (79 loc) · 2.06 KB
/
gcurtain.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package gcurtain
import (
"fmt"
"math/rand"
"strconv"
"time"
"github.com/go-redis/redis"
)
type GCurtain struct {
redisClient *redis.Client
}
func (g *GCurtain) Init(uri string) error {
uriParsed, err := redis.ParseURL(uri)
if err != nil {
panic(err)
}
g.redisClient = redis.NewClient(uriParsed)
_, erro := g.redisClient.Ping().Result()
return erro
}
func (g *GCurtain) IsOpen(feature string, users ...string) bool {
if existingUser(users...) > 0 {
return g.isOpenForUser(feature, users...)
}
return g.isFeatureOpen(feature)
}
func (g *GCurtain) IsOpenFeature(feature string) bool {
return g.isFeatureOpen(feature)
}
func (g *GCurtain) IsOpenFeatureUser(feature, user string) bool {
return g.isOpenForUser(feature, user) || g.isFeatureOpen(feature)
}
func (g *GCurtain) CreateFeature(feature, user string) {
g.redisClient.SAdd(featureUsers(feature), user)
}
func (g *GCurtain) CreatePercentage(feature, percentage string) {
num, _ := strconv.Atoi(percentage)
g.redisClient.Do("SET", featurePercentage(feature), num)
}
func (g *GCurtain) isOpenForUser(feature string, users ...string) bool {
for _, user := range users {
if !g.redisClient.SIsMember(featureUsers(feature), user).Val() {
return false
}
}
return true
}
func (g *GCurtain) getFeaturePercentage(feature string) int {
featurePercentage := g.redisClient.Get(featurePercentage(feature)).Val()
if featurePercentage == "" {
return 0
}
num, _ := strconv.Atoi(featurePercentage)
return num
}
func (g *GCurtain) isFeatureOpen(feature string) bool {
return randomPercentage() <= g.getFeaturePercentage(feature)
}
func randomPercentage() int {
rand.Seed(time.Now().UnixNano())
return rand.Intn(100) + 1
}
func featureUsers(feature string) string {
return fmt.Sprintf("feature:%s:users", feature)
}
func featurePercentage(feature string) string {
return fmt.Sprintf("feature:%s:percentage", feature)
}
func existingUser(users ...string) int {
if len(users) > 0 {
return 1
}
return 0
}
func GetClient(url string) *redis.Client {
return redis.NewClient(&redis.Options{
Addr: url,
})
}