From 0b76d857b1f96de54f9ff741879cd21a24f871d9 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 5 Dec 2021 11:45:38 -0700 Subject: [PATCH 01/15] Added CSS file for Products page --- src/Congo.RazorPages/Pages/Products.cshtml.css | 8 ++++++++ src/Congo.RazorPages/Pages/Shared/_Layout.cshtml | 1 + 2 files changed, 9 insertions(+) create mode 100644 src/Congo.RazorPages/Pages/Products.cshtml.css diff --git a/src/Congo.RazorPages/Pages/Products.cshtml.css b/src/Congo.RazorPages/Pages/Products.cshtml.css new file mode 100644 index 0000000..5523f1b --- /dev/null +++ b/src/Congo.RazorPages/Pages/Products.cshtml.css @@ -0,0 +1,8 @@ +input, label { + display: block; +} + +.product-quantity { + float: left; + margin-right: 20px; +} diff --git a/src/Congo.RazorPages/Pages/Shared/_Layout.cshtml b/src/Congo.RazorPages/Pages/Shared/_Layout.cshtml index 84dc14d..0eb39ed 100644 --- a/src/Congo.RazorPages/Pages/Shared/_Layout.cshtml +++ b/src/Congo.RazorPages/Pages/Shared/_Layout.cshtml @@ -6,6 +6,7 @@ @ViewData["Title"] - Congo.RazorPages +
From 28aacceb497d6b46573134e2c95ea4c658486de9 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 5 Dec 2021 11:46:38 -0700 Subject: [PATCH 02/15] Initial attempt at calling add-to-cart API --- src/Congo.RazorPages/Pages/Products.cshtml | 44 +++++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/src/Congo.RazorPages/Pages/Products.cshtml b/src/Congo.RazorPages/Pages/Products.cshtml index 0533df0..cd9b74d 100644 --- a/src/Congo.RazorPages/Pages/Products.cshtml +++ b/src/Congo.RazorPages/Pages/Products.cshtml @@ -6,7 +6,7 @@

Products

