Skip to content

Commit decd2e1

Browse files
authored
Merge pull request #6 from chandrajeetn/MLE-15719
Mle 15719
2 parents 7fe08b3 + 8e63b53 commit decd2e1

File tree

3 files changed

+78
-47
lines changed

3 files changed

+78
-47
lines changed

localEvaluation/localEvaluation.go

+73-20
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,9 @@ var (
2323
LocalEvaluationDeploymentKey = "server-jAqqJaX3l8PgNiJpcv9j20ywPzANQQFh"
2424
)
2525

26-
type variant struct {
27-
Value string `json:"value,omitempty"`
28-
Payload interface{} `json:"payload,omitempty"`
29-
}
30-
3126
type UserProperties struct {
3227
OrgId string `json:"org_id,omitempty"`
28+
UserId string `json:"user_id,omitempty"`
3329
OrgName string `json:"org_name,omitempty"`
3430
Username string `json:"username,omitempty"`
3531
UserStatus string `json:"user_status,omitempty"`
@@ -41,8 +37,19 @@ type UserProperties struct {
4137
TemplateId string `json:"template_id,omitempty"`
4238
}
4339

44-
func init() {
40+
type AmplitudeConfig struct {
41+
Debug bool
42+
ServerUrl string
43+
FlagConfigPollerInterval time.Duration
44+
FlagConfigPollerRequestTimeout time.Duration
45+
}
4546

47+
type AmplitudeVariant struct {
48+
Value string `json:"value,omitempty"`
49+
Payload interface{} `json:"payload,omitempty"`
50+
}
51+
52+
func init() {
4653
err := godotenv.Load()
4754
if err != nil {
4855
fmt.Printf("No .env file found")
@@ -77,13 +84,31 @@ func Initialize() {
7784
client = local.Initialize(LocalEvaluationDeploymentKey, &config)
7885
err := client.Start()
7986
if err != nil {
80-
err = fmt.Errorf("unable to create local evaluation client with given config %v with error %s", config, err.Error())
87+
err = fmt.Errorf("unable to create local evaluation client with given config %+v with error %s", config, err.Error())
8188
panic(err)
8289
}
8390
}
8491

85-
func fetch(flagName string, user UserProperties) variant {
86-
flagKeys := []string{flagName}
92+
func InitializeWithConfig(conf AmplitudeConfig) {
93+
client = local.Initialize(LocalEvaluationDeploymentKey, (*local.Config)(&conf))
94+
err := client.Start()
95+
if err != nil {
96+
err = fmt.Errorf("unable to create local evaluation client with given config %+v with error %s", conf, err.Error())
97+
panic(err)
98+
}
99+
}
100+
101+
func contains(s []string, e string) bool {
102+
for _, a := range s {
103+
if a == e {
104+
return true
105+
}
106+
}
107+
return false
108+
}
109+
110+
func fetch(flagKeys []string, user UserProperties) map[string]AmplitudeVariant {
111+
variants := make(map[string]AmplitudeVariant)
87112
userProp := map[string]interface{}{
88113
"org_id": user.OrgId,
89114
"org_name": user.OrgName,
@@ -95,36 +120,64 @@ func fetch(flagName string, user UserProperties) variant {
95120
"infra_provider": user.InfraProvider,
96121
"template_id": user.TemplateId,
97122
}
98-
99123
expUser := experiment.User{
124+
UserId: user.UserId,
100125
UserProperties: userProp,
101126
}
102127

103-
variants, err := client.Evaluate(&expUser, flagKeys)
128+
result, err := client.EvaluateByOrg(&expUser)
104129
if err != nil {
105-
return variant{}
130+
return variants
131+
}
132+
filter := len(flagKeys) != 0
133+
for k, v := range *result {
134+
if v.IsDefaultVariant {
135+
continue
136+
}
137+
if !filter {
138+
variants[k] = AmplitudeVariant{
139+
Value: v.Variant.Key,
140+
Payload: v.Variant.Payload,
141+
}
142+
continue
143+
}
144+
if contains(flagKeys, k) {
145+
variants[k] = AmplitudeVariant{
146+
Value: v.Variant.Key,
147+
Payload: v.Variant.Payload,
148+
}
149+
}
106150
}
107151

108-
return variant(variants[flagName])
152+
return variants
109153
}
110154

111155
func GetFeatureFlagString(flagName string, user UserProperties) string {
112-
data := fetch(flagName, user)
113-
return data.Value
156+
flagKeys := []string{flagName}
157+
data := fetch(flagKeys, user)
158+
return data[flagName].Value
114159
}
115160

116161
func GetFeatureFlagBool(flagName string, user UserProperties) bool {
117-
data := fetch(flagName, user)
118-
if val, err := strconv.ParseBool(data.Value); err == nil {
162+
flagKeys := []string{flagName}
163+
data := fetch(flagKeys, user)
164+
if val, err := strconv.ParseBool(data[flagName].Value); err == nil {
119165
return val
120166
}
121167
return false
122168
}
123169

124170
func GetFeatureFlagPayload(flagName string, user UserProperties) map[string]interface{} {
125-
data := fetch(flagName, user)
171+
flagKeys := []string{flagName}
172+
data := fetch(flagKeys, user)
126173
mapData := make(map[string]interface{})
127-
mapData["value"] = data.Value
128-
mapData["payload"] = data.Payload
174+
mapData["value"] = data[flagName].Value
175+
mapData["payload"] = data[flagName].Payload
129176
return mapData
130177
}
178+
179+
func GetFeatureFlagByOrg(user UserProperties) map[string]AmplitudeVariant {
180+
flagKeys := []string{}
181+
data := fetch(flagKeys, user)
182+
return data
183+
}

pkg/experiment/local/client.go

+3-25
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,10 @@ func (c *Client) Start() error {
6666
return nil
6767
}
6868

69-
func (c *Client) Evaluate(user *experiment.User, flagKeys []string) (map[string]experiment.Variant, error) {
70-
variants := make(map[string]experiment.Variant)
69+
func (c *Client) EvaluateByOrg(user *experiment.User) (*EvaluationResult, error) {
7170
if len(*c.flags) == 0 {
7271
c.log.Debug("evaluate: no flags")
73-
return variants, nil
74-
72+
return nil, nil
7573
}
7674
userJson, err := json.Marshal(user)
7775
if err != nil {
@@ -90,18 +88,7 @@ func (c *Client) Evaluate(user *experiment.User, flagKeys []string) (map[string]
9088
if interopResult.Error != nil {
9189
return nil, fmt.Errorf("evaluation resulted in error: %v", *interopResult.Error)
9290
}
93-
result := interopResult.Result
94-
filter := len(flagKeys) != 0
95-
for k, v := range *result {
96-
if v.IsDefaultVariant || (filter && !contains(flagKeys, k)) {
97-
continue
98-
}
99-
variants[k] = experiment.Variant{
100-
Value: v.Variant.Key,
101-
Payload: v.Variant.Payload,
102-
}
103-
}
104-
return variants, nil
91+
return interopResult.Result, nil
10592
}
10693

10794
func (c *Client) Rules() (map[string]interface{}, error) {
@@ -177,12 +164,3 @@ func (c *Client) doFlags() (*string, error) {
177164
c.log.Debug("flags: %v", flags)
178165
return &flags, nil
179166
}
180-
181-
func contains(s []string, e string) bool {
182-
for _, a := range s {
183-
if a == e {
184-
return true
185-
}
186-
}
187-
return false
188-
}

pkg/experiment/local/types.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ type flagResult struct {
1111
IsDefaultVariant bool `json:"isDefaultVariant,omitempty"`
1212
}
1313

14-
type evaluationResult = map[string]flagResult
14+
type EvaluationResult = map[string]flagResult
1515

1616
type interopResult struct {
17-
Result *evaluationResult `json:"result,omitempty"`
17+
Result *EvaluationResult `json:"result,omitempty"`
1818
Error *string `json:"error,omitempty"`
1919
}

0 commit comments

Comments
 (0)