Exemple #1
0
        /// <summary>
        /// Handles the notifications events sent by SendGrid.
        /// </summary>
        /// <param name="events">An array of the events that have occurred.</param>
        public void Post(SendGridEvent[] events)
        {
            if (this.IsToRequireAuthentication())
            {
                ServiceUtility.RequestBackendUserAuthentication();
            }

            // TODO: provider name should be configurable
            // TODO: get the manager only if an event that we are interested in is present in the events variable.
            // Could be done with a property but I am not aware of the this object lifecycle at the moment.
            // TODO: Ideally the whole data related operations like getting subscribers, campaigns and writing statistics
            // should be in a separate component and not in the service itself.
            var newslettersManager = NewslettersManager.GetManager();
            var isToSaveChanges    = false;

            // TODO: Use dynamic objects and inspect them for the required properties instead of
            // this strongly typed approach since the different events have very different properties
            // and this hook should be able to handle all and not throw exceptions if an event that is
            // not supported is received.
            foreach (var sendGridEvent in events)
            {
                // TODO: rewrite this with chain of responsibility so that additional event handlers can be easily added.
                if (this.IsToHanlde(sendGridEvent))
                {
                    BounceStatus bounceStatus = this.ResolveStatus(sendGridEvent);

                    Campaign   campaign;
                    Subscriber subscriber;
                    try
                    {
                        campaign   = newslettersManager.GetCampaign(sendGridEvent.SitefinityCampaignId);
                        subscriber = newslettersManager.GetSubscriber(sendGridEvent.SitefinitySubscriberId);
                    }
                    catch (Telerik.Sitefinity.SitefinityExceptions.ItemNotFoundException)
                    {
                        // If the campaign or the subscriber is not found we skip to the next event.
                        break;
                    }

                    this.WriteStatistics(newslettersManager, campaign, subscriber, bounceStatus);
                    this.PerformBounceAction(newslettersManager, subscriber, bounceStatus);
                    isToSaveChanges = true;
                }
            }

            if (isToSaveChanges)
            {
                newslettersManager.SaveChanges();
            }

            this.Response.StatusCode = (int)HttpStatusCode.OK;
        }
Exemple #2
0
        private void PerformBounceAction(NewslettersManager newslettersManager, Subscriber subscriber, BounceStatus bounceStatus)
        {
            var bounceActionResolver = ObjectFactory.Resolve <BounceActionResolver>();

            BounceAction bounceAction = bounceActionResolver.ResolveAction(bounceStatus);

            bounceActionResolver.PerformAction(newslettersManager, subscriber.Id, bounceAction, false);
        }
        private void WriteStatistics(NewslettersManager newslettersManager, Campaign campaign, Subscriber subscriber, BounceStatus bounceStatus)
        {
            // TODO: check for indexes on the bounce status database table by campaign id and subscriber id.
            var bounceStat = newslettersManager.GetBounceStats().Where(b => b.Campaign.Id == campaign.Id && b.Subscriber.Id == subscriber.Id).FirstOrDefault();
            if (bounceStat == null)
            {
                bounceStat = newslettersManager.CreateBounceStat();
            }
            else
            {
                // If the bounce stat is already created, then the current bounce is caused by retry operation.
                bounceStat.RetryCount++;
            }

            bounceStat.Campaign = campaign;
            bounceStat.Subscriber = subscriber;
            bounceStat.SmtpStatus = Enum.GetName(typeof(Telerik.Sitefinity.Newsletters.Model.MessageStatus), bounceStatus);
            bounceStat.BounceStatus = bounceStatus;
            bounceStat.IsProcessing = false;
        }
Exemple #4
0
        private void WriteStatistics(NewslettersManager newslettersManager, Campaign campaign, Subscriber subscriber, BounceStatus bounceStatus)
        {
            // TODO: check for indexes on the bounce status database table by campaign id and subscriber id.
            var bounceStat = newslettersManager.GetBounceStats().Where(b => b.Campaign.Id == campaign.Id && b.Subscriber.Id == subscriber.Id).FirstOrDefault();

            if (bounceStat == null)
            {
                bounceStat = newslettersManager.CreateBounceStat();
            }
            else
            {
                // If the bounce stat is already created, then the current bounce is caused by retry operation.
                bounceStat.RetryCount++;
            }

            bounceStat.Campaign     = campaign;
            bounceStat.Subscriber   = subscriber;
            bounceStat.SmtpStatus   = Enum.GetName(typeof(Telerik.Sitefinity.Newsletters.Model.MessageStatus), bounceStatus);
            bounceStat.BounceStatus = bounceStatus;
            bounceStat.IsProcessing = false;
        }
        private void PerformBounceAction(NewslettersManager newslettersManager, Subscriber subscriber, BounceStatus bounceStatus)
        {
            var bounceActionResolver = ObjectFactory.Resolve<BounceActionResolver>();

            BounceAction bounceAction = bounceActionResolver.ResolveAction(bounceStatus);
            bounceActionResolver.PerformAction(newslettersManager, subscriber.Id, bounceAction, false);
        }