From 9e72fe7c7c3ed832b6de7b666f9853580a967169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Ca=C3=B1izares=20Est=C3=A9vez?= Date: Wed, 14 Dec 2016 18:23:57 +0100 Subject: [PATCH] Order items in ordering api --- src/Services/Basket/Basket.API/Program.cs | 4 +-- .../Basket.API/Properties/launchSettings.json | 2 +- .../Basket/Basket.API/appsettings.json | 2 +- .../Data/ApplicationContextSeed.cs | 32 +++++++++---------- .../eShopOnContainers.Identity/Program.cs | 2 +- .../Controllers/OrdersController.cs | 11 +++++++ .../Ordering.API/Models/NewOrderViewModel.cs | 8 +++++ .../Ordering.API/Models/OrderItemViewModel.cs | 15 +++++++++ .../Properties/launchSettings.json | 2 +- .../Commands/NewOrderREquestHandler.cs | 5 +++ .../Commands/NewOrderRequest.cs | 17 ++++++++++ .../Ordering/Ordering.Domain/Order.cs | 10 +++++- .../Ordering/Ordering.Domain/OrderItem.cs | 15 ++++----- .../WebMVC/Controllers/AccountController.cs | 1 + src/Web/WebMVC/Controllers/OrderController.cs | 2 ++ src/Web/WebMVC/Models/OrderRequest.cs | 6 +++- src/Web/WebMVC/Models/OrderRequestItem.cs | 20 ++++++++++++ src/Web/WebMVC/Services/OrderingService.cs | 18 +++++++++-- src/Web/WebMVC/appsettings.json | 2 +- 19 files changed, 138 insertions(+), 36 deletions(-) create mode 100644 src/Services/Ordering/Ordering.API/Models/OrderItemViewModel.cs create mode 100644 src/Web/WebMVC/Models/OrderRequestItem.cs diff --git a/src/Services/Basket/Basket.API/Program.cs b/src/Services/Basket/Basket.API/Program.cs index 81cde138f..f62aab4d5 100644 --- a/src/Services/Basket/Basket.API/Program.cs +++ b/src/Services/Basket/Basket.API/Program.cs @@ -15,8 +15,8 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) - .UseUrls("http://0.0.0.0:5103") - //.UseIISIntegration() + .UseUrls("http://0.0.0.0:5003") + .UseIISIntegration() .UseStartup() .Build(); diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index c734d837c..77a30062f 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:2160/", + "applicationUrl": "http://localhost:5003/", "sslPort": 0 } }, diff --git a/src/Services/Basket/Basket.API/appsettings.json b/src/Services/Basket/Basket.API/appsettings.json index 413de6ab8..c666066e4 100644 --- a/src/Services/Basket/Basket.API/appsettings.json +++ b/src/Services/Basket/Basket.API/appsettings.json @@ -7,6 +7,6 @@ "Microsoft": "Information" } }, - "IdentityUrl": "http://localhost:5105", + "IdentityUrl": "http://localhost:5000", "ConnectionString": "127.0.0.1" } diff --git a/src/Services/Identity/eShopOnContainers.Identity/Data/ApplicationContextSeed.cs b/src/Services/Identity/eShopOnContainers.Identity/Data/ApplicationContextSeed.cs index 86bdb82c0..0d0fb85f0 100644 --- a/src/Services/Identity/eShopOnContainers.Identity/Data/ApplicationContextSeed.cs +++ b/src/Services/Identity/eShopOnContainers.Identity/Data/ApplicationContextSeed.cs @@ -56,29 +56,29 @@ var user = new ApplicationUser() { - CardHolderName = "Jhon Doe", - CardNumber = "1111-2222-33-4444", + CardHolderName = "DemoUser", + CardNumber = "4012888888881881", CardType = 1, - City = "Seattle", - Country = "EEUU", + City = "Redmond", + Country = "U.S.", CountryCode = "91", - Email = "jdoe@eshop.com", + Email = "demouser@microsoft.com", Expiration = "12/20", Id = Guid.NewGuid().ToString(), - LastName = "Doe", - Name = "Jhon", - PhoneNumber = "600 11 22 33", - UserName = "jdoe@eshop.com", - ZipCode = "56730", - State = "Washington", - Street = "Street..", - SecurityNumber = "256", - NormalizedEmail = "JDOE@ESHOP.COM", - NormalizedUserName = "JDOE@ESHOP.COM", + LastName = "DemoLastName", + Name = "DemoUser", + PhoneNumber = "1234567890", + UserName = "demouser@microsoft.com", + ZipCode = "98052", + State = "WA", + Street = "15703 NE 61st Ct", + SecurityNumber = "535", + NormalizedEmail = "DEMOUSER@MICROSOFT.COM", + NormalizedUserName = "DEMOUSER@MICROSOFT.COM", SecurityStamp = Guid.NewGuid().ToString("D") }; - user.PasswordHash = _passwordHasher.HashPassword(user, "eshopContainers.123"); + user.PasswordHash = _passwordHasher.HashPassword(user, "Pass@word1"); return user; } diff --git a/src/Services/Identity/eShopOnContainers.Identity/Program.cs b/src/Services/Identity/eShopOnContainers.Identity/Program.cs index 48531ae65..bde2bd63d 100644 --- a/src/Services/Identity/eShopOnContainers.Identity/Program.cs +++ b/src/Services/Identity/eShopOnContainers.Identity/Program.cs @@ -13,7 +13,7 @@ namespace eShopOnContainers.Identity { var host = new WebHostBuilder() .UseKestrel() - .UseUrls("http://0.0.0.0:5105") + .UseUrls("http://0.0.0.0:5000") .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup() diff --git a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs index 4ae478cbb..0dd1b269a 100644 --- a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs +++ b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs @@ -53,6 +53,17 @@ Street = order.ShippingStreet }; + foreach (var orderItem in order.Items) + { + newOrderRequest.AddOrderItem(new Domain.OrderItem() { + Discount = orderItem.Discount, + ProductId = orderItem.ProductId, + UnitPrice = orderItem.UnitPrice, + ProductName = orderItem.ProductName, + Units = orderItem.Units + }); + } + var added = await _mediator.SendAsync(newOrderRequest); if (added) diff --git a/src/Services/Ordering/Ordering.API/Models/NewOrderViewModel.cs b/src/Services/Ordering/Ordering.API/Models/NewOrderViewModel.cs index c79e3c3bf..c5f7955e6 100644 --- a/src/Services/Ordering/Ordering.API/Models/NewOrderViewModel.cs +++ b/src/Services/Ordering/Ordering.API/Models/NewOrderViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace Microsoft.eShopOnContainers.Services.Ordering.API.Models { @@ -21,5 +22,12 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Models public DateTime CardExpiration { get; set; } public string CardSecurityNumber { get; set; } + + public List Items { get; set; } + + public NewOrderViewModel() + { + Items = new List(); + } } } diff --git a/src/Services/Ordering/Ordering.API/Models/OrderItemViewModel.cs b/src/Services/Ordering/Ordering.API/Models/OrderItemViewModel.cs new file mode 100644 index 000000000..989993fc2 --- /dev/null +++ b/src/Services/Ordering/Ordering.API/Models/OrderItemViewModel.cs @@ -0,0 +1,15 @@ +namespace Microsoft.eShopOnContainers.Services.Ordering.API.Models +{ + public class OrderItemViewModel + { + public int ProductId { get; set; } + + public string ProductName { get; set; } + + public decimal UnitPrice { get; set; } + + public decimal Discount { get; set; } + + public int Units { get; set; } + } +} \ No newline at end of file diff --git a/src/Services/Ordering/Ordering.API/Properties/launchSettings.json b/src/Services/Ordering/Ordering.API/Properties/launchSettings.json index 2e24c9099..c2ecdd3e6 100644 --- a/src/Services/Ordering/Ordering.API/Properties/launchSettings.json +++ b/src/Services/Ordering/Ordering.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:5102/", + "applicationUrl": "http://localhost:5002/", "sslPort": 0 } }, diff --git a/src/Services/Ordering/Ordering.Application/Commands/NewOrderREquestHandler.cs b/src/Services/Ordering/Ordering.Application/Commands/NewOrderREquestHandler.cs index dea451bff..186301dc5 100644 --- a/src/Services/Ordering/Ordering.Application/Commands/NewOrderREquestHandler.cs +++ b/src/Services/Ordering/Ordering.Application/Commands/NewOrderREquestHandler.cs @@ -55,6 +55,11 @@ ZipCode = message.ZipCode }); + foreach (var item in message.OrderItems) + { + order.AddOrderItem(item); + } + _orderRepository.Add(order); var result = await _orderRepository.UnitOfWork diff --git a/src/Services/Ordering/Ordering.Application/Commands/NewOrderRequest.cs b/src/Services/Ordering/Ordering.Application/Commands/NewOrderRequest.cs index ee79d0319..113aa552e 100644 --- a/src/Services/Ordering/Ordering.Application/Commands/NewOrderRequest.cs +++ b/src/Services/Ordering/Ordering.Application/Commands/NewOrderRequest.cs @@ -2,10 +2,15 @@ { using System; using MediatR; + using Domain; + using System.Collections; + using System.Collections.Generic; public class NewOrderRequest :IAsyncRequest { + + private readonly List _orderItems; public string City { get; set; } public string Street { get; set; } @@ -27,5 +32,17 @@ public int CardTypeId { get; set; } public string Buyer { get; set; } + + public IEnumerable OrderItems => _orderItems; + + public void AddOrderItem(OrderItem item) + { + _orderItems.Add(item); + } + + public NewOrderRequest() + { + _orderItems = new List(); + } } } diff --git a/src/Services/Ordering/Ordering.Domain/Order.cs b/src/Services/Ordering/Ordering.Domain/Order.cs index 2e6ee3cbd..165fc9370 100644 --- a/src/Services/Ordering/Ordering.Domain/Order.cs +++ b/src/Services/Ordering/Ordering.Domain/Order.cs @@ -17,7 +17,7 @@ public OrderStatus Status { get; private set; } - public ICollection OrderItems { get; set; } + public ICollection OrderItems { get; private set; } public int? ShippingAddressId { get; private set; } @@ -35,6 +35,7 @@ PaymentId = paymentId; StatusId = OrderStatus.InProcess.Id; OrderDate = DateTime.UtcNow; + OrderItems = new List(); } public void SetAddress(Address address) @@ -46,5 +47,12 @@ ShippingAddress = address; } + + public void AddOrderItem(OrderItem item) + { + // Note: Some logic could be added here (like grouping items in one single OrderItem) + // Also validation logic could be added here (like ensuring adding almost one item) + OrderItems.Add(item); + } } } diff --git a/src/Services/Ordering/Ordering.Domain/OrderItem.cs b/src/Services/Ordering/Ordering.Domain/OrderItem.cs index 2701ad9af..625e56da0 100644 --- a/src/Services/Ordering/Ordering.Domain/OrderItem.cs +++ b/src/Services/Ordering/Ordering.Domain/OrderItem.cs @@ -6,20 +6,17 @@ public class OrderItem :Entity { - public int ProductId { get; private set; } + public int ProductId { get; set; } - public string ProductName { get; private set; } + public string ProductName { get; set; } - public int OrderId { get; private set; } + public int OrderId { get; set; } - public decimal UnitPrice { get; private set; } + public decimal UnitPrice { get; set; } - public decimal Discount { get; private set; } + public decimal Discount { get; set; } - public int Units { get; private set; } + public int Units { get; set; } - protected OrderItem() - { - } } } diff --git a/src/Web/WebMVC/Controllers/AccountController.cs b/src/Web/WebMVC/Controllers/AccountController.cs index 5f0e69f1c..0f14cf45f 100644 --- a/src/Web/WebMVC/Controllers/AccountController.cs +++ b/src/Web/WebMVC/Controllers/AccountController.cs @@ -40,6 +40,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers { HttpContext.Authentication.SignOutAsync("Cookies"); HttpContext.Authentication.SignOutAsync("oidc"); + return new SignOutResult("oidc", new AuthenticationProperties { RedirectUri = "/" }); } } diff --git a/src/Web/WebMVC/Controllers/OrderController.cs b/src/Web/WebMVC/Controllers/OrderController.cs index 606c2695d..0bb499341 100644 --- a/src/Web/WebMVC/Controllers/OrderController.cs +++ b/src/Web/WebMVC/Controllers/OrderController.cs @@ -42,11 +42,13 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers basket = await _basketSvc.UpdateBasket(basket); var order = _basketSvc.MapBasketToOrder(basket); + // override if user has changed some shipping address or payment info data. _orderSvc.OverrideUserInfoIntoOrder(model.Order, order); if (action == "[ Place Order ]") { + await _orderSvc.CreateOrder(user, order); //Empty basket for current user. diff --git a/src/Web/WebMVC/Models/OrderRequest.cs b/src/Web/WebMVC/Models/OrderRequest.cs index 1bfc6374d..f45da66dd 100644 --- a/src/Web/WebMVC/Models/OrderRequest.cs +++ b/src/Web/WebMVC/Models/OrderRequest.cs @@ -8,7 +8,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Models public class OrderRequest { public OrderRequest() { - + Items = new List(); } public string City { get; set; } @@ -32,5 +32,9 @@ namespace Microsoft.eShopOnContainers.WebMVC.Models public int CardTypeId { get; set; } public string Buyer { get; set; } + + public List Items { get; } + + } } diff --git a/src/Web/WebMVC/Models/OrderRequestItem.cs b/src/Web/WebMVC/Models/OrderRequestItem.cs new file mode 100644 index 000000000..e80f77b83 --- /dev/null +++ b/src/Web/WebMVC/Models/OrderRequestItem.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.WebMVC.Models +{ + public class OrderRequestItem + { + public int ProductId { get; set; } + + public string ProductName { get; set; } + + public decimal UnitPrice { get; set; } + + public decimal Discount { get; set; } + + public int Units { get; set; } + } +} diff --git a/src/Web/WebMVC/Services/OrderingService.cs b/src/Web/WebMVC/Services/OrderingService.cs index d79c4591c..8324329ab 100644 --- a/src/Web/WebMVC/Services/OrderingService.cs +++ b/src/Web/WebMVC/Services/OrderingService.cs @@ -111,7 +111,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public OrderRequest MapOrderIntoOrderRequest(Order order) { - return new OrderRequest() + var od = new OrderRequest() { CardHolderName = order.PaymentInfo.CardHolderName, CardNumber = order.PaymentInfo.CardNumber, @@ -121,8 +121,22 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services Country = order.ShippingAddress.Country, State = order.ShippingAddress.State, Street = order.ShippingAddress.Street, - ZipCode = order.ShippingAddress.ZipCode + ZipCode = order.ShippingAddress.ZipCode, }; + + foreach (var item in order.OrderItems) + { + od.Items.Add(new OrderRequestItem() + { + Discount = item.Discount, + ProductId = int.Parse(item.ProductId), + ProductName = item.ProductName, + UnitPrice = item.UnitPrice, + Units = item.Quantity + }); + } + + return od; } async public Task CreateOrder(ApplicationUser user, Order order) diff --git a/src/Web/WebMVC/appsettings.json b/src/Web/WebMVC/appsettings.json index b9a09909d..9fe15aa25 100644 --- a/src/Web/WebMVC/appsettings.json +++ b/src/Web/WebMVC/appsettings.json @@ -2,7 +2,7 @@ "CatalogUrl": "http://localhost:5101", "OrderingUrl": "http://localhost:5102", "BasketUrl": "http://localhost:5103", - "IdentityUrl": "http://localhost:5000", + "IdentityUrl": "http://localhost:5105", "CallBackUrl": "http://localhost:5100/", "Logging": { "IncludeScopes": false,