private static bool HandleResult(
            IDictionary <string, object> consequence,
            OnDeviceDecisioningRule rule,
            RequestDetailsUnion details,
            PrefetchResponse prefetchResponse,
            ExecuteResponse executeResponse,
            IList <Notification> notifications,
            string globalMbox = "target-global-mbox")
        {
            if (consequence == null || consequence.Count == 0)
            {
                return(false);
            }

            consequence.TryGetValue(Name, out var nameObject);
            var consequenceName = (string)nameObject;

            consequence.TryGetValue(Options, out var optionsObject);
            var consequenceOptions = (List <Option>)optionsObject;

            consequence.TryGetValue(Metrics, out var metricsObject);
            var consequenceMetrics = GetMetrics(metricsObject);

            if (executeResponse != null)
            {
                var notification = CreateNotification(details, consequenceOptions, globalMbox);
                notifications.Add(notification);
            }

            return(details.Match(
                       _ => HandlePageLoad(prefetchResponse, executeResponse, consequenceOptions, consequenceMetrics),
                       mboxRequest => HandleMboxRequest(prefetchResponse, executeResponse, mboxRequest, consequenceOptions, consequenceMetrics),
                       _ => HandleViewRequest(prefetchResponse, consequenceName, consequenceOptions, consequenceMetrics)));
        }
예제 #2
0
        private IDictionary <string, object> ReplaceCampaignMacros(OnDeviceDecisioningRule rule, IDictionary <string, object> consequence, RequestDetailsUnion details)
        {
            if (consequence == null || !consequence.ContainsKey(DecisioningDetailsExecutor.Options))
            {
                return(consequence);
            }

            var campaignMacroReplacer = new CampaignMacroReplacer(rule, consequence, details);

            consequence[DecisioningDetailsExecutor.Options] = campaignMacroReplacer.GetOptions();
            return(consequence);
        }
예제 #3
0
        public IDictionary <string, object> ExecuteRule(
            IDictionary <string, object> localContext,
            RequestDetailsUnion details,
            string visitorId,
            OnDeviceDecisioningRule rule,
            ISet <string> responseTokens)
        {
            localContext.Remove(Allocation);
            localContext.Add(Allocation, this.ComputeAllocation(visitorId, rule));
            var matched = this.EvaluateRule((JObject)rule.Condition, localContext.ToExpandoObject());

            if (!matched)
            {
                return(null);
            }

            return(this.ReplaceCampaignMacros(rule, this.GetConsequence(responseTokens, rule, localContext), details));
        }
예제 #4
0
        private static IDictionary <string, object> GetMetaResponseTokens(OnDeviceDecisioningRule rule, ISet <string> responseTokenKeys)
        {
            var result = new Dictionary <string, object>();

            if (rule.Meta == null)
            {
                return(result);
            }

            foreach (var meta in rule.Meta)
            {
                if (responseTokenKeys.Contains(meta.Key))
                {
                    result.Add(meta.Key, meta.Value);
                }
            }

            return(result);
        }
예제 #5
0
 private double ComputeAllocation(string visitorId, OnDeviceDecisioningRule rule, string salt = "0")
 {
     return(AllocationUtils.CalculateAllocation(this.clientConfig.Client, rule.ActivityId, visitorId, salt));
 }
예제 #6
0
        private IDictionary <string, object> GetConsequence(ISet <string> responseTokenKeys, OnDeviceDecisioningRule rule, IDictionary <string, object> localContext)
        {
            if (rule.Consequence == null)
            {
                return(null);
            }

            var consequence = rule.Consequence
                              .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

            if (responseTokenKeys.Count == 0 || !consequence.ContainsKey(DecisioningDetailsExecutor.Options))
            {
                return(consequence);
            }

            var options = (JArray)consequence[DecisioningDetailsExecutor.Options];

            if (options == null || !options.HasValues)
            {
                return(consequence);
            }

            var optionsList = options.ToObject <IList <Option> >();

            if (optionsList == null)
            {
                return(consequence);
            }

            var option = optionsList[0];

            option.ResponseTokens ??= new Dictionary <string, object>();
            var responseTokens = option.ResponseTokens;

            responseTokens.Add(ResponseTokenDecisioningMethod, OnDevice);
            responseTokens.AddAll(GetGeoResponseTokens(localContext, responseTokenKeys));
            responseTokens.AddAll(GetMetaResponseTokens(rule, responseTokenKeys));
            consequence[DecisioningDetailsExecutor.Options] = optionsList;

            return(consequence);
        }