public bool TryUpdateSubscription(MailchimpSubscriptionPart part) { var sub = part.Subscription; if (sub.Audience == null || string.IsNullOrWhiteSpace(sub.Audience.Identifier)) { return(false); } var settings = part.Settings.GetModel <MailchimpSubscriptionPartSettings>(); var putPayload = _tokenizer.Replace(settings.PutPayload, new { Content = part.ContentItem }); var memberEmail = _tokenizer.Replace(settings.MemberEmail, new { Content = part.ContentItem }); var syncronized = false; var urlTokens = new Dictionary <string, string> { { "{list-id}", sub.Audience.Identifier }, { "{member-id}", _mailchimpService.ComputeSubscriberHash(memberEmail) } }; string result = ""; if (sub.Subscribed) { JavaScriptSerializer serializer = new JavaScriptSerializer(); JObject body = JObject.Parse(putPayload ?? "{}"); syncronized = TryApiCall(HttpVerbs.Put, CalculateUrlByType(RequestTypes.Member, urlTokens), body, ref result); } else { syncronized = TryApiCall(HttpVerbs.Delete, CalculateUrlByType(RequestTypes.Member, urlTokens), null, ref result); } return(syncronized); }
public bool IsUserRegistered(MailchimpSubscriptionPart part) { string result = ""; var urlTokens = new Dictionary <string, string> { { "{list-id}", part.Subscription.Audience.Identifier }, { "{member-id}", _mailchimpService.ComputeSubscriberHash(part.ContentItem.As <UserPart>() != null ? part.ContentItem.As <UserPart>().Email : "") } }; return(TryApiCall(HttpVerbs.Get, CalculateUrlByType(RequestTypes.Member, urlTokens), null, ErrorHandlerGetMember, ref result)); }
private bool TryUpdateSubscription(MailchimpSubscriptionPart part) { // When a User is Created a Published is improperly called to early and the part is not Updated // So I skip this step if (part.Subscription.Audience == null) { return(false); } if (part.As <UserPart>() != null && part.As <UserPart>().EmailStatus != UserStatus.Approved) { // A registered user with an EmailStatus not Approved should not Update Mailchimp member return(false); } if (!part.IsPublished()) { return(false); } // check if subscriptions is different from orchard to mailchimp // if changed it fires an update over Mailchimp servers if (part.Subscription.Subscribed != _apiService.IsUserRegistered(part) || part.As <UserPart>() == null) { var settings = part.Settings.GetModel <MailchimpSubscriptionPartSettings>(); if (!_apiService.TryUpdateSubscription(part)) { if (settings.NotifySubscriptionResult || AdminFilter.IsApplied(_workContext.GetContext().HttpContext.Request.RequestContext)) { _notifier.Error(T("Oops! We have experienced a problem during your email subscription. Please, retry later.")); } return(false); } else { if (settings.NotifySubscriptionResult || AdminFilter.IsApplied(_workContext.GetContext().HttpContext.Request.RequestContext)) { if (part.Subscription.Subscribed) { _notifier.Information(T("Nice to meet you! Your subscription has been accepted.")); } else { _notifier.Information(T("You have been unsubscribed.")); } } return(true); } } else { return(false); } }
public bool TryUpdateSubscription(MailchimpSubscriptionPart part) { var sub = part.Subscription; if (sub.Audience == null || string.IsNullOrWhiteSpace(sub.Audience.Identifier)) { return(false); } var settings = part.Settings.GetModel <MailchimpSubscriptionPartSettings>(); var putPayload = _tokenizer.Replace(settings.PutPayload, new { Content = part.ContentItem }); var memberEmail = _tokenizer.Replace(settings.MemberEmail, new { Content = part.ContentItem }); var syncronized = false; using (var httpClient = new HttpClient()) { HttpResponseMessage response; SetHeader(httpClient); if (sub.Subscribed) { JavaScriptSerializer serializer = new JavaScriptSerializer(); object body = serializer.Deserialize <dynamic>(putPayload ?? "{}"); response = httpClient.PutAsJsonAsync(new Uri(GetMemberUrl(sub.Audience.Identifier, memberEmail)), body).Result; } else { response = httpClient.DeleteAsync(new Uri(GetMemberUrl(sub.Audience.Identifier, memberEmail))).Result; } if (!response.IsSuccessStatusCode) { syncronized = false; string errorMessage = "Mailchimp: Error while syncronyzing member.\r\n" + "Error while {0} {1} to Mailchimp.\r\n" + "Payload:\r\n{2}\r\n\r\n" + "Mailchimp Response:\r\n{3}\r\n"; Logger.Error(errorMessage, sub.Subscribed ? "Subscribing" : "Unsubscribing", memberEmail, putPayload, response.ReasonPhrase + "\r\n" + response.Content.ReadAsStringAsync().Result); } else { syncronized = true; } return(syncronized); } }
public void CheckAcceptedPolicy(MailchimpSubscriptionPart part) { //Check if all policies have been accepted before firing a Mailchimp member update var policies = new List <PoliciesForUserViewModel>(); var settings = part.Settings.GetModel <MailchimpSubscriptionPartSettings>(); IEnumerable <PolicyAnswer> allAnswers = TryFindPolicyAnswers(part); if (settings.PolicyTextReferences != null && settings.PolicyTextReferences.Any()) { var accepted = allAnswers.Where(x => x.Accepted).Select(x => "{" + x.PolicyTextId + "}").ToList(); var requiredPolicies = settings.PolicyTextReferences.OrderBy(x => x).ToList(); var missingPoliciesIds = requiredPolicies.Except(accepted); if (missingPoliciesIds.Any()) // If Required Policies have not been accepted { throw new MissingPoliciesException(); } } }
private IEnumerable <PolicyAnswer> TryFindPolicyAnswers(MailchimpSubscriptionPart part) { // Read Answers from the DB var answers = _policyService.GetPolicyAnswersForContent(part.Id).Select(x => new PolicyAnswer { PolicyTextId = x.PolicyTextInfoPartRecord.Id, Accepted = x.Accepted }).ToList(); // Adds Current answers if existing if (_controllerAccessor.Context != null && _controllerAccessor.Context.Controller.ViewBag.PolicyAnswers != null) { var currentAnswers = (List <PolicyAnswer>)_controllerAccessor.Context.Controller.ViewBag.PolicyAnswers; foreach (var answer in currentAnswers) //Removes previous answers to same Policy { answers.RemoveAll((match) => { return(match.PolicyTextId == answer.PolicyTextId); }); } answers = answers.Union(currentAnswers).ToList(); //Merge new answers } return(answers); }
public void CheckAcceptedPolicy(MailchimpSubscriptionPart part) { //Check if all policies have been accepted before firing a Mailchimp member update var policies = new List <PoliciesForUserViewModel>(); var settings = part.Settings.GetModel <MailchimpSubscriptionPartSettings>(); IEnumerable <PolicyAnswer> allAnswers = TryFindPolicyAnswers(part); if (// sanity checks part.Subscription != null && part.Subscription.Audience != null && !string.IsNullOrWhiteSpace(part.Subscription.Audience.Identifier) // and only try to check stuff if the user subscribed && part.Subscription.Subscribed) { if (settings.PolicyTextReferencesToArray() != null && settings.PolicyTextReferencesToArray().Any()) { var accepted = allAnswers.Where(x => x.Accepted).Select(x => "{" + x.PolicyTextId + "}").ToList(); var requiredPolicies = settings.PolicyTextReferencesToArray().OrderBy(x => x).ToList(); var missingPoliciesIds = requiredPolicies.Except(accepted); if (missingPoliciesIds.Any()) // If Required Policies have not been accepted { var ids = missingPoliciesIds.Select(x => int.Parse(x.Trim(new char[] { '{', '}' }))).ToArray(); // GET the policies with the current culture // TODO: make the culture check optional via settings var localizedMissingPoliciesids = _orchardServices.ContentManager.GetMany <CommonPart>(ids, VersionOptions.Published, QueryHints.Empty).Where(x => x.As <LocalizationPart>() == null || (x.As <LocalizationPart>() != null && x.As <LocalizationPart>().Culture != null && x.As <LocalizationPart>().Culture.Culture == _orchardServices.WorkContext.CurrentCulture)) .Select(x => x.Id); if (localizedMissingPoliciesids.Count() > 0) { throw new MissingPoliciesException(); } } } } }
public bool TryUpdateSubscription(MailchimpSubscriptionPart part, bool isUserCreation = false) { var sub = part.Subscription; if (sub.Audience == null || string.IsNullOrWhiteSpace(sub.Audience.Identifier)) { return(false); } var settings = part.Settings.GetModel <MailchimpSubscriptionPartSettings>(); var putPayload = _tokenizer.Replace(settings.PutPayload, new { Content = part.ContentItem }); var memberEmail = _tokenizer.Replace(settings.MemberEmail, new { Content = part.ContentItem }); var syncronized = false; var urlTokens = new Dictionary <string, string> { { "{list-id}", sub.Audience.Identifier }, { "{member-id}", _mailchimpService.ComputeSubscriberHash(memberEmail) } }; string result = ""; var urlApiCall = CalculateUrlByType(RequestTypes.Member, urlTokens); if (sub.Subscribed) { // register member JavaScriptSerializer serializer = new JavaScriptSerializer(); JObject body = JObject.Parse(putPayload ?? "{}"); syncronized = TryApiCall(HttpVerbs.Put, urlApiCall, body, ErrorHandlerDefault, ref result); if (isUserCreation) { _workflowManager.TriggerEvent("UserCreatedOnMailchimp", part, () => new Dictionary <string, object> { { "Syncronized", syncronized }, { "APICallEdit", new APICallEdit { Url = urlApiCall, RequestType = RequestTypes.Member.ToString(), HttpVerb = HttpVerbs.Put.ToString(), Payload = putPayload } }, { "Email", part.As <UserPart>() == null ? body["email_address"].ToString() : part.As <UserPart>().Email } }); } else { _workflowManager.TriggerEvent("UserUpdatedOnMailchimp", part, () => new Dictionary <string, object> { { "Syncronized", syncronized }, { "APICallEdit", new APICallEdit { Url = urlApiCall, RequestType = RequestTypes.Member.ToString(), HttpVerb = HttpVerbs.Put.ToString(), Payload = putPayload } }, { "Email", part.As <UserPart>() == null ? body["email_address"].ToString() : part.As <UserPart>().Email } }); } IsNewSubscription = syncronized; _workContextAccessor.GetContext().HttpContext.Items["newsletterSubscription"] = syncronized; } else { // delete the member only if they are being edited if (!isUserCreation) { syncronized = TryApiCall(HttpVerbs.Delete, urlApiCall, null, ErrorHandlerDelete, ref result); _workflowManager.TriggerEvent("UserDeletedOnMailchimp", part, () => new Dictionary <string, object> { { "Syncronized", syncronized }, { "APICallEdit", new APICallEdit { Url = urlApiCall, RequestType = RequestTypes.Member.ToString(), HttpVerb = HttpVerbs.Delete.ToString(), Payload = putPayload } }, { "Email", part.As <UserPart>().Email } }); } else { // return operation successfully executed for the next step syncronized = true; } } return(syncronized); }