public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <ReservedTicketsLoaded>((requestId, viewModel, @event, douteData, httpRequest) => { /* * it's a demo, production code should check for cookie existence */ var selectedDeliveryOption = (DeliveryOptions)Enum.Parse(typeof(Data.DeliveryOptions), httpRequest.Cookies["reservation-delivery-option-id"]); dynamic deliveryOption = new ExpandoObject(); deliveryOption.Id = selectedDeliveryOption; switch (selectedDeliveryOption) { case DeliveryOptions.ShipAtHome: deliveryOption.Description = "Ship at Home."; break; case DeliveryOptions.CollectAtTheVenue: deliveryOption.Description = "Collect at the Venue."; break; } viewModel.DeliveryOption = deliveryOption; return(Task.CompletedTask); }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <ShoppingCartItemsLoaded>(async(requestId, pageViewModel, @event, rd, req) => { var ids = String.Join(",", @event.CartItemsViewModel.Keys); var url = $"http://localhost:5004/api/shopping-cart/products/{ids}"; var client = new HttpClient(); var response = await client.GetAsync(url); dynamic[] shippingDetails = await response.Content.AsExpandoArray(); if (shippingDetails == null || shippingDetails.Length == 0) { //eventual consitency is making fun of us foreach (var item in @event.CartItemsViewModel.Values) { item.DeliveryEstimate = "not yet available"; } } else { foreach (dynamic detail in shippingDetails) { @event.CartItemsViewModel[detail.ProductId].DeliveryEstimate = detail.DeliveryEstimate; } } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <ShoppingCartItemsLoaded>(async(requestId, pageViewModel, @event, rd, req) => { var ids = String.Join(",", @event.CartItemsViewModel.Keys); var url = $"http://localhost:5003/api/shopping-cart/products/{ids}"; var client = new HttpClient(); var response = await client.GetAsync(url); dynamic[] inventoryDetails = await response.Content.AsExpandoArray(); if (inventoryDetails == null || inventoryDetails.Length == 0) { //eventual consitency is making fun of us foreach (var item in @event.CartItemsViewModel.Values) { item.Inventory = "evaulation in progress"; } } else { foreach (dynamic detail in inventoryDetails) { @event.CartItemsViewModel[detail.ProductId].Inventory = $"{detail.Inventory} item(s) left in stock"; } } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <QuestionsLoaded>(async(vm, @event, routeData, query) => { var questionIds = string.Join(",", @event.QuestionsViewModel.Keys); var url = $"http://localhost:54218/api/answers?questionIds={questionIds}"; var client = new HttpClient(); var response = await client.GetAsync(url); dynamic[] answers = await response.Content.AsExpandoArray(); foreach (dynamic answer in answers) { dynamic question = @event.QuestionsViewModel[answer.QuestionId]; if (!Dynamic.HasOwnProperty(question, "Answers")) { question.Answers = new List <dynamic>(); } dynamic answerViewModel = new ExpandoObject(); answerViewModel.AnswerId = answer.AnswerId; answerViewModel.AnswerText = answer.AnswerText; question.Answers.Add(answerViewModel); } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <AnEvent>((requestId, viewModel, @event, routeData, httpRequest) => { var id = int.Parse((string)routeData.Values["id"]); ((dynamic)viewModel).SubscriberValue = id; return(Task.CompletedTask); }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <AddItemToCartRequested>((requestId, pageViewModel, @event, rd, req) => { @event.RequestData.Add("warehouse-product-id", (string)rd.Values["id"]); @event.RequestData.Add("warehouse-quantity", req.Form["quantity"][0]); return(Task.CompletedTask); }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <ReservedTicketsLoaded>(async(requestId, viewModel, @event, douteData, httpRequest) => { var ids = @event.ReservedTicketsViewModel.Keys.ToArray(); using (var db = Data.FinanceContext.Create()) { var ticketPrices = await db.TicketPrices .Where(ticketPrice => ids.Contains(ticketPrice.Id)) .ToListAsync(); Guid reservationId = @event.Reservation.Id; var reservedTickets = ( await db.ReservedTickets .Where(r => r.ReservationId == reservationId) .ToListAsync() ) .GroupBy(t => t.TicketId) .ToDictionary(g => g.Key, g => g.Count()); var reservationTotalPrice = 0m; foreach (var ticketPrice in ticketPrices) { var ticketId = (int)ticketPrice.Id; var reservedTicketViewModel = @event.ReservedTicketsViewModel[ticketId]; var currentReservedTicketQuantity = reservedTickets[ticketId]; var currentReservedTicketTotalPrice = ticketPrice.Price * currentReservedTicketQuantity; reservationTotalPrice += currentReservedTicketTotalPrice; reservedTicketViewModel.TicketPrice = ticketPrice.Price; reservedTicketViewModel.TotalPrice = currentReservedTicketTotalPrice; } @event.Reservation.TotalPrice = reservationTotalPrice; /* * it's a demo, production code should check for cookie existence */ var selectedPaymentMethodId = int.Parse(httpRequest.Cookies["reservation-payment-method-id"]); var paymentMethod = await db.PaymentMethods .Where(pm => pm.Id == selectedPaymentMethodId) .SingleAsync(); viewModel.PaymentMethod = paymentMethod; } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <QuestionsLoaded>(async(vm, @event, routeData, query) => { var questionIds = string.Join(",", @event.QuestionsViewModel.Keys); var url = $"http://localhost:54219/api/rules?questionIds={questionIds}"; var client = new HttpClient(); var response = await client.GetAsync(url); dynamic[] rules = await response.Content.AsExpandoArray(); foreach (dynamic rule in rules) { dynamic question = @event.QuestionsViewModel[rule.QuestionId]; question.CorrectAnswerId = rule.CorrectAnswerId; } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <OrdersLoaded>(async(pageViewModel, ordersLoaded, routeData, query) => { var orderIds = string.Join(",", ordersLoaded.OrderViewModelDictionary.Keys); // Hardcoded to simplify the exercise. In a production app, a config object could be injected. var url = $"http://localhost:20187/api/prices/orders/total?orderIds={orderIds}"; var response = await new HttpClient().GetAsync(url); dynamic[] prices = await response.Content.AsExpandoArrayAsync(); foreach (dynamic price in prices) { ordersLoaded.OrderViewModelDictionary[price.OrderId].OrderTotalPrice = price.Amount; } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <ReservedTicketsLoaded>(async(requestId, pageViewModel, @event, rd, req) => { var ids = @event.ReservedTicketsViewModel.Keys.ToArray(); using (var db = Data.TicketingContext.Create()) { var reservedTickets = await db.Tickets .Where(ticket => ids.Contains(ticket.Id)) .ToListAsync(); foreach (var ticket in reservedTickets) { @event.ReservedTicketsViewModel[(int)ticket.Id].TicketDescription = ticket.Description; } } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <OrdersLoaded>(async(pageViewModel, ordersLoaded, routeData, query) => { var orderIds = string.Join(",", ordersLoaded.OrderViewModelDictionary.Keys); // Hardcoded to simplify the exercise. In a production app, a config object could be injected. var url = $"http://localhost:20186/api/customers/byorders?orderIds={orderIds}"; var response = await new HttpClient().GetAsync(url); dynamic[] customers = await response.Content.AsExpandoArrayAsync(); foreach (dynamic customer in customers) { ordersLoaded.OrderViewModelDictionary[customer.OrderId].OrderCustomerName = customer.CustomerName; } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <AvailableTicketsLoaded>(async(requestId, pageViewModel, @event, rd, req) => { var ids = @event.AvailableTicketsViewModel.Keys.ToArray(); using (var db = Data.FinanceContext.Create()) { var ticketPrices = await db.TicketPrices .Where(ticketPrice => ids.Contains(ticketPrice.Id)) .ToListAsync(); foreach (var ticketPrice in ticketPrices) { @event.AvailableTicketsViewModel[(int)ticketPrice.Id].TicketPrice = ticketPrice.Price; } } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <ReservedTicketsLoaded>(async(requestId, pageViewModel, @event, rd, req) => { var ids = @event.ReservedTicketsViewModel.Keys.ToArray(); using (var db = Data.FinanceContext.Create()) { var ticketPrices = await db.TicketPrices .Where(ticketPrice => ids.Contains(ticketPrice.Id)) .ToListAsync(); Guid reservationId = @event.Reservation.Id; var reservedTickets = ( await db.ReservedTickets .Where(r => r.ReservationId == reservationId) .ToListAsync() ) .GroupBy(t => t.TicketId) .ToDictionary(g => g.Key, g => g.Count()); var reservationTotalPrice = 0m; foreach (var ticketPrice in ticketPrices) { var ticketId = (int)ticketPrice.Id; var reservedTicketViewModel = @event.ReservedTicketsViewModel[ticketId]; var currentReservedTicketQuantity = reservedTickets[ticketId]; var currentReservedTicketTotalPrice = ticketPrice.Price * currentReservedTicketQuantity; reservationTotalPrice += currentReservedTicketTotalPrice; reservedTicketViewModel.TicketPrice = ticketPrice.Price; reservedTicketViewModel.TotalPrice = currentReservedTicketTotalPrice; } @event.Reservation.TotalPrice = reservationTotalPrice; var allPaymentMethods = await db.PaymentMethods.ToListAsync(); pageViewModel.PaymentMethods = allPaymentMethods; } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <AvailableProductsLoaded>(async(requestId, pageViewModel, @event, rd, req) => { var ids = String.Join(",", @event.AvailableProductsViewModel.Keys); var url = $"http://localhost:5001/api/prices/products/{ids}"; var client = new HttpClient(); var response = await client.GetAsync(url); dynamic[] productPrices = await response.Content.AsExpandoArray(); foreach (dynamic productPrice in productPrices) { @event.AvailableProductsViewModel[(int)productPrice.Id].ProductPrice = productPrice.Price; } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <AvailableProductsLoaded>(async(requestId, pageViewModel, @event, rd, req) => { var ids = String.Join(",", @event.AvailableProductsViewModel.Keys); var url = $"http://localhost:5003/api/inventory/products/{ids}"; var client = new HttpClient(); var response = await client.GetAsync(url); dynamic[] stockItems = await response.Content.AsExpandoArray(); foreach (dynamic stockItem in stockItems) { @event.AvailableProductsViewModel[(int)stockItem.Id].Inventory = stockItem.Inventory; } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <OrdersLoaded>(async(pageViewModel, ordersLoaded, routeData, query) => { var orderNumbers = string.Join(",", ordersLoaded.OrderViewModelDictionary.Keys); // Hardcoded to simplify the demo. In a production app, a config object could be injected. var url = $"http://localhost:20296/api/shipments/orders?orderNumbers={orderNumbers}"; var response = await new HttpClient().GetAsync(url); dynamic[] shipments = await response.Content.AsExpandoArrayAsync(); foreach (dynamic shipment in shipments) { ordersLoaded.OrderViewModelDictionary[shipment.OrderNumber].ShippingStatus = shipment.Status; ordersLoaded.OrderViewModelDictionary[shipment.OrderNumber].ShippingCourier = shipment.Courier; } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <ShoppingCartItemsLoaded>(async(requestId, pageViewModel, @event, rd, req) => { var ids = String.Join(",", @event.CartItemsViewModel.Keys); var url = $"http://localhost:5002/api/product-details/products/{ids}"; var client = new HttpClient(); var response = await client.GetAsync(url).ConfigureAwait(false); dynamic[] productDetails = await response.Content.AsExpandoArray().ConfigureAwait(false); foreach (dynamic detail in productDetails) { @event.CartItemsViewModel[detail.Id].ProductName = detail.Name; @event.CartItemsViewModel[detail.Id].ProductDescription = detail.Description; } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <AvailableTicketsLoaded>(async(requestId, viewModel, @event, routeData, httpRequest) => { var ids = @event.AvailableTicketsViewModel.Keys.ToArray(); using (var db = Data.ReservationsContext.Create()) { var availableTickets = await db.AvailableTickets .Where(ticket => ids.Contains(ticket.Id)) .ToListAsync(); IDictionary <int, int> reservedTickets = new Dictionary <int, int>(); if (httpRequest.Cookies.ContainsKey("reservation-id")) { var reservationId = new Guid(httpRequest.Cookies["reservation-id"]); var reservation = await db.Reservations .Where(r => r.Id == reservationId) .Include(r => r.ReservedTickets) .SingleOrDefaultAsync(); if (reservation != null) { reservedTickets = reservation.ReservedTickets .GroupBy(t => t.TicketId) .ToDictionary(g => g.Key, g => g.Count()); } } foreach (var availableTicket in availableTickets) { var avialableTicketId = (int)availableTicket.Id; var reservedQuantity = reservedTickets.ContainsKey(avialableTicketId) ? reservedTickets[avialableTicketId] : 0; @event.AvailableTicketsViewModel[avialableTicketId].TicketsLeft = availableTicket.TotalTickets - reservedQuantity; } } }); }
public void Subscribe(IPublishCompositionEvents publisher) { publisher.Subscribe <ReservedTicketsLoaded>((requestId, pageViewModel, @event, rd, req) => { dynamic shipAtHome = new ExpandoObject(); shipAtHome.Id = DeliveryOptions.ShipAtHome; shipAtHome.Description = "Ship at Home."; dynamic collectAtTheVenue = new ExpandoObject(); collectAtTheVenue.Id = DeliveryOptions.CollectAtTheVenue; collectAtTheVenue.Description = "Collect at the Venue."; pageViewModel.DeliveryOptions = new List <dynamic>() { shipAtHome, collectAtTheVenue }; return(Task.CompletedTask); }); }