public async Task <IActionResult> UpdateProductsPrices([FromBody] ProductPrice[] productPrices) { var result = await _pricingSearchService.SearchPricesAsync(new PricesSearchCriteria { Take = int.MaxValue, ProductIds = productPrices.Select(x => x.ProductId).ToArray() }); var targetPricesGroups = result.Results.GroupBy(x => x.PricelistId); var sourcePricesGroups = productPrices.SelectMany(x => x.Prices).GroupBy(x => x.PricelistId); var changedPrices = new List <Price>(); var deletedPrices = new List <Price>(); foreach (var sourcePricesGroup in sourcePricesGroups) { var targetPricesGroup = targetPricesGroups.FirstOrDefault(x => x.Key == sourcePricesGroup.Key); if (targetPricesGroup != null) { sourcePricesGroup.ToArray().CompareTo(targetPricesGroup.ToArray(), EqualityComparer <Price> .Default, (state, x, y) => { switch (state) { case EntryState.Modified: case EntryState.Added: changedPrices.Add(x); break; case EntryState.Deleted: deletedPrices.Add(x); break; } }); } else { changedPrices.AddRange(sourcePricesGroup); } } await _pricingService.SavePricesAsync(changedPrices.ToArray()); if (!deletedPrices.IsNullOrEmpty()) { await _pricingService.DeletePricesAsync(deletedPrices.Select(x => x.Id).ToArray()); } return(NoContent()); }
public virtual async Task Handle(ProductChangedEvent message) { if (message == null) { throw new ArgumentNullException(nameof(message)); } var deletedProductIds = message.ChangedEntries.Where(x => x.EntryState == EntryState.Deleted && x.OldEntry.Id != null) .Select(x => x.OldEntry.Id) .Distinct().ToArray(); if (!deletedProductIds.IsNullOrEmpty()) { var searchResult = await _pricingSearchService.SearchPricesAsync(new PricesSearchCriteria { ProductIds = deletedProductIds, Take = int.MaxValue }); if (searchResult.Results.Any()) { await _pricingService.DeletePricesAsync(searchResult.Results.Select(p => p.Id).ToArray()); } } }