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))); }
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); }
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)); }
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); }
private double ComputeAllocation(string visitorId, OnDeviceDecisioningRule rule, string salt = "0") { return(AllocationUtils.CalculateAllocation(this.clientConfig.Client, rule.ActivityId, visitorId, salt)); }
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); }