From 1e7d2728d52d26ddb21c3383b443f438c9a3a0e7 Mon Sep 17 00:00:00 2001 From: pulak-opti Date: Fri, 25 Oct 2024 03:18:52 +0600 Subject: [PATCH] add forced decision and whitelist decision Signed-off-by: pulak-opti --- pkg/client/client.go | 26 +++++++++++++++++++++++--- pkg/client/optimizely_user_context.go | 5 ++++- 2 files changed, 27 insertions(+), 4 deletions(-) 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