Exemplo n.º 1
0
        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;
                    }
                }
            });
        }
Exemplo n.º 3
0
        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);
            });
        }
Exemplo n.º 7
0
        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;
                }
            });
        }
Exemplo n.º 9
0
        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;
                }
            });
        }
Exemplo n.º 10
0
        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;
                    }
                }
            });
        }
Exemplo n.º 11
0
        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;
                }
            });
        }
Exemplo n.º 12
0
        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;
                    }
                }
            });
        }
Exemplo n.º 13
0
        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;
                }
            });
        }
Exemplo n.º 16
0
        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;
                }
            });
        }
Exemplo n.º 18
0
        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;
                    }
                }
            });
        }
Exemplo n.º 19
0
        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);
            });
        }