Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
 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);
            }
        }
Esempio n. 5
0
        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();
                }
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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();
                        }
                    }
                }
            }
        }
Esempio n. 8
0
        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);
        }