private async Task PublishPaymentEvents(Payment payment)
        {
            if (!payment.HasNotifications())
            {
                return;
            }

            foreach (var paymentEvent in payment.Notifications)
            {
                await _mediatrHandler.PublishEvent(paymentEvent);
            }
        }
        public async Task Handle(StartedOrderEvent message, CancellationToken cancellationToken)
        {
            var result = await _stockService.DebitListOrderProducts(message.OrderProducts);

            if (result)
            {
                await _mediatorHandler.PublishEvent(new OrderStockConfirmedEvent(message.OrderId, message.ClientId, message.Total, message.OrderProducts, message.CardName, message.CardNumber, message.ExpirationDate, message.CvvCard ));
            }
            else
            {
                await _mediatorHandler.PublishEvent(new OrderStockRejectedEvent(message.OrderId, message.ClientId));
            }
        }
Esempio n. 3
0
        public async Task Handle(OrderStartedEvent message, CancellationToken cancellationToken)
        {
            bool IsStockReservedForOrder = await _stockService.DebitStock(message.OrderProducts);

            if (IsStockReservedForOrder)
            {
                await _mediatrHandler.PublishEvent(new StockReservedForOrderEvent(message.CustomerId, message.OrderId, message.TotalPrice, message.CardName, message.CardNumber,
                                                                                  message.CardExpirationDate, message.CardCvv, message.OrderProducts));
            }
            else
            {
                await _mediatrHandler.PublishEvent(new InsufficientStockForOrderEvent(message.CustomerId, message.OrderId));
            }
        }
Esempio n. 4
0
        private async Task <bool> DebitStockItem(Guid productId, int quantity)
        {
            var product = await _productRepository.GetById(productId);

            if (product == null)
            {
                return(false);
            }

            if (!product.HasStock(quantity))
            {
                await _mediatorHandler.PublishNotification(new DomainNotification("Stock", $"Product - {product.Name} out of stock."));

                return(false);
            }

            product.DebitStock(quantity);

            // TODO: 10 can parameterizable in config file
            if (product.StockQuantity < 10)
            {
                await _mediatorHandler.PublishEvent(new ProductBelowStockEvent(product.Id, product.StockQuantity));
            }

            _productRepository.Update(product);
            return(true);
        }
Esempio n. 5
0
        public async Task <bool> DebitStock(Guid productId, int quantity)
        {
            var product = await _productRepository.GetById(productId);

            if (product == null)
            {
                return(false);
            }

            if (!product.HasStock(quantity))
            {
                await _mediatrHandler.PublishNotification(new DomainNotification("Stock", $"The product {product.Name} is out of stock."));

                return(false);
            }
            product.DebitStock(quantity);

            // TODO: To parameterize the low stock quantity
            if (product.StockQuantity < 10)
            {
                await _mediatrHandler.PublishEvent(new LowProductStockEvent(product.Id, product.StockQuantity));
            }

            _productRepository.Update(product);
            return(await _productRepository.UnitOfWork.Commit());
        }
Esempio n. 6
0
        public async Task <bool> DecreaseInventory(Guid productId, int amount)
        {
            var product = await _productRepository.GetById(productId);

            if (product == null)
            {
                return(false);
            }

            if (!product.HasInventory(amount))
            {
                return(false);
            }

            product.DecreaseInventory(amount);

            //TODO: Set minimum inventory amount as parameter
            if (product.InventoryAmount < 10)
            {
                await _bus.PublishEvent(new LowProductInventoryEvent(product.Id, product.InventoryAmount));
            }

            _productRepository.Update(product);
            return(await _productRepository.UnitOfWork.Commit());
        }
Esempio n. 7
0
        public static async Task PublishEvents(this IMediatrHandler mediator, PaymentContext ctx)
        {
            var domainEntities = ctx.ChangeTracker
                                 .Entries <Entity>()
                                 .Where(x => x.Entity.Notifications != null && x.Entity.Notifications.Any());

            var domainEvents = domainEntities
                               .SelectMany(x => x.Entity.Notifications)
                               .ToList();

            domainEntities.ToList()
            .ForEach(entity => entity.Entity.CleanEvents());

            var tasks = domainEvents
                        .Select(async(domainEvent) => {
                await mediator.PublishEvent(domainEvent);
            });

            await Task.WhenAll(tasks);
        }
Esempio n. 8
0
        public async Task <bool> DecreaseStock(Guid productId, int quantity)
        {
            var product = await _productRepository.GetById(productId);

            if (product == null)
            {
                return(false);
            }

            product.DecreaseStock(quantity);

            if (product.QuantityInStock < 10)
            {
                await _mediatrHandler.PublishEvent(new ProductOutOfStockEvent(product.Id, product.QuantityInStock));
            }

            _productRepository.UpdateProduct(product);

            return(await _productRepository.UnitOfWork.Commit());
        }
        public async Task <Transaction> MakeOrderPayment(PaymentOrder paymentOrder)
        {
            var order = new Order
            {
                Id    = paymentOrder.OrderId,
                Value = paymentOrder.Total
            };

            var payment = new Payment
            {
                Value          = paymentOrder.Total,
                CardName       = paymentOrder.CardName,
                CardNumber     = paymentOrder.CardNumber,
                ExpirationCard = paymentOrder.ExpirationCard,
                CvvCard        = paymentOrder.CvvCard,
                OrderId        = paymentOrder.OrderId
            };

            var transaction = _paymentCreditCardFacade.MakePayment(order, payment);

            if (transaction.StatusTransaction == StatusTransaction.Paid)
            {
                payment.AddEvent(new PaymentMadeEvent(order.Id, paymentOrder.ClientId, transaction.PaymentId, transaction.Id, order.Value));

                _paymentRepository.Add(payment);
                _paymentRepository.AddTransaction(transaction);

                await _paymentRepository.UnitOfWork.Commit();

                return(transaction);
            }

            await _mediatorHandler.PublishNotification(new DomainNotification("payment", "Card operator refused the payment"));

            await _mediatorHandler.PublishEvent(new PaymentOrderRefusedEvent(order.Id, paymentOrder.ClientId, transaction.PaymentId, transaction.Id, order.Value));

            return(transaction);
        }