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); } } }