diff --git a/pkg/client/client.go b/pkg/client/client.go index 69693bc8..75a0b96f 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -241,13 +241,33 @@ func (o *OptimizelyClient) findRegularDecision(decisionContext decision.FeatureD } featureDecision := decision.FeatureDecision{} - reasons := decide.NewDecisionReasons(options) if decisionContext.Feature != nil { for _, featureExperiment := range decisionContext.Feature.FeatureExperiments { decisionKey := decision.NewUserDecisionKey(featureExperiment.ID) - if featureExperiment.Variations == nil { - continue + experimentDecisionContext := decision.ExperimentDecisionContext{ + ProjectConfig: decisionContext.ProjectConfig, + Experiment: &featureExperiment, + } + + expDecision, reasons, err := decision.NewExperimentWhitelistService().GetDecision(experimentDecisionContext, userContext, options) + if err == nil && expDecision.Variation != nil { + featureDecision.Variation = expDecision.Variation + featureDecision.Experiment = featureExperiment + featureDecision.Source = decision.FeatureTest + return featureDecision, reasons, nil + } + + if decisionContext.ForcedDecisionService != nil { + forcedDecision, _reasons, err := decisionContext.ForcedDecisionService.FindValidatedForcedDecision(decisionContext.ProjectConfig, decision.OptimizelyDecisionContext{FlagKey: decisionContext.Feature.Key, RuleKey: featureExperiment.Key}, options) + reasons.Append(_reasons) + if err == nil { + return decision.FeatureDecision{ + Experiment: featureExperiment, + Variation: forcedDecision, + Source: decision.FeatureTest, + }, reasons, nil + } } if savedVariationID, ok := userProfile.ExperimentBucketMap[decisionKey]; ok { diff --git a/pkg/client/optimizely_user_context.go b/pkg/client/optimizely_user_context.go index 01b90814..215cfd77 100644 --- a/pkg/client/optimizely_user_context.go +++ b/pkg/client/optimizely_user_context.go @@ -151,7 +151,10 @@ func (o *OptimizelyUserContext) DecideAll(options []decide.OptimizelyDecideOptio func (o *OptimizelyUserContext) DecideForKeys(keys []string, options []decide.OptimizelyDecideOptions) map[string]OptimizelyDecision { // use a copy of the user context so that any changes to the original context are not reflected inside the decision userContextCopy := newOptimizelyUserContext(o.GetOptimizely(), o.GetUserID(), o.GetUserAttributes(), o.getForcedDecisionService(), o.GetQualifiedSegments()) - return o.optimizely.decideForKeys(userContextCopy, keys, convertDecideOptions(options)) + decideOptions := convertDecideOptions(options) + decisionMap := o.optimizely.decideForKeys(userContextCopy, keys, decideOptions) + + return filteredDecision(decisionMap, o.optimizely.getAllOptions(decideOptions).EnabledFlagsOnly) } // TrackEvent generates a conversion event with the given event key if it exists and queues it up to be sent to the Optimizely