Skip to content

Commit

Permalink
Refactor to eliminate unneeded BasketQueryService
Browse files Browse the repository at this point in the history
  • Loading branch information
ardalis committed Dec 2, 2021
1 parent 6f5a6c0 commit 833dc3b
Show file tree
Hide file tree
Showing 11 changed files with 69 additions and 65 deletions.
3 changes: 3 additions & 0 deletions src/ApplicationCore/Entities/BasketAggregate/Basket.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ public class Basket : BaseEntity, IAggregateRoot
private readonly List<BasketItem> _items = new List<BasketItem>();
public IReadOnlyCollection<BasketItem> Items => _items.AsReadOnly();

public int TotalItems => _items.Sum(i => i.Quantity);


public Basket(string buyerId)
{
BuyerId = buyerId;
Expand Down
8 changes: 0 additions & 8 deletions src/ApplicationCore/Interfaces/IBasketQueryService.cs

This file was deleted.

26 changes: 0 additions & 26 deletions src/Infrastructure/Data/BasketQueryService.cs

This file was deleted.

1 change: 0 additions & 1 deletion src/Web/Configuration/ConfigureCoreServices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ public static IServiceCollection AddCoreServices(this IServiceCollection service

services.AddScoped<IBasketService, BasketService>();
services.AddScoped<IOrderService, OrderService>();
services.AddScoped<IBasketQueryService, BasketQueryService>();
services.AddSingleton<IUriComposer>(new UriComposer(configuration.Get<CatalogSettings>()));
services.AddScoped(typeof(IAppLogger<>), typeof(LoggerAdapter<>));
services.AddTransient<IEmailSender, EmailSender>();
Expand Down
3 changes: 0 additions & 3 deletions src/Web/Interfaces/IBasketViewModelService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,5 @@ namespace Microsoft.eShopWeb.Web.Interfaces;
public interface IBasketViewModelService
{
Task<BasketViewModel> GetOrCreateBasketForUser(string userName);

Task<int> CountTotalBasketItems(string username);

Task<BasketViewModel> Map(Basket basket);
}
2 changes: 1 addition & 1 deletion src/Web/Pages/Basket/Checkout.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@
</h3>

<section class="esh-basket-item">
<a asp-page="/Index" class="btn esh-basket-checkout text-white">[ Continue Shopping..]</a>
<a asp-page="/Index" class="btn esh-basket-checkout text-white">[ Continue Shopping ]</a>
</section>
}
</div>
4 changes: 2 additions & 2 deletions src/Web/Pages/Basket/Index.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
</div>
<div class="row">
<section class="esh-basket-item col-xs-1">
<a asp-page="/Index" class="btn esh-basket-checkout text-white">[ Continue Shopping..]</a>
<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">

Expand All @@ -84,7 +84,7 @@
</h3>

<section class="esh-basket-item">
<a asp-page="/Index" class="btn esh-basket-checkout text-white">[ Continue Shopping..]</a>
<a asp-page="/Index" class="btn esh-basket-checkout text-white">[ Continue Shopping ]</a>
</section>
}
</div>
26 changes: 20 additions & 6 deletions src/Web/Pages/Shared/Components/BasketComponent/Basket.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,27 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
using Microsoft.eShopWeb.ApplicationCore.Specifications;
using Microsoft.eShopWeb.Infrastructure.Identity;
using Microsoft.eShopWeb.Web.Interfaces;
using Microsoft.eShopWeb.Web.ViewModels;
using BasketEntity = Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate.Basket;

namespace Microsoft.eShopWeb.Web.Pages.Shared.Components.BasketComponent;

