示例#1
0
        public async Task Consume(ConsumeContext <ICustomerCreateEvent> context)
        {
            try
            {
                _logger.LogInformation($"Customer Request received for order ref: {context.Message.CorrelationId}");

                var customer = GetCustomerObject(context.Message);

                var checkCustomer = (await _customerRepository.FindByConditionAsync(c => c.EmailAddress == context.Message.EmailAddress)).ToList();

                if (!checkCustomer.Any())
                {
                    _customerRepository.Add(customer);
                }
                else
                {
                    _customerRepository.Update(checkCustomer.Single().UpdatePersonalDetails(customer));
                }

                await _customerRepository.UnitOfWork.SaveEntitiesAsync();

                _logger.LogInformation($"Customer Request saved successfully for order ref: {context.Message.CorrelationId}");

                var result = (await _customerRepository.FindByConditionAsync(c => c.EmailAddress == context.Message.EmailAddress)).Single();

                int cardDetailId = 0;

                if (context.Message.CardDetails is not null)
                {
                    cardDetailId = result.CardDetails.First(x => x.CardNumberUnFormatted == context.Message.CardDetails.CardNumber).Id;
                }

                await context.RespondAsync <ICustomerCreatedEvent>(new CustomerCreatedEvent
                {
                    CorrelationId = context.Message.CorrelationId,
                    CustomerId    = result.Id,
                    CardDetailId  = cardDetailId
                });
            }
            catch (Exception ex)
            {
                _logger.LogError($"Customer process failed for order ref: {context.Message.CorrelationId} with error: {ErrorUtility.BuildExceptionDetail(ex)}");

                await context.RespondAsync <IOrderProcessingFailedEvent>(new OrderProcessingFailedEvent
                {
                    OrderRef     = context.Message.CorrelationId,
                    ErrorMessage = ErrorUtility.BuildExceptionDetail(ex)
                });
            }
        }
示例#2
0
        public async Task Consume(ConsumeContext <IOrderCreateEvent> context)
        {
            try
            {
                _logger.LogInformation($"Order create request received for order ref: {context.Message.OrderRef}");

                var orderItems = context.Message.OrderItems.Select(item =>
                                                                   new OrderItemEntry(item.ProductRef, item.ProductName, item.Quantity, item.Price)).ToList();

                var order = new Order(
                    context.Message.OrderRef
                    , context.Message.PaymentId
                    , context.Message.CustomerId
                    , new Address(
                        context.Message.DeliveryAddress.Street
                        , context.Message.DeliveryAddress.City
                        , context.Message.DeliveryAddress.Country
                        , context.Message.DeliveryAddress.PostCode)
                    , orderItems);

                _orderRepository.Add(order);
                await _orderRepository.UnitOfWork.SaveEntitiesAsync();

                _logger.LogInformation($"Order request saved for order ref: {context.Message.OrderRef}");

                var result = (await _orderRepository.FindByConditionAsync(or => or.OrderRef == context.Message.OrderRef)).Single();

                var customer = (await _customerRepository.FindByConditionAsync(cs => cs.Id == context.Message.CustomerId)).Single();

                await context.RespondAsync <IOrderCreatedEvent>(new OrderCreatedEvent
                {
                    OrderId       = result.Id,
                    OrderRef      = context.Message.OrderRef,
                    CustomerEmail = customer.EmailAddress,
                    CustomerName  = customer.GetFullName
                });
            }
            catch (Exception ex)
            {
                _logger.LogError($"Customer process failed for order ref: {context.Message.OrderRef} with error: {ErrorUtility.BuildExceptionDetail(ex)}");

                await context.RespondAsync <IOrderProcessingFailedEvent>(new OrderProcessingFailedEvent
                {
                    OrderRef     = context.Message.OrderRef,
                    ErrorMessage = ErrorUtility.BuildExceptionDetail(ex)
                });
            }
        }
