public ContentResult Index(ArticleChangedNotification articleChangedNotification)
        {
            _productChangeNotificator.NotifyProductsChanged(articleChangedNotification);

            return(Content("Ok"));
        }
        public void NotifyProductsChanged(ArticleChangedNotification articleChangedNotification)
        {
            var articleDependencyService = ObjectFactoryBase.Resolve <IArticleDependencyService>();

            var oldArticle = XDocument.Parse(articleChangedNotification.Old_Xml).Root.Elements().First();

            var newArticle = XDocument.Parse(articleChangedNotification.New_Xml).Root.Elements().First();

            int articleId = int.Parse(newArticle.Attribute("id").Value);

            var newFields = newArticle.Elements("customFields").First().Elements("field");

            var oldFields = oldArticle.Elements("customFields").First().Elements("field");

            var changedFields = GetChangedFields(newFields, oldFields);

            var affectedProductIdsByContentId = changedFields.Any()
                                ? articleDependencyService.GetAffectedProducts(articleId, changedFields)
                                : new Dictionary <int, int[]>();

            var newExtensions = newArticle.Elements("extensions").First().Elements("extension");

            var oldExtensions = oldArticle.Elements("extensions").First().Elements("extension");

            foreach (var newExtension in newExtensions)
            {
                int typeId = int.Parse(newExtension.Attribute("typeId").Value);

                int extensionArticleId = int.Parse(newExtension.Attribute("id").Value);

                var newExtensionFields = newExtension.Elements("customFields").First().Elements("field");

                var oldExtensionFields = oldExtensions.Single(x => x.Attribute("typeId").Value == typeId.ToString()).Elements("customFields").First().Elements("field");

                var changedExtensionFields = GetChangedFields(newExtensionFields, oldExtensionFields);

                if (changedExtensionFields.Count > 0)
                {
                    foreach (var affectedProductsInContent in articleDependencyService.GetAffectedProducts(extensionArticleId, changedExtensionFields))
                    {
                        if (!affectedProductIdsByContentId.ContainsKey(affectedProductsInContent.Key))
                        {
                            affectedProductIdsByContentId[affectedProductsInContent.Key] = affectedProductsInContent.Value;
                        }
                        else
                        {
                            affectedProductIdsByContentId[affectedProductsInContent.Key] = affectedProductIdsByContentId[affectedProductsInContent.Key].Union(affectedProductsInContent.Value).ToArray();
                        }
                    }
                }
            }

            foreach (var productChangeSubscriber in _subscribers)
            {
                try
                {
                    productChangeSubscriber.NotifyProductsChanged(affectedProductIdsByContentId);
                }
                catch (Exception ex)
                {
                    _logger.ErrorException("Error while running " + productChangeSubscriber.GetType().Name, ex);
                }
            }
        }