public class Basket : ViewComponent
{
private readonly IBasketViewModelService _basketService;
private readonly IBasketViewModelService _basketViewModelService;
private readonly IReadRepository<BasketEntity> _basketRepository;
private readonly SignInManager<ApplicationUser> _signInManager;

public Basket(IBasketViewModelService basketService,
SignInManager<ApplicationUser> signInManager)
public Basket(IBasketViewModelService basketViewModelService,
IReadRepository<BasketEntity> basketRepository,
SignInManager<ApplicationUser> signInManager)
{
_basketService = basketService;
_basketViewModelService = basketViewModelService;
_basketRepository = basketRepository;
_signInManager = signInManager;
}

Expand All @@ -33,18 +39,26 @@ private async Task<int> CountTotalBasketItems()
{
if (_signInManager.IsSignedIn(HttpContext.User))
{
return await _basketService.CountTotalBasketItems(User.Identity.Name);
var userNameSpec = new BasketWithItemsSpecification(User.Identity.Name);

var userBasket = await _basketRepository.GetBySpecAsync(userNameSpec);
if (userBasket == null) return 0;
return userBasket.TotalItems;
}

string anonymousId = GetAnnonymousIdFromCookie();
if (anonymousId == null)
return 0;

return await _basketService.CountTotalBasketItems(anonymousId);
var anonymousSpec = new BasketWithItemsSpecification(anonymousId);
var anonymousBasket = await _basketRepository.GetBySpecAsync(anonymousSpec);
if (anonymousBasket == null) return 0;
return anonymousBasket.TotalItems;
}

private string GetAnnonymousIdFromCookie()
{
// TODO: Add a prefix to anonymous cookie values so they cannot collide with user names
if (Request.Cookies.ContainsKey(Constants.BASKET_COOKIENAME))
{
var id = Request.Cookies[Constants.BASKET_COOKIENAME];
Expand Down
16 changes: 3 additions & 13 deletions src/Web/Services/BasketViewModelService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,14 @@ public class BasketViewModelService : IBasketViewModelService
{
private readonly IRepository<Basket> _basketRepository;
private readonly IUriComposer _uriComposer;
private readonly IBasketQueryService _basketQueryService;
private readonly IRepository<CatalogItem> _itemRepository;
private readonly IReadRepository<CatalogItem> _itemRepository;

public BasketViewModelService(IRepository<Basket> basketRepository,
IRepository<CatalogItem> itemRepository,
IUriComposer uriComposer,
IBasketQueryService basketQueryService)
IReadRepository<CatalogItem> itemRepository,
IUriComposer uriComposer)
{
_basketRepository = basketRepository;
_uriComposer = uriComposer;
_basketQueryService = basketQueryService;
_itemRepository = itemRepository;
}

Expand Down Expand Up @@ -86,11 +83,4 @@ public async Task<BasketViewModel> Map(Basket basket)
Items = await GetBasketItems(basket.Items)
};
}

public async Task<int> CountTotalBasketItems(string username)
{
var counter = await _basketQueryService.CountTotalBasketItems(username);

return counter;
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using System;
using System.Linq;
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
using Xunit;

using System.Linq;
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
using Xunit;

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

public class BasketAddItem
Expand Down Expand Up @@ -72,4 +72,4 @@ public void CantModifyQuantityToNegativeNumber()

Assert.Throws<ArgumentOutOfRangeException>(() => basket.AddItem(_testCatalogItemId, _testUnitPrice, -2));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
using Xunit;

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

public class BasketTotalItems
{
private readonly int _testCatalogItemId = 123;
private readonly decimal _testUnitPrice = 1.23m;
private readonly int _testQuantity = 2;
private readonly string _buyerId = "Test buyerId";

[Fact]
public void ReturnsTotalQuantityWithOneItem()
{
var basket = new Basket(_buyerId);
basket.AddItem(_testCatalogItemId, _testUnitPrice, _testQuantity);

var result = basket.TotalItems;

Assert.Equal(_testQuantity, result);
}

[Fact]
public void ReturnsTotalQuantityWithMultipleItems()
{
var basket = new Basket(_buyerId);
basket.AddItem(_testCatalogItemId, _testUnitPrice, _testQuantity);
basket.AddItem(_testCatalogItemId, _testUnitPrice, _testQuantity*2);

var result = basket.TotalItems;

Assert.Equal(_testQuantity*3, result);
}
}

0 comments on commit 833dc3b

Please sign in to comment.