-
+
@foreach (var product in Model.Products) { @@ -16,11 +16,45 @@

@product.Name

$@product.Price

- + + +
+
+ + +
+
+ +
+
+
} - + + + From a646ad9549448820d6ea2171209bc86668b2b2c0 Mon Sep 17 00:00:00 2001 From: Rich Dunne Date: Sun, 5 Dec 2021 11:48:57 -0700 Subject: [PATCH 03/15] Removed ProductQuantity binding --- src/Congo.RazorPages/Pages/Products.cshtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Congo.RazorPages/Pages/Products.cshtml b/src/Congo.RazorPages/Pages/Products.cshtml index cd9b74d..56636be 100644 --- a/src/Congo.RazorPages/Pages/Products.cshtml +++ b/src/Congo.RazorPages/Pages/Products.cshtml @@ -20,8 +20,8 @@
- - + +
- +
- +
-
-
- +
+ @foreach (var product in Model.Products) + { +
+ @product.Name +
+

@product.Name

+

$@product.Price

- } -
+
+ +
+
+ + +
+
+ +
+
+
+
+ } +
diff --git a/src/Congo.RazorPages/Pages/Products.cshtml.cs b/src/Congo.RazorPages/Pages/Products.cshtml.cs index 603803e..0d86d81 100644 --- a/src/Congo.RazorPages/Pages/Products.cshtml.cs +++ b/src/Congo.RazorPages/Pages/Products.cshtml.cs @@ -26,11 +26,11 @@ public async Task OnGetAsync() return Page(); } - public async Task OnPostAddToCartAsync(Guid id) + public async Task OnPostAddToCartAsync(Guid productId, int quantity) { - // TODO: Update for add to cart instead of purchase order - var order = await _productsService.PurchaseAsync(id); - return RedirectToPage("/OrderSuccessful", new { order.OrderId }); + // call _cartService.AddToCart(new AddToCartRequest(...)) + await Task.Delay(0); + return new OkObjectResult(true); } } } diff --git a/src/Congo.RazorPages/Pages/Shared/_Layout.cshtml b/src/Congo.RazorPages/Pages/Shared/_Layout.cshtml index 0eb39ed..b823a74 100644 --- a/src/Congo.RazorPages/Pages/Shared/_Layout.cshtml +++ b/src/Congo.RazorPages/Pages/Shared/_Layout.cshtml @@ -45,6 +45,7 @@ + @await RenderSectionAsync("Scripts", required: false) diff --git a/src/Congo.WebApi/Controllers/CartController.cs b/src/Congo.WebApi/Controllers/CartController.cs index 2b7565a..c22182d 100644 --- a/src/Congo.WebApi/Controllers/CartController.cs +++ b/src/Congo.WebApi/Controllers/CartController.cs @@ -25,15 +25,25 @@ public async Task> GetCartById(Guid id) return Ok(cart.Adapt()); } - [HttpPost("/add-to-cart")] + [HttpPost("add-to-cart")] [ProducesResponseType(204)] [ProducesResponseType(typeof(Guid), 200)] public async Task AddToCart(AddToCartRequest request) { - var cart = await _mediator.Send(new AddToCartCommand(request.CartId, request.ProductId, request.Quantity)); + var cart = await _mediator.Send(new AddToCartCommand(CurrentCartId, request.ProductId, request.Quantity)); if (cart == Guid.Empty) return BadRequest(); return Ok(cart); } + + private Guid? CurrentCartId + { + get + { + if (Guid.TryParse(HttpContext.Request.Cookies["cart_id"], out var cartId)) + return cartId; + return null; + } + } } } From 21984825ce5616a4d651b3e4a2eb9f975d51727a Mon Sep 17 00:00:00 2001 From: Paul Keating Date: Sat, 12 Feb 2022 22:53:26 +0000 Subject: [PATCH 10/15] no changes --- src/Congo.WebApi.Tests/Controllers/CartControllerTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Congo.WebApi.Tests/Controllers/CartControllerTests.cs b/src/Congo.WebApi.Tests/Controllers/CartControllerTests.cs index 55cf6b3..8e9b399 100644 --- a/src/Congo.WebApi.Tests/Controllers/CartControllerTests.cs +++ b/src/Congo.WebApi.Tests/Controllers/CartControllerTests.cs @@ -28,6 +28,6 @@ public async void CartController_ReturnsCartOfTypeCartResponse() // Assert cartResponse.Result.Should().BeAssignableTo(); - } + } } } From 739800c80b08d2cb68d24b730f1bf77bd07c9896 Mon Sep 17 00:00:00 2001 From: Paul Keating Date: Sat, 12 Feb 2022 22:53:39 +0000 Subject: [PATCH 11/15] added 400 response type --- src/Congo.WebApi/Controllers/CartController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Congo.WebApi/Controllers/CartController.cs b/src/Congo.WebApi/Controllers/CartController.cs index c22182d..864803d 100644 --- a/src/Congo.WebApi/Controllers/CartController.cs +++ b/src/Congo.WebApi/Controllers/CartController.cs @@ -28,6 +28,7 @@ public async Task> GetCartById(Guid id) [HttpPost("add-to-cart")] [ProducesResponseType(204)] [ProducesResponseType(typeof(Guid), 200)] + [ProducesResponseType(400)] public async Task AddToCart(AddToCartRequest request) { var cart = await _mediator.Send(new AddToCartCommand(CurrentCartId, request.ProductId, request.Quantity)); From 50c4dbf8120ee4e600543b235c3db7e2aa96f297 Mon Sep 17 00:00:00 2001 From: Paul Keating Date: Sun, 13 Feb 2022 20:05:06 +0000 Subject: [PATCH 12/15] Added bool to cehck for new cart to the Cart model --- src/Congo.WebApi/Data/Models/Cart.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Congo.WebApi/Data/Models/Cart.cs b/src/Congo.WebApi/Data/Models/Cart.cs index 473c666..cbb2a3e 100644 --- a/src/Congo.WebApi/Data/Models/Cart.cs +++ b/src/Congo.WebApi/Data/Models/Cart.cs @@ -7,5 +7,6 @@ public class Cart { public Guid Id { get; init; } public ICollection CartItems { get; set; } = new List(); + public bool IsNewCart { get; set; } = true; } } From b10ce40e91938e732fde3f8209525cf835fa2e96 Mon Sep 17 00:00:00 2001 From: Paul Keating Date: Sun, 13 Feb 2022 20:05:59 +0000 Subject: [PATCH 13/15] Fixed the AddToCart end point to follow the correct design specs --- src/Congo.WebApi/Controllers/CartController.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Congo.WebApi/Controllers/CartController.cs b/src/Congo.WebApi/Controllers/CartController.cs index 864803d..9dc1519 100644 --- a/src/Congo.WebApi/Controllers/CartController.cs +++ b/src/Congo.WebApi/Controllers/CartController.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Congo.Contracts.Responses.Cart; using Congo.WebApi.Data.CartAccess; +using Congo.WebApi.Data.Models; using Congo.WebApi.Requests.Cart; using Mapster; using MediatR; @@ -27,14 +28,18 @@ public async Task> GetCartById(Guid id) [HttpPost("add-to-cart")] [ProducesResponseType(204)] - [ProducesResponseType(typeof(Guid), 200)] + [ProducesResponseType(typeof(CartResponse), 200)] [ProducesResponseType(400)] - public async Task AddToCart(AddToCartRequest request) + public async Task> AddToCart(AddToCartRequest request) { var cart = await _mediator.Send(new AddToCartCommand(CurrentCartId, request.ProductId, request.Quantity)); - if (cart == Guid.Empty) + + if (cart == null) return BadRequest(); - return Ok(cart); + else if (!cart.IsNewCart) + return NoContent(); + + return Ok(cart.Adapt()); } private Guid? CurrentCartId From 150eee3bed1f3a68adc0a46730290e014dc5c895 Mon Sep 17 00:00:00 2001 From: Paul Keating Date: Sun, 13 Feb 2022 20:06:29 +0000 Subject: [PATCH 14/15] Changed the response of our command to be of type Cart --- src/Congo.WebApi/Data/CartAccess/CartCommands.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Congo.WebApi/Data/CartAccess/CartCommands.cs b/src/Congo.WebApi/Data/CartAccess/CartCommands.cs index 8f82e05..651b604 100644 --- a/src/Congo.WebApi/Data/CartAccess/CartCommands.cs +++ b/src/Congo.WebApi/Data/CartAccess/CartCommands.cs @@ -1,10 +1,11 @@ using System; +using Congo.WebApi.Data.Models; using MediatR; namespace Congo.WebApi.Data.CartAccess { public class CartCommands { - public record AddToCartCommand(Guid? cartId, Guid productId, int quantity) : IRequest; + public record AddToCartCommand(Guid? cartId, Guid productId, int quantity) : IRequest; } } From 2f9a9dbb66c411f384bb65f0896103d9168f925b Mon Sep 17 00:00:00 2001 From: Paul Keating Date: Sun, 13 Feb 2022 20:07:48 +0000 Subject: [PATCH 15/15] -changed the AddToCartHandler to return the correct type from Guid to Cart -Added a check to determine if the cart is new or existing --- .../Data/CartAccess/AddToCartHandler.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Congo.WebApi/Data/CartAccess/AddToCartHandler.cs b/src/Congo.WebApi/Data/CartAccess/AddToCartHandler.cs index 2068753..aa65aec 100644 --- a/src/Congo.WebApi/Data/CartAccess/AddToCartHandler.cs +++ b/src/Congo.WebApi/Data/CartAccess/AddToCartHandler.cs @@ -2,14 +2,16 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using Congo.Contracts.Responses.Cart; using Congo.WebApi.Data.Models; using MediatR; +using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using static Congo.WebApi.Data.CartAccess.CartCommands; namespace Congo.WebApi.Data.CartAccess { - public class AddToCartHandler : IRequestHandler + public class AddToCartHandler : IRequestHandler { private readonly CongoContext _dbContext; @@ -18,17 +20,22 @@ public AddToCartHandler(CongoContext dbContext) _dbContext = dbContext; } - public async Task Handle(AddToCartCommand request, CancellationToken cancellationToken) + public async Task Handle(AddToCartCommand request, CancellationToken cancellationToken) { var cart = await _dbContext.Carts .Include(c => c.CartItems) .FirstOrDefaultAsync(C => C.Id == request.cartId); + if (cart != null) + { + cart.IsNewCart = false; + } + var product = await _dbContext.Products.FindAsync(request.productId); if (request.cartId != null && cart == null) { - return Guid.Empty; + return null; } else if (request.cartId == null) { @@ -43,7 +50,7 @@ public async Task Handle(AddToCartCommand request, CancellationToken cance await _dbContext.SaveChangesAsync(); - return cart.Id; + return cart; } private async Task AddCartItem(AddToCartCommand request, Cart cart, Product product, CongoContext _dbContext)