From b079e6ba7912d50c755e105a39fe249680417b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Ca=C3=B1izares=20Est=C3=A9vez?= Date: Mon, 31 Oct 2016 17:56:24 +0100 Subject: [PATCH] Add Cart Flow --- .../WebMVC/Controllers/CatalogController.cs | 6 +- src/Web/WebMVC/Controllers/OrderController.cs | 33 +++++++-- .../WebMVC/Extensions/SessionExtensions.cs | 23 ++++++ src/Web/WebMVC/Models/CatalogItem.cs | 2 +- src/Web/WebMVC/Models/Order.cs | 12 +++- src/Web/WebMVC/Models/OrderItem.cs | 7 +- src/Web/WebMVC/Services/CartService.cs | 41 ----------- src/Web/WebMVC/Services/CatalogService.cs | 60 ++++++++-------- src/Web/WebMVC/Services/ICartService.cs | 16 ----- src/Web/WebMVC/Services/ICatalogService.cs | 2 +- src/Web/WebMVC/Services/IOrderingService.cs | 8 ++- src/Web/WebMVC/Services/OrderingService.cs | 64 ++++++++++++++--- src/Web/WebMVC/Startup.cs | 7 +- src/Web/WebMVC/ViewComponents/Cart.cs | 31 ++++++++ src/Web/WebMVC/ViewComponents/CartList.cs | 12 ++-- src/Web/WebMVC/Views/Catalog/Index.cshtml | 2 +- src/Web/WebMVC/Views/Order/Cart.cshtml | 5 +- .../Shared/Components/Cart/Default.cshtml | 11 ++- .../Shared/Components/CartList/Default.cshtml | 4 +- .../WebMVC/Views/Shared/_LoginPartial.cshtml | 19 +++-- src/Web/WebMVC/project.json | 1 + src/Web/WebMVC/wwwroot/css/site.css | 66 +++++++++++++++++- src/Web/WebMVC/wwwroot/images/logout.PNG | Bin 0 -> 429 bytes src/Web/WebMVC/wwwroot/images/my_orders.PNG | Bin 0 -> 221 bytes 24 files changed, 290 insertions(+), 142 deletions(-) create mode 100644 src/Web/WebMVC/Extensions/SessionExtensions.cs delete mode 100644 src/Web/WebMVC/Services/CartService.cs delete mode 100644 src/Web/WebMVC/Services/ICartService.cs create mode 100644 src/Web/WebMVC/ViewComponents/Cart.cs create mode 100644 src/Web/WebMVC/wwwroot/images/logout.PNG create mode 100644 src/Web/WebMVC/wwwroot/images/my_orders.PNG diff --git a/src/Web/WebMVC/Controllers/CatalogController.cs b/src/Web/WebMVC/Controllers/CatalogController.cs index e04c86be9..6f07b0f5c 100644 --- a/src/Web/WebMVC/Controllers/CatalogController.cs +++ b/src/Web/WebMVC/Controllers/CatalogController.cs @@ -26,7 +26,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers { var vm = new IndexViewModel() { - CatalogItems = await _catalogSvc.GetCatalogItems(8 * (page ?? 0), 8), + CatalogItems = await _catalogSvc.GetCatalogItems(6 * (page ?? 0), 6), Brands = _catalogSvc.GetTypes(), Types = _catalogSvc.GetBrands(), BrandFilterApplied = BrandFilterApplied ?? 0, @@ -34,9 +34,9 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers PaginationInfo = new PaginationInfo() { ActualPage = page ?? 0, - ItemsPerPage = 8, + ItemsPerPage = 6, TotalItems = _catalogSvc.TotalItems, - TotalPages = int.Parse(Math.Round(((decimal)_catalogSvc.TotalItems / 8), MidpointRounding.AwayFromZero).ToString()) + TotalPages = int.Parse(Math.Round(((decimal)_catalogSvc.TotalItems / 6), MidpointRounding.AwayFromZero).ToString()) } }; diff --git a/src/Web/WebMVC/Controllers/OrderController.cs b/src/Web/WebMVC/Controllers/OrderController.cs index f6f785195..bc39b967f 100644 --- a/src/Web/WebMVC/Controllers/OrderController.cs +++ b/src/Web/WebMVC/Controllers/OrderController.cs @@ -5,20 +5,41 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.eShopOnContainers.WebMVC.Services; using Microsoft.eShopOnContainers.WebMVC.Models; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; namespace Microsoft.eShopOnContainers.WebMVC.Controllers { + [Authorize] public class OrderController : Controller { private IOrderingService _orderSvc; - public OrderController(IOrderingService orderSvc) + private ICatalogService _catalogSvc; + private readonly UserManager _userManager; + public OrderController(IOrderingService orderSvc, ICatalogService catalogSvc, UserManager userManager) { + _userManager = userManager; _orderSvc = orderSvc; + _catalogSvc = catalogSvc; } - public IActionResult AddToCart() + public async Task AddToCart(string productId) { - return View(); + //CCE: I need product details (price, ...), so I retrieve from Catalog service again. + // I don't like POST with a form from the catalog view (I'm avoiding Ajax too), + // I prefer Url.Action and http call here to catalog service to retrieve this info. + var user = await _userManager.GetUserAsync(HttpContext.User); + var productDetails = _catalogSvc.GetCatalogItem(productId); + var product = new OrderItem() + { + ProductId = productId, + Quantity = 1, + ProductName = productDetails.Name, + PicsUrl = productDetails.PicsUrl, + UnitPrice = productDetails.Price + }; + _orderSvc.AddToCart(user, product); + return RedirectToAction("Index", "Catalog"); } public IActionResult Cart() @@ -31,10 +52,10 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers return View(); } - public IActionResult Index(Order item) + public async Task Index(Order item) { - _orderSvc.AddOrder(item); - return View(_orderSvc.GetOrders()); + var user = await _userManager.GetUserAsync(HttpContext.User); + return View(_orderSvc.GetMyOrders(user)); } } } \ No newline at end of file diff --git a/src/Web/WebMVC/Extensions/SessionExtensions.cs b/src/Web/WebMVC/Extensions/SessionExtensions.cs new file mode 100644 index 000000000..4b095866d --- /dev/null +++ b/src/Web/WebMVC/Extensions/SessionExtensions.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Http; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + + +public static class SessionExtensions +{ + public static void SetObject(this ISession session, string key, object value) + { + session.SetString(key, JsonConvert.SerializeObject(value)); + } + + public static T GetObject(this ISession session, string key) + { + var value = session.GetString(key); + + return value == null ? default(T) : JsonConvert.DeserializeObject(value); + } +} + diff --git a/src/Web/WebMVC/Models/CatalogItem.cs b/src/Web/WebMVC/Models/CatalogItem.cs index 1a4d7e8e4..10c4c6bf6 100644 --- a/src/Web/WebMVC/Models/CatalogItem.cs +++ b/src/Web/WebMVC/Models/CatalogItem.cs @@ -4,7 +4,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Models { public class CatalogItem { - public Guid Id { get; set; } + public string Id { get; set; } public string Name { get; set; } public string Description { get; set; } public decimal Price { get; set; } diff --git a/src/Web/WebMVC/Models/Order.cs b/src/Web/WebMVC/Models/Order.cs index d10b9ab1e..3527eac32 100644 --- a/src/Web/WebMVC/Models/Order.cs +++ b/src/Web/WebMVC/Models/Order.cs @@ -7,7 +7,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Models { public class Order { - Guid Id; + public string Id; public List OrderItems { get; set; } public string OrderNumber { @@ -17,12 +17,20 @@ namespace Microsoft.eShopOnContainers.WebMVC.Models } } public int SequenceNumber { get; set; } - public virtual Guid BuyerId { get; set; } + public virtual string BuyerId { get; set; } public virtual Address ShippingAddress { get; set; } public virtual DateTime OrderDate { get; set; } + public OrderState State { get; set; } //(CCE) public virtual Address BillingAddress { get; set; } //(CDLTLL) public virtual OrderStatus Status { get; set; } } + + public enum OrderState + { + Active, + InProcess, + Delivered + } } diff --git a/src/Web/WebMVC/Models/OrderItem.cs b/src/Web/WebMVC/Models/OrderItem.cs index ee0d6ff53..e49638c22 100644 --- a/src/Web/WebMVC/Models/OrderItem.cs +++ b/src/Web/WebMVC/Models/OrderItem.cs @@ -7,13 +7,14 @@ namespace Microsoft.eShopOnContainers.WebMVC.Models { public class OrderItem { - Guid Id; - public Guid ProductId { get; set; } - public Guid OrderId { get; set; } + public string Id; + public string ProductId { get; set; } + public string OrderId { get; set; } public string ProductName { get; set; } public decimal UnitPrice { get; set; } public int Quantity { get; set; } public decimal Discount { get; set; } + public string PicsUrl { get; set; } public override string ToString() { return String.Format("Product Id: {0}, Quantity: {1}", this.Id, this.Quantity); diff --git a/src/Web/WebMVC/Services/CartService.cs b/src/Web/WebMVC/Services/CartService.cs deleted file mode 100644 index 13cc1f627..000000000 --- a/src/Web/WebMVC/Services/CartService.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Threading.Tasks; -using Microsoft.eShopOnContainers.WebMVC.Models; - -namespace Microsoft.eShopOnContainers.WebMVC.Services -{ - public class CartService : ICartService - { - Order _order; - - public CartService() - { - _order = new Order(); - _order.OrderItems = new System.Collections.Generic.List(); - _order.OrderItems.Add(new OrderItem() - { - ProductName = "Cart product" - }); - } - - public void AddItemToOrder(CatalogItem item) - { - throw new NotImplementedException(); - } - - public int GetItemCountFromOrderInProgress() - { - throw new NotImplementedException(); - } - - public Task GetActiveOrder() - { - return Task.Run(() => { return _order; }); - } - - public void RemoveItemFromOrder(Guid itemIdentifier) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/Web/WebMVC/Services/CatalogService.cs b/src/Web/WebMVC/Services/CatalogService.cs index b2416a9de..9a00290e5 100644 --- a/src/Web/WebMVC/Services/CatalogService.cs +++ b/src/Web/WebMVC/Services/CatalogService.cs @@ -32,41 +32,41 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services #region fake data _items = new List() { - new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, - new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" } + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" }, + new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" } }; #endregion } - public CatalogItem GetCatalogItem(Guid Id) + public CatalogItem GetCatalogItem(string Id) { - return _items.Where(x => x.Id == Id).FirstOrDefault(); + return _items.Where(x => x.Id.Equals(Id)).FirstOrDefault(); } public Task> GetCatalogItems(int? skip,int? take) diff --git a/src/Web/WebMVC/Services/ICartService.cs b/src/Web/WebMVC/Services/ICartService.cs deleted file mode 100644 index 8705ab2dc..000000000 --- a/src/Web/WebMVC/Services/ICartService.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Microsoft.eShopOnContainers.WebMVC.Models; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace Microsoft.eShopOnContainers.WebMVC.Services -{ - public interface ICartService - { - void AddItemToOrder(CatalogItem item); - void RemoveItemFromOrder(Guid itemIdentifier); - int GetItemCountFromOrderInProgress(); - Task GetActiveOrder(); - } -} diff --git a/src/Web/WebMVC/Services/ICatalogService.cs b/src/Web/WebMVC/Services/ICatalogService.cs index 50f2f9f54..0eb9a7f4d 100644 --- a/src/Web/WebMVC/Services/ICatalogService.cs +++ b/src/Web/WebMVC/Services/ICatalogService.cs @@ -12,7 +12,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services int TotalItems { get; } Task> GetCatalogItems(int? skip, int? take); - CatalogItem GetCatalogItem(Guid Id); + CatalogItem GetCatalogItem(string Id); IEnumerable GetBrands(); IEnumerable GetTypes(); } diff --git a/src/Web/WebMVC/Services/IOrderingService.cs b/src/Web/WebMVC/Services/IOrderingService.cs index b637847f5..3e8061a58 100644 --- a/src/Web/WebMVC/Services/IOrderingService.cs +++ b/src/Web/WebMVC/Services/IOrderingService.cs @@ -8,8 +8,10 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services { public interface IOrderingService { - List GetOrders(); - Order GetOrder(Guid Id); - void AddOrder(Order Order); + int ItemsInCart { get; } + List GetMyOrders(ApplicationUser user); + Order GetActiveOrder(ApplicationUser user); + void AddToCart(ApplicationUser user, OrderItem product); + Order GetOrder(ApplicationUser user, Guid orderId); } } diff --git a/src/Web/WebMVC/Services/OrderingService.cs b/src/Web/WebMVC/Services/OrderingService.cs index c9f2c3eb6..0c4f7ac5e 100644 --- a/src/Web/WebMVC/Services/OrderingService.cs +++ b/src/Web/WebMVC/Services/OrderingService.cs @@ -3,44 +3,90 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.eShopOnContainers.WebMVC.Models; +using Microsoft.AspNetCore.Http; namespace Microsoft.eShopOnContainers.WebMVC.Services { public class OrderingService : IOrderingService { private List _orders; + private int _itemsInCart; + private IHttpContextAccessor _httpContextAccessor; + public int ItemsInCart { get { return _itemsInCart; } } //var ordersUrl = _settings.OrderingUrl + "/api/ordering/orders"; //var dataString = await _http.GetStringAsync(ordersUrl); //var items = JsonConvert.DeserializeObject>(dataString); - public OrderingService() + public OrderingService(IHttpContextAccessor httpContextAccessor) { + _httpContextAccessor = httpContextAccessor; + _orders = new List() { new Order() { - BuyerId = Guid.NewGuid(), OrderDate = DateTime.Now, + BuyerId = new Guid("ebcbcb4c-b032-4baa-834b-7fd66d37bc95").ToString(), + OrderDate = DateTime.Now, + State = OrderState.Active, + OrderItems = new List() + { + new OrderItem() { UnitPrice = 12, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt", Quantity = 1, ProductName="Roslyn Red T-Shirt" } + } + }, + new Order() + { + BuyerId = new Guid("ebcbcb4c-b032-4baa-834b-7fd66d37bc95").ToString(), + OrderDate = DateTime.Now, + State = OrderState.InProcess, + OrderItems = new List() + { + new OrderItem() { UnitPrice = 12, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt", Quantity = 1, ProductName="Roslyn Red T-Shirt" } + } + }, + new Order() + { + BuyerId = new Guid("ebcbcb4c-b032-4baa-834b-7fd66d37bc95").ToString(), + OrderDate = DateTime.Now, + State = OrderState.InProcess, OrderItems = new List() { - new OrderItem() { UnitPrice = 12 } + new OrderItem() { UnitPrice = 12, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt", Quantity = 1, ProductName="Roslyn Red T-Shirt" } } } }; } - public void AddOrder(Order Order) + public Order GetActiveOrder(ApplicationUser user) + { + //I think could be a good aproach to work with session to store the active order. + //.... + Order activeOrder; + activeOrder = _httpContextAccessor.HttpContext.Session.GetObject("MyActiveOrder"); + if (activeOrder == null) + activeOrder = _orders.Where(x => x.BuyerId.Equals(user.Id) && x.State == OrderState.Active).FirstOrDefault(); + + _itemsInCart = (activeOrder != null) ? activeOrder.OrderItems.Count() : 0; + + return activeOrder; + } + + public Order GetOrder(ApplicationUser user, Guid Id) { - _orders.Add(Order); + return _orders.Where(x => x.BuyerId.Equals(user.Id) && x.Id.Equals(Id)).FirstOrDefault(); } - public Order GetOrder(Guid Id) + public List GetMyOrders(ApplicationUser user) { - return _orders.Where(x => x.BuyerId == Id).FirstOrDefault(); + return _orders.Where(x => x.BuyerId.Equals(user.Id)).ToList(); } - public List GetOrders() + public void AddToCart(ApplicationUser user, OrderItem product) { - return _orders; + var activeOrder = GetActiveOrder(user); + activeOrder.OrderItems.Add(product); + //CCE: lacks and httpcall to persist in the real back.end service. + _httpContextAccessor.HttpContext.Session.SetObject("MyActiveOrder", activeOrder); + } } } diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 24381c2f2..77b7e6fe8 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -49,13 +49,14 @@ namespace Microsoft.eShopOnContainers.WebMVC .AddDefaultTokenProviders(); services.AddMvc(); + services.AddDistributedMemoryCache(); // default implementation (in memory), you can move to SQL or custom store that could be Redis.. + services.AddSession(); // Add application services. services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddSingleton(); services.AddTransient(); - services.AddTransient(); services.Configure(Configuration); } @@ -81,6 +82,8 @@ namespace Microsoft.eShopOnContainers.WebMVC app.UseIdentity(); + app.UseSession(); + // Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715 app.UseMvc(routes => diff --git a/src/Web/WebMVC/ViewComponents/Cart.cs b/src/Web/WebMVC/ViewComponents/Cart.cs new file mode 100644 index 000000000..faa9ce00a --- /dev/null +++ b/src/Web/WebMVC/ViewComponents/Cart.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.eShopOnContainers.WebMVC.Models; +using Microsoft.eShopOnContainers.WebMVC.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.WebMVC.ViewComponents +{ + public class Cart : ViewComponent + { + private readonly IOrderingService _cartSvc; + + public Cart(IOrderingService cartSvc) + { + _cartSvc = cartSvc; + } + + public async Task InvokeAsync(ApplicationUser user) + { + var itemsInCart = await ItemsInCartAsync(user); + return View(itemsInCart); + } + private Task ItemsInCartAsync(ApplicationUser user) + { + _cartSvc.GetActiveOrder(user); + return Task.Run ( ()=> { return _cartSvc.ItemsInCart; }); + } + } +} diff --git a/src/Web/WebMVC/ViewComponents/CartList.cs b/src/Web/WebMVC/ViewComponents/CartList.cs index 0e56ddd0a..66d1bfaa5 100644 --- a/src/Web/WebMVC/ViewComponents/CartList.cs +++ b/src/Web/WebMVC/ViewComponents/CartList.cs @@ -10,21 +10,21 @@ namespace Microsoft.eShopOnContainers.WebMVC.ViewComponents { public class CartList : ViewComponent { - private readonly ICartService _cartSvc; + private readonly IOrderingService _cartSvc; - public CartList(ICartService cartSvc) + public CartList(IOrderingService cartSvc) { _cartSvc = cartSvc; } - public async Task InvokeAsync() + public async Task InvokeAsync(ApplicationUser user) { - var item = await GetItemsAsync(); + var item = await GetItemsAsync(user); return View(item); } - private Task GetItemsAsync() + private Task GetItemsAsync(ApplicationUser user) { - return _cartSvc.GetActiveOrder(); + return Task.Run(()=> { return _cartSvc.GetActiveOrder(user); }); } } } diff --git a/src/Web/WebMVC/Views/Catalog/Index.cshtml b/src/Web/WebMVC/Views/Catalog/Index.cshtml index d701b3f7e..94977df5a 100644 --- a/src/Web/WebMVC/Views/Catalog/Index.cshtml +++ b/src/Web/WebMVC/Views/Catalog/Index.cshtml @@ -63,7 +63,7 @@
diff --git a/src/Web/WebMVC/Views/Order/Cart.cshtml b/src/Web/WebMVC/Views/Order/Cart.cshtml index ab497fe9c..1059b25e0 100644 --- a/src/Web/WebMVC/Views/Order/Cart.cshtml +++ b/src/Web/WebMVC/Views/Order/Cart.cshtml @@ -1,4 +1,5 @@ @model Microsoft.eShopOnContainers.WebMVC.Models.Order +@inject UserManager UserManager @{ ViewData["Title"] = "My Cart"; @@ -17,7 +18,7 @@ - - @await Component.InvokeAsync("CartList") + @await Component.InvokeAsync("CartList", new { user = await UserManager.GetUserAsync(User) })
+ PRODUCT @@ -38,7 +39,7 @@
diff --git a/src/Web/WebMVC/Views/Shared/Components/Cart/Default.cshtml b/src/Web/WebMVC/Views/Shared/Components/Cart/Default.cshtml index 55acc63b1..e680a4056 100644 --- a/src/Web/WebMVC/Views/Shared/Components/Cart/Default.cshtml +++ b/src/Web/WebMVC/Views/Shared/Components/Cart/Default.cshtml @@ -1,10 +1,17 @@ -@model Microsoft.eShopOnContainers.WebMVC.Models.Order +@model System.Int32 @{ ViewData["Title"] = "My Cart"; } - +
+ + + +
+ @Model +
+
diff --git a/src/Web/WebMVC/Views/Shared/Components/CartList/Default.cshtml b/src/Web/WebMVC/Views/Shared/Components/CartList/Default.cshtml index ccd1a7f7f..f7f2c5619 100644 --- a/src/Web/WebMVC/Views/Shared/Components/CartList/Default.cshtml +++ b/src/Web/WebMVC/Views/Shared/Components/CartList/Default.cshtml @@ -7,12 +7,12 @@ @foreach (var item in Model.OrderItems) { - @*image*@ + @item.ProductName ROSLYN $ @item.UnitPrice @item.Quantity - $ @item.Quantity * @item.UnitPrice + $ @(item.Quantity * item.UnitPrice) } diff --git a/src/Web/WebMVC/Views/Shared/_LoginPartial.cshtml b/src/Web/WebMVC/Views/Shared/_LoginPartial.cshtml index d68a9cb54..df0a7ef5f 100644 --- a/src/Web/WebMVC/Views/Shared/_LoginPartial.cshtml +++ b/src/Web/WebMVC/Views/Shared/_LoginPartial.cshtml @@ -7,15 +7,15 @@ @if (SignInManager.IsSignedIn(User)) {