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) }); } }
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) }); } }
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))); } }
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) }); } }