Refactoring Services (#61)
* Refactoring ViewModels into Razor Pages models * Cleaning up Basket viewcomponent * Refactoring services. Fixed bug in basket item counter.
This commit is contained in:
@@ -5,9 +5,8 @@ using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Infrastructure.Identity;
|
||||
using System;
|
||||
using Web;
|
||||
using Microsoft.AspNetCore.Authentication;
|
||||
using Microsoft.eShopWeb.Interfaces;
|
||||
using ApplicationCore.Interfaces;
|
||||
|
||||
namespace Microsoft.eShopWeb.Controllers
|
||||
{
|
||||
|
||||
@@ -22,8 +22,10 @@ namespace Microsoft.eShopWeb.Controllers
|
||||
private readonly SignInManager<ApplicationUser> _signInManager;
|
||||
private readonly IAppLogger<BasketController> _logger;
|
||||
private readonly IOrderService _orderService;
|
||||
private readonly IBasketViewModelService _basketViewModelService;
|
||||
|
||||
public BasketController(IBasketService basketService,
|
||||
IBasketViewModelService basketViewModelService,
|
||||
IOrderService orderService,
|
||||
IUriComposer uriComposer,
|
||||
SignInManager<ApplicationUser> signInManager,
|
||||
@@ -34,6 +36,7 @@ namespace Microsoft.eShopWeb.Controllers
|
||||
_signInManager = signInManager;
|
||||
_logger = logger;
|
||||
_orderService = orderService;
|
||||
_basketViewModelService = basketViewModelService;
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
@@ -87,10 +90,10 @@ namespace Microsoft.eShopWeb.Controllers
|
||||
{
|
||||
if (_signInManager.IsSignedIn(HttpContext.User))
|
||||
{
|
||||
return await _basketService.GetOrCreateBasketForUser(User.Identity.Name);
|
||||
return await _basketViewModelService.GetOrCreateBasketForUser(User.Identity.Name);
|
||||
}
|
||||
string anonymousId = GetOrSetBasketCookie();
|
||||
return await _basketService.GetOrCreateBasketForUser(anonymousId);
|
||||
return await _basketViewModelService.GetOrCreateBasketForUser(anonymousId);
|
||||
}
|
||||
|
||||
private string GetOrSetBasketCookie()
|
||||
|
||||
@@ -1,15 +1,10 @@
|
||||
using Microsoft.eShopWeb.ViewModels;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Microsoft.eShopWeb.Interfaces
|
||||
{
|
||||
public interface IBasketService
|
||||
public interface IBasketViewModelService
|
||||
{
|
||||
Task<BasketViewModel> GetOrCreateBasketForUser(string userName);
|
||||
Task TransferBasketAsync(string anonymousId, string userName);
|
||||
Task AddItemToBasket(int basketId, int catalogItemId, decimal price, int quantity);
|
||||
Task SetQuantities(int basketId, Dictionary<string, int> quantities);
|
||||
Task DeleteBasketAsync(int basketId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,21 +9,18 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Microsoft.eShopWeb.Services
|
||||
{
|
||||
public class BasketService : IBasketService
|
||||
public class BasketViewModelService : IBasketViewModelService
|
||||
{
|
||||
private readonly IAsyncRepository<Basket> _basketRepository;
|
||||
private readonly IUriComposer _uriComposer;
|
||||
private readonly IAppLogger<BasketService> _logger;
|
||||
private readonly IRepository<CatalogItem> _itemRepository;
|
||||
|
||||
public BasketService(IAsyncRepository<Basket> basketRepository,
|
||||
public BasketViewModelService(IAsyncRepository<Basket> basketRepository,
|
||||
IRepository<CatalogItem> itemRepository,
|
||||
IUriComposer uriComposer,
|
||||
IAppLogger<BasketService> logger)
|
||||
IUriComposer uriComposer)
|
||||
{
|
||||
_basketRepository = basketRepository;
|
||||
_uriComposer = uriComposer;
|
||||
this._logger = logger;
|
||||
_itemRepository = itemRepository;
|
||||
}
|
||||
|
||||
@@ -63,7 +60,7 @@ namespace Microsoft.eShopWeb.Services
|
||||
return viewModel;
|
||||
}
|
||||
|
||||
public async Task<BasketViewModel> CreateBasketForUser(string userId)
|
||||
private async Task<BasketViewModel> CreateBasketForUser(string userId)
|
||||
{
|
||||
var basket = new Basket() { BuyerId = userId };
|
||||
await _basketRepository.AddAsync(basket);
|
||||
@@ -75,44 +72,5 @@ namespace Microsoft.eShopWeb.Services
|
||||
Items = new List<BasketItemViewModel>()
|
||||
};
|
||||
}
|
||||
|
||||
public async Task AddItemToBasket(int basketId, int catalogItemId, decimal price, int quantity)
|
||||
{
|
||||
var basket = await _basketRepository.GetByIdAsync(basketId);
|
||||
|
||||
basket.AddItem(catalogItemId, price, quantity);
|
||||
|
||||
await _basketRepository.UpdateAsync(basket);
|
||||
}
|
||||
|
||||
public async Task SetQuantities(int basketId, Dictionary<string,int> quantities)
|
||||
{
|
||||
var basket = await _basketRepository.GetByIdAsync(basketId);
|
||||
foreach (var item in basket.Items)
|
||||
{
|
||||
if (quantities.TryGetValue(item.Id.ToString(), out var quantity))
|
||||
{
|
||||
_logger.LogWarning($"Updating quantity of item ID:{item.Id} to {quantity}.");
|
||||
item.Quantity = quantity;
|
||||
}
|
||||
}
|
||||
await _basketRepository.UpdateAsync(basket);
|
||||
}
|
||||
|
||||
public async Task DeleteBasketAsync(int basketId)
|
||||
{
|
||||
var basket = await _basketRepository.GetByIdAsync(basketId);
|
||||
|
||||
await _basketRepository.DeleteAsync(basket);
|
||||
}
|
||||
|
||||
public async Task TransferBasketAsync(string anonymousId, string userName)
|
||||
{
|
||||
var basketSpec = new BasketWithItemsSpecification(anonymousId);
|
||||
var basket = (await _basketRepository.ListAsync(basketSpec)).FirstOrDefault();
|
||||
if (basket == null) return;
|
||||
basket.BuyerId = userName;
|
||||
await _basketRepository.UpdateAsync(basket);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,10 @@ using ApplicationCore.Specifications;
|
||||
|
||||
namespace Microsoft.eShopWeb.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// This is a UI-specific service so belongs in UI project. It does not contain any business logic and works
|
||||
/// with UI-specific types (view models and SelectListItem types).
|
||||
/// </summary>
|
||||
public class CatalogService : ICatalogService
|
||||
{
|
||||
private readonly ILogger<CatalogService> _logger;
|
||||
|
||||
@@ -3,7 +3,6 @@ using ApplicationCore.Services;
|
||||
using Infrastructure.Data;
|
||||
using Infrastructure.Identity;
|
||||
using Infrastructure.Logging;
|
||||
using Infrastructure.Services;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
@@ -93,6 +92,7 @@ namespace Microsoft.eShopWeb
|
||||
|
||||
services.AddScoped<ICatalogService, CachedCatalogService>();
|
||||
services.AddScoped<IBasketService, BasketService>();
|
||||
services.AddScoped<IBasketViewModelService, BasketViewModelService>();
|
||||
services.AddScoped<IOrderService, OrderService>();
|
||||
services.AddScoped<IOrderRepository, OrderRepository>();
|
||||
services.AddScoped<CatalogService>();
|
||||
|
||||
@@ -12,10 +12,10 @@ namespace Web.ViewComponents
|
||||
{
|
||||
public class Basket : ViewComponent
|
||||
{
|
||||
private readonly IBasketService _basketService;
|
||||
private readonly IBasketViewModelService _basketService;
|
||||
private readonly SignInManager<ApplicationUser> _signInManager;
|
||||
|
||||
public Basket(IBasketService basketService,
|
||||
public Basket(IBasketViewModelService basketService,
|
||||
SignInManager<ApplicationUser> signInManager)
|
||||
{
|
||||
_basketService = basketService;
|
||||
|
||||
Reference in New Issue
Block a user