Exemple #1
0
        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");
        }
Exemple #3
0
        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());
 }