public async Task Handle(OrderStockUpdatedMessage message)
        {
            _logger.LogInformation($"OrderStockUpdated message was received. Order Id = {message.OrderId}");
            var wallet = await _dbContext.Wallets.FirstOrDefaultAsync(x => x.UserId == message.UserId);

            var totalPrice = message.Products.Sum(x => x.Quantity * x.UnitPrice);

            if (wallet.Balance >= totalPrice)
            {
                wallet.Balance -= totalPrice;
                await _dbContext.SaveChangesAsync();

                await _kafkaMessageProducer.Produce(OrderWalletPayCompletedTopicName, message.OrderId.ToString(),
                                                    new { message.OrderId });

                _logger.LogInformation($"OrderWalletPayCompleted message was sent. Order Id = {message.OrderId}");
            }
            else
            {
                var orderWalletPayErrorMessage = new OrderWalletPayErrorMessage
                {
                    OrderId     = message.OrderId,
                    WalletError = WalletError.InsufficientBalance,
                    Products    = message.Products.Select(x => new ProductDto
                    {
                        ProductId = x.ProductId, Quantity = x.Quantity
                    })
                };

                await _kafkaMessageProducer.Produce(OrderWalletPayErrorTopicName, message.OrderId.ToString(),
                                                    orderWalletPayErrorMessage);

                _logger.LogWarning($"OrderWalletPayError message was sent. Order Id = {message.OrderId}");
            }
        }
Ejemplo n.º 2
0
 private async Task ProduceOrderStockUpdateErrorMessage(OrderCreatedMessage orderCreatedMessage)
 {
     await _kafkaMessageProducer.Produce(OrderStockUpdateErrorTopic, orderCreatedMessage.Id.ToString(),
                                         new OrderStockUpdateErrorMessage
     {
         OrderId          = orderCreatedMessage.Id,
         StockUpdateError = StockUpdateError.StockNotEnough
     });
 }
Ejemplo n.º 3
0
        public async Task <IActionResult> Create([FromBody] Order order)
        {
            var entityEntry = await _dbContext.Orders.AddAsync(order);

            var savedOrder = entityEntry.Entity;

            _logger.LogInformation($"Order accepted. Order Id = {savedOrder.Id}");

            await _dbContext.SaveChangesAsync();

            await _messageProducer.Produce(OrderCreatedTopicName, savedOrder.Id.ToString(), savedOrder);

            _logger.LogInformation($"OrderCreated message was sent. Order Id = {savedOrder.Id}");

            Response.Headers.Add("Location", $"/orders/{savedOrder.Id}");
            return(Accepted());
        }