public void SendOrderStockConfirmedIntegrationEvent(Guid orderId) { var integrationEvent = new OrderStockConfirmedIntegrationEvent { OrderId = orderId }; var serializedCommand = JsonConvert.SerializeObject(integrationEvent); var properties = _channel.CreateBasicProperties(); properties.ContentType = "application/json"; _channel.BasicPublish(ExchangeStockConfirmed, routingKey: "", basicProperties: properties, body: Encoding.UTF8.GetBytes(serializedCommand)); }
public void Consume(OrderStockConfirmedIntegrationEvent command) { var client = new MongoClient(_options.Value.ConnectionString); var database = client.GetDatabase(_options.Value.DatabaseName); var ordersCollection = database.GetCollection <Order>(_options.Value.CollectionName); var order = ordersCollection.Find(o => o.OrderId == command.OrderId.ToString()).FirstOrDefault(); if (order == null) { throw new Exception($"Cannot find order with id {command.OrderId}"); } Console.WriteLine("Stock is confirmed"); }
public async Task Handle(OrderStatusChangedToAwaitingValidationIntegrationEvent @event) { //Check item stocks. List <ConfirmedStockItem> confirmedItems = new List <ConfirmedStockItem>(); foreach (var item in @event.StockItems) { var product = await _catalogContext.CatalogItems.FindAsync(item.ProductId); confirmedItems.Add( new ConfirmedStockItem { ProductId = item.ProductId, HasStock = product.AvailableStock >= item.Units }); } //If they are available publish an event accepting the order, if not reject the order //var resultEvent=confirmedItems.Any(c=>!c.HasStock) ? // (IntegrationEvent) new OrderStockRejectedIntegrationEvent(@event.OrderId) : new OrderStockConfirmedIntegrationEvent(@event.OrderId); IntegrationEvent resultEvent = null; if (confirmedItems.Any(c => !c.HasStock)) { resultEvent = new OrderStockRejectedIntegrationEvent(@event.OrderId); } else { resultEvent = new OrderStockConfirmedIntegrationEvent(@event.OrderId); foreach (var item in @event.StockItems) { var product = _catalogContext.CatalogItems.Find(item.ProductId); product.AvailableStock -= item.Units; _catalogContext.SaveChanges(); } } //TODO: save event to eventLog //Thread.Sleep(2000); _eventBus.Publish(resultEvent); }
public async Task OrderStarted(OrderStockConfirmedIntegrationEvent @event) { var handler = _serviceProvider.GetRequiredService <OrderStockConfirmedIntegrationEventHandler>(); await handler.Handle(@event); }
public async Task Handle(OrderStockConfirmedIntegrationEvent message, IMessageHandlerContext context) { Data.StockConfirmed = true; await ContinueOrderingProcess(context); }
public Task Handle(OrderStockConfirmedIntegrationEvent integrationEvent) { return(GetOrderingProcessActor(integrationEvent.OrderId).NotifyStockConfirmed()); }