Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/ApplicationCore/Entities/BasketAggregate/Basket.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,9 @@ public void SetNewBuyerId(string buyerId)
{
BuyerId = buyerId;
}

public void RemoveItem(int catalogItemId)
{
_items.RemoveAll(i => i.CatalogItemId == catalogItemId);
}
}
1 change: 1 addition & 0 deletions src/ApplicationCore/Interfaces/IBasketService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ public interface IBasketService
Task<Basket> AddItemToBasket(string username, int catalogItemId, decimal price, int quantity = 1);
Task<Result<Basket>> SetQuantities(int basketId, Dictionary<string, int> quantities);
Task DeleteBasketAsync(int basketId);
Task<Result<Basket>> RemoveItemFromBasket(int basketId, string username, int catalogItemId);
}
11 changes: 11 additions & 0 deletions src/ApplicationCore/Services/BasketService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,15 @@ public async Task TransferBasketAsync(string anonymousId, string userName)
await _basketRepository.UpdateAsync(userBasket);
await _basketRepository.DeleteAsync(anonymousBasket);
}

public async Task<Result<Basket>> RemoveItemFromBasket(int basketId, string username, int catalogItemId)
{
var basketSpec = new BasketWithItemsSpecification(basketId);
var basket = await _basketRepository.FirstOrDefaultAsync(basketSpec);
if (basket == null) return Result<Basket>.NotFound();

basket.RemoveItem(catalogItemId);
await _basketRepository.UpdateAsync(basket);
return basket;
}
}
2 changes: 1 addition & 1 deletion src/Infrastructure/Dependencies.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public static class Dependencies
{
public static void ConfigureServices(IConfiguration configuration, IServiceCollection services)
{
bool useOnlyInMemoryDatabase = false;
bool useOnlyInMemoryDatabase = true;
if (configuration["UseOnlyInMemoryDatabase"] != null)
{
useOnlyInMemoryDatabase = bool.Parse(configuration["UseOnlyInMemoryDatabase"]!);
Expand Down
18 changes: 12 additions & 6 deletions src/Web/Pages/Basket/Index.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
<article class="esh-basket-titles row">
<br />
<section class="esh-basket-title col-xs-3">Product</section>
<section class="esh-basket-title col-xs-3 hidden-lg-down"></section>
<section class="esh-basket-title col-xs-2 hidden-lg-down"></section>
<section class="esh-basket-title col-xs-2">Price</section>
<section class="esh-basket-title col-xs-2">Quantity</section>
<section class="esh-basket-title col-xs-2">Cost</section>
<section class="esh-basket-title col-xs-1"></section>
</article>
<div class="esh-catalog-items row">
<div asp-validation-summary="All" class="text-danger"></div>
Expand All @@ -32,14 +33,19 @@
<section class="esh-basket-item esh-basket-item--middle col-lg-3 hidden-lg-down">
<img class="esh-basket-image" src="@item.PictureUrl" />
</section>
<section class="esh-basket-item esh-basket-item--middle col-xs-3">@item.ProductName</section>
<section class="esh-basket-item esh-basket-item--middle col-xs-2">@item.ProductName</section>
<section class="esh-basket-item esh-basket-item--middle col-xs-2">$ @item.UnitPrice.ToString("N2")</section>
<section class="esh-basket-item esh-basket-item--middle col-xs-2">
<input type="hidden" name="@("Items[" + i + "].Id")" value="@item.Id" />
<input type="number" class="esh-basket-input" min="0" name="@("Items[" + i + "].Quantity")" value="@item.Quantity" />
</section>
<section class="esh-basket-item esh-basket-item--middle esh-basket-item--mark col-xs-2">$ @Math.Round(item.Quantity * item.UnitPrice, 2).ToString("N2")</section>
</div>
<section class="esh-basket-item esh-basket-item--middle col-xs-1">
<button class="btn btn-link" name="removebutton" asp-route-id="@item.CatalogItemId" type="submit" asp-page-handler="Remove">
Remove
</button>
</section>
</div>
<div class="row">

</div>
Expand All @@ -48,12 +54,12 @@

<div class="container">
<article class="esh-basket-titles esh-basket-titles--clean row">
<section class="esh-basket-title col-xs-10"></section>
<section class="esh-basket-title col-xs-9"></section>
<section class="esh-basket-title col-xs-2">Total</section>
</article>

<article class="esh-basket-items row">
<section class="esh-basket-item col-xs-10"></section>
<section class="esh-basket-item col-xs-9"></section>
<section class="esh-basket-item esh-basket-item--mark col-xs-2">$ @Model.BasketModel.Total().ToString("N2")</section>
</article>

Expand All @@ -65,7 +71,7 @@
<section class="esh-basket-item col-xs-1">
<a asp-page="/Index" class="btn esh-basket-checkout text-white">[ Continue Shopping ]</a>
</section>
<section class="esh-basket-item col-xs-push-7 col-xs-4">
<section class="esh-basket-item col-xs-push-7 col-xs-4 text-right">

<button class="btn esh-basket-checkout" name="updatebutton" value="" type="submit"
asp-page-handler="Update">
Expand Down
13 changes: 12 additions & 1 deletion src/Web/Pages/Basket/Index.cshtml.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Ardalis.GuardClauses;
using System.Diagnostics;
using Ardalis.GuardClauses;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.eShopWeb.ApplicationCore.Entities;
Expand Down Expand Up @@ -54,6 +55,8 @@ public async Task<IActionResult> OnPost(CatalogItemViewModel productDetails)

public async Task OnPostUpdate(IEnumerable<BasketItemViewModel> items)
{
//write to console log
Debug.WriteLine("Updating basket");
if (!ModelState.IsValid)
{
return;
Expand All @@ -65,6 +68,14 @@ public async Task OnPostUpdate(IEnumerable<BasketItemViewModel> items)
BasketModel = await _basketViewModelService.Map(basket);
}

public async Task OnPostRemove(int id)
{
var basketView = await _basketViewModelService.GetOrCreateBasketForUser(GetOrSetBasketCookieAndUserName());
var username = GetOrSetBasketCookieAndUserName();
var basket = await _basketService.RemoveItemFromBasket(basketView.Id, username, id);
BasketModel = await _basketViewModelService.Map(basket);
}

private string GetOrSetBasketCookieAndUserName()
{
Guard.Against.Null(Request.HttpContext.User.Identity, nameof(Request.HttpContext.User.Identity));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using System;
using System.Linq;
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
using Xunit;

namespace Microsoft.eShopWeb.UnitTests.ApplicationCore.Entities.BasketTests;

public class BasketRemoveItem
{
private readonly Basket _basket;
private readonly string _buyerId = "Test buyerId";

public BasketRemoveItem()
{
_basket = new Basket(_buyerId);
}

[Fact]
public void RemoveItem_RemovesItemGivenValidId()
{
// Arrange
var catalogItemId = 5;
_basket.AddItem(catalogItemId, 2.5m, 1);

// Act
_basket.RemoveItem(catalogItemId);

// Assert
Assert.DoesNotContain(_basket.Items, i => i.CatalogItemId == catalogItemId);
}

[Fact]
public void RemoveItem_DoesNothingGivenInvalidId()
{
// Arrange
var invalidCatalogItemId = 0;

// Act
_basket.RemoveItem(invalidCatalogItemId);

// Assert
Assert.All(_basket.Items, i => Assert.NotEqual(invalidCatalogItemId, i.CatalogItemId));
}
}