/// <summary> /// If variation is assigned, allocate the goal using goalIdentifier. /// </summary> /// <param name="campaignKey"></param> /// <param name="userId"></param> /// <param name="goalIdentifier"></param> /// <param name="campaign"></param> /// <param name="customVariables"></param> /// <param name="variationTargetingVariables"></param> /// <param name="apiName"></param> /// <returns> /// If Variation is allocated and goal with given identifier is found, return UserAssignedInfo with valid information, otherwise, Empty UserAssignedInfo object. /// </returns> private UserAllocationInfo AllocateVariation(string campaignKey, string userId, BucketedCampaign campaign, Dictionary <string, dynamic> customVariables, Dictionary <string, dynamic> variationTargetingVariables, string goalIdentifier, string apiName) { var userAllocationInfo = this.AllocateVariation(campaignKey, userId, campaign, customVariables, variationTargetingVariables, apiName); if (userAllocationInfo.Variation != null) { if (userAllocationInfo.Campaign.Goals.TryGetValue(goalIdentifier, out Goal goal)) { userAllocationInfo.Goal = goal; } else { LogErrorMessage.TrackApiGoalNotFound(file, goalIdentifier, campaignKey, userId); } } else { LogErrorMessage.TrackApiVariationNotFound(file, campaignKey, userId); } return(userAllocationInfo); }
/// <summary> /// Tracks a conversion event for a particular user for a running server-side campaign. /// </summary> /// <param name="campaignKey">Campaign key to uniquely identify a server-side campaign.</param> /// <param name="userId">User ID which uniquely identifies each user.</param> /// <param name="goalIdentifier">The Goal key to uniquely identify a goal of a server-side campaign.</param> /// <param name="options">Dictionary for passing extra parameters to activate</param> /// <returns> /// A boolean value based on whether the impression was made to the VWO server. /// True, if an impression event is successfully being made to the VWO server for report generation. /// False, If userId provided is not part of campaign or when unexpected error comes and no impression call is made to the VWO server. /// </returns> public bool Track(string campaignKey, string userId, string goalIdentifier, Dictionary <string, dynamic> options = null) { if (options == null) { options = new Dictionary <string, dynamic>(); } string revenueValue = options.ContainsKey("revenueValue") ? options["revenueValue"].ToString() : null; Dictionary <string, dynamic> customVariables = options.ContainsKey("customVariables") ? options["customVariables"] : null; Dictionary <string, dynamic> variationTargetingVariables = options.ContainsKey("variationTargetingVariables") ? options["variationTargetingVariables"] : null; string goalTypeToTrack = options.ContainsKey("goalTypeToTrack") ? options["goalTypeToTrack"] : null; bool shouldTrackReturningUser = options.ContainsKey("shouldTrackReturningUser") ? options["shouldTrackReturningUser"] : this._shouldTrackReturningUser; if (this._validator.Track(campaignKey, userId, goalIdentifier, revenueValue, options)) { goalTypeToTrack = !string.IsNullOrEmpty(goalTypeToTrack) ? goalTypeToTrack : this._goalTypeToTrack != null ? this._goalTypeToTrack : Constants.GoalTypes.ALL; var campaign = this._campaignAllocator.GetCampaign(this._settings, campaignKey); if (campaign == null || campaign.Status != Constants.CampaignStatus.RUNNING) { LogErrorMessage.CampaignNotRunning(typeof(IVWOClient).FullName, campaignKey, nameof(Track)); return(false); } if (campaign.Type == Constants.CampaignTypes.FEATURE_ROLLOUT) { LogErrorMessage.InvalidApi(typeof(IVWOClient).FullName, userId, campaignKey, campaign.Type, nameof(Track)); return(false); } var assignedVariation = this.AllocateVariation(campaignKey, userId, campaign, customVariables, variationTargetingVariables, goalIdentifier: goalIdentifier, apiName: nameof(Track)); var variationName = assignedVariation.Variation?.Name; var selectedGoalIdentifier = assignedVariation.Goal?.Identifier; if (string.IsNullOrEmpty(variationName) == false) { if (string.IsNullOrEmpty(selectedGoalIdentifier) == false) { if (goalTypeToTrack != assignedVariation.Goal.Type && goalTypeToTrack != Constants.GoalTypes.ALL) { return(false); } if (!this.isGoalTriggerRequired(campaignKey, userId, goalIdentifier, variationName, shouldTrackReturningUser)) { return(false); } bool sendImpression = true; if (assignedVariation.Goal.IsRevenueType() && string.IsNullOrEmpty(revenueValue)) { sendImpression = false; LogErrorMessage.TrackApiRevenueNotPassedForRevenueGoal(file, goalIdentifier, campaignKey, userId); } else if (assignedVariation.Goal.IsRevenueType() == false) { revenueValue = null; } if (sendImpression) { var trackGoalRequest = ServerSideVerb.TrackGoal(this._settings.AccountId, assignedVariation.Campaign.Id, assignedVariation.Variation.Id, userId, assignedVariation.Goal.Id, revenueValue, this._isDevelopmentMode); trackGoalRequest.ExecuteAsync(); return(true); } } else { LogErrorMessage.TrackApiGoalNotFound(file, goalIdentifier, campaignKey, userId); } } } return(false); }