public async Task HandleAsync(MessageEvent messageEvent) { // https://stackoverflow.com/questions/43124722/application-insights-custom-trackrequest-is-creating-duplicate-messages var requestTelemetry = new RequestTelemetry { Name = "CheckOutEventHandler invoked from EventBus" }; _telemetryClient.TrackRequest(requestTelemetry); string correlationToken = null; try { correlationToken = messageEvent.CorrelationToken; var checkedOutEvent = messageEvent as CheckOutEvent; _logger.LogInformation($"Invoked CheckOutEventHandler in Ordering.API for Request {correlationToken} "); _telemetryClient.TrackEvent( $"Event: Invoked CheckOutEventHandler in Ordering.API for Request {correlationToken}"); if (checkedOutEvent == null) { _logger.LogError( $"Publishing EmptyBasketEvent from CheckOutEventHandler in Ordering.API for Request {correlationToken} "); throw new Exception( $"Exception in CheckOutEventHandler: 'CheckOutEvent is Null' for Request {correlationToken}"); } _telemetryClient.TrackEvent( $"Event: CheckOutEventHandler invoked: BasketID:{checkedOutEvent.OrderInformationModel.BasketId}"); var createOrderCommand = new CreateOrderCommand( checkedOutEvent.OrderInformationModel.BasketId, checkedOutEvent.OrderInformationModel.CheckoutId, checkedOutEvent.OrderInformationModel.Buyer.Username, checkedOutEvent.OrderInformationModel.Total, checkedOutEvent.OrderInformationModel.Buyer.FirstName, checkedOutEvent.OrderInformationModel.Buyer.LastName, checkedOutEvent.OrderInformationModel.Buyer.Address, checkedOutEvent.OrderInformationModel.Buyer.City, checkedOutEvent.OrderInformationModel.Buyer.State, checkedOutEvent.OrderInformationModel.Buyer.PostalCode, checkedOutEvent.OrderInformationModel.Buyer.Phone, checkedOutEvent.OrderInformationModel.Buyer.Email, checkedOutEvent.OrderInformationModel.Payment.CreditCardNumber, checkedOutEvent.OrderInformationModel.Payment.SecurityCode, checkedOutEvent.OrderInformationModel.Payment.CardholderName, checkedOutEvent.OrderInformationModel.Payment.ExpirationDate, checkedOutEvent.CorrelationToken = correlationToken, // Is this cool Linq? Generated from Resharper. It iterates through lineItem collection and projects an orderDetailDto for each item // Map collection of CheckOutEventLineItems to collection of OderDetailDtos checkedOutEvent.OrderInformationModel.LineItems.Select(lineItem => new OrderDetailDto { Artist = lineItem.Artist, Title = lineItem.Title, Quantity = lineItem.Quantity, UnitPrice = decimal.Parse(lineItem.UnitPrice), AlbumId = lineItem.ProductId }).ToList() ); // Invoke Command that creates order var orderId = await _orderCommandHandler.Handle(createOrderCommand); checkedOutEvent.OrderInformationModel.OrderSystemId = orderId; _telemetryClient.TrackEvent( $"Event: CheckOutEventHandler: Buyer created:{orderId}"); //************** Publish Event ************************* // Publish event to clear basket for this order from Basket service var emptyCartEvent = new EmptyBasketEvent { BasketID = checkedOutEvent.OrderInformationModel.BasketId, CorrelationToken = correlationToken }; _logger.LogInformation( $"Publishing EmptyBasketEvent from CheckOutEventHandler in Ordering.API for Request {correlationToken} "); _telemetryClient.TrackEvent( $"Event: Publishing EmptyBasketEvent from CheckOutEventHandler for orderid:{orderId}"); await _eventBusPublisher.Publish <EmptyBasketEvent>(emptyCartEvent); } catch (Exception ex) { throw new Exception( $"Exception in CheckOutEventHandler: {ex.Message} for Request {correlationToken}"); } await Task.CompletedTask; }
public async Task HandleAsync(Message message) { try { // Interrogate the message // Get the Event Type message.UserProperties.TryGetValue("Event", out var eventType); // Get the CorrelationToken message.UserProperties.TryGetValue("correlationToken", out var correlationToken); // Get the message body var body = Encoding.UTF8.GetString(message.Body); // Deserialize the message body into the event class var checkOut = JsonConvert.DeserializeObject <UserCheckoutEvent>(body); // Create Command (data) object that follows simple CQRS pattern var createOrderCommand = new CreateOrderCommand( checkOut.CustomerId, checkOut.BasketId, checkOut.OrderDate, checkOut.UserName, checkOut.Total, checkOut.OrderDetails); // Invoke Command that creates order var orderId = await _orderCommandHandler.Handle(createOrderCommand); // Create Buyer Command (data) object that follows simple CQRS pattern var createBuyerCommand = new CreateBuyerCommand(orderId, checkOut.UserName, checkOut.BuyerInformation.FirstName, checkOut.BuyerInformation.LastName, checkOut.BuyerInformation.Address, checkOut.BuyerInformation.City, checkOut.BuyerInformation.State, checkOut.BuyerInformation.PostalCode, checkOut.BuyerInformation.Country, checkOut.BuyerInformation.Phone, checkOut.BuyerInformation.Email); // Invoke Command that creates buyer await _buyerCommandHandler.Handle(createBuyerCommand); //************** Publish Event ************************* // Publish event to clear basket for this order from Basket service var emptyCartEvent = new EmptyBasketEvent { BasketID = checkOut.BasketId, CorrelationToken = correlationToken?.ToString() }; await _eventBus.Publish(emptyCartEvent, MessageEventEnum.InvokeEmptyBasketEvent, correlationToken?.ToString()); } catch (Exception ex) { throw new Exception($"Exception executing UserCheckoutEvent in Eventhandler : {ex.Message}"); } await Task.CompletedTask; }