public void ProcessDone(long[] componentsIds, decimal processedAmount, V2.ItemIdQuantityPair[] processedValues) { if (Amount < processedAmount) { throw new ArgumentException($"{nameof(processedAmount)} is more than {nameof(Amount)}"); } var unhandledWires = _components.Where(wire => !wire.IsHandled).Select(x => x.Id).ToArray(); if (componentsIds.Any(w => !unhandledWires.Contains(w))) { throw new ArgumentException($"{nameof(componentsIds)} has unknown ids"); } var processedProductIds = _products.Select(p => p.ItemId).ToArray(); if (processedValues.Any(p => !processedProductIds.Contains(p.ItemId))) { throw new ArgumentException($"{nameof(processedValues)} has unknown ids"); } var refundedEvent = new V2.ProcessedEvent(componentsIds, processedValues, processedAmount); Update(refundedEvent); }
public void When(V2.ProcessedEvent domainEvent) { foreach (var item in domainEvent.ProductValues) { var product = _products.First(x => x.ItemId.Equals(item.ItemId)); if (product.Quantity == item.Quantity || item.ShouldProcessAll) { _products.Remove(product); } product.SubtractQuantity(item.Quantity); } Array.ForEach(_components.Where(x => domainEvent.ComponentIds.Contains(x.Id)).ToArray(), wire => wire.Handled()); Amount -= domainEvent.Amount; }
public async Task Projected(string key, V2.ProcessedEvent domainEvent, CancellationToken cancellationToken) { var processed = domainEvent.ComponentIds.Select(cid => _componentRepository.SetProcessedAsync(cid, cancellationToken)); await Task.WhenAll(processed); }