示例#3
0
        public async Task Consume(ConsumeContext <IUpdateBasketEvent> context)
        {
            try
            {
                var basket = (await _basketRepository.FindByConditionAsync(b => b.BasketRef == context.Message.BasketRef)).Single();

                basket.AddBasketItem(
                    context.Message.ProductId
                    , context.Message.Quantity
                    , context.Message.ProductPrice);

                _basketRepository.Update(basket);

                _logger.LogInformation($"Basket ref: {context.Message.BasketRef} is about to update");

                await _basketRepository.UnitOfWork.SaveEntitiesAsync();

                var basketResult = (await _basketRepository.FindByConditionAsync(bk => bk.BasketRef == context.Message.BasketRef)).Single();

                var basketItems = new List <JsonBasketItem>();

                foreach (var item in basketResult.BasketItems)
                {
                    var product = (await _productRepository.FindByConditionAsync(p => p.Id == item.GetProductId)).Single();

                    basketItems.Add(new JsonBasketItem
                    {
                        Quantity    = item.Quantity,
                        Price       = item.Amount,
                        ProductName = product.Name,
                        ProductRef  = product.ProductRef
                    });
                }

                await context.RespondAsync <IBasketPlacedSuccessfullyEvent>(
                    new BasketPlacedSuccessfullyEvent(context.Message.BasketRef, basketResult.GetTotal, basketItems));

                _logger.LogInformation($"Basket ref: {context.Message.BasketRef} is updated & notified");
            }
            catch (Exception ex)
            {
                _logger.LogInformation($"Basket ref: {context.Message.BasketRef} process failed with error {ErrorUtility.BuildExceptionDetail(ex)}");

                await context.RespondAsync <IBasketProcessFailedEvent>(
                    new BasketProcessFailedEvent(context.Message.BasketRef
                                                 , ErrorUtility.BuildExceptionDetail(ex)));
            }
        }
示例#4
0
        public async Task Consume(ConsumeContext <IPaymentProcessEvent> context)
        {
            try
            {
                _logger.LogInformation($"Payment request received for order ref: {context.Message.CorrelationId}");

                // TODO: Transaction Reference will be generated by the third party payment provider.
                var transactionRef = Guid.NewGuid();

                var payment = new Payment(context.Message.CustomerId
                                          , context.Message.Amount
                                          , (PaymentType)context.Message.PaymentType
                                          , transactionRef
                                          , context.Message.CardDetailsId);

                if (context.Message.PaymentType == (int)PaymentType.Card)
                {
                    if (context.Message.CardDetail.CardHolderName.Contains("Test"))
                    {
                        payment.MarkTransactionAsDeclined();

                        _logger.LogError($"Payment request failed for order ref: {context.Message.CorrelationId}");
                    }
                    else
                    {
                        payment.MarkTransactionSuccessful();

                        _logger.LogInformation($"Payment request is successful for order ref: {context.Message.CorrelationId}");
                    }
                }
                else
                {
                    payment.MarkTransactionSuccessful();

                    _logger.LogInformation($"Payment request is successful for order ref: {context.Message.CorrelationId}");
                }

                _paymentRepository.Add(payment);
                await _paymentRepository.UnitOfWork.SaveEntitiesAsync();

                _logger.LogInformation($"Payment request successfully stored for order ref: {context.Message.CorrelationId}");

                var result = (await _paymentRepository.FindByConditionAsync(p => p.PaymentRef == transactionRef)).Single();

                if (result.Status == TransactionStatus.Successful)
                {
                    await context.RespondAsync <IPaymentCreatedEvent>(new PaymentCreatedEvent
                    {
                        CorrelationId  = context.Message.CorrelationId,
                        TransactionRef = result.PaymentRef,
                        PaymentId      = result.Id
                    });
                }
                else
                {
                    await context.RespondAsync <IPaymentFailedEvent>(new PaymentFailedEvent
                    {
                        CorrelationId  = context.Message.CorrelationId,
                        TransactionRef = result.PaymentRef,
                        PaymentId      = result.Id,
                        ErrorMessage   = "Payment failed, card holder contains test"
                    });
                }
            }
            catch (Exception ex)
            {
                _logger.LogError($"Payment process failed for order ref: {context.Message.CorrelationId} with error: {ErrorUtility.BuildExceptionDetail(ex)}");

                await context.RespondAsync <IOrderProcessingFailedEvent>(new OrderProcessingFailedEvent
                {
                    OrderRef     = context.Message.CorrelationId,
                    ErrorMessage = ErrorUtility.BuildExceptionDetail(ex)
                });
            }
        }