fix problems with spa adding items to basket

This commit is contained in:
ericuss 2019-09-04 15:21:19 +02:00
parent bd1daf232d
commit adb061cc27
3 changed files with 60 additions and 29 deletions

View File

@ -38,8 +38,18 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Controllers
var basket = await _basket.GetById(data.BuyerId) ?? new BasketData(data.BuyerId); var basket = await _basket.GetById(data.BuyerId) ?? new BasketData(data.BuyerId);
var catalogItems = await _catalog.GetCatalogItemsAsync(data.Items.Select(x => x.ProductId)); var catalogItems = await _catalog.GetCatalogItemsAsync(data.Items.Select(x => x.ProductId));
// group by product id to avoid duplicates
var itemsCalculated = data
.Items
.GroupBy(x => x.ProductId, x => x, (k, i) => new { productId = k, items = i })
.Select(groupedItem =>
{
var item = groupedItem.items.First();
item.Quantity = groupedItem.items.Sum(i => i.Quantity);
return item;
});
foreach (var bitem in data.Items) foreach (var bitem in itemsCalculated)
{ {
var catalogItem = catalogItems.SingleOrDefault(ci => ci.Id == bitem.ProductId); var catalogItem = catalogItems.SingleOrDefault(ci => ci.Id == bitem.ProductId);
if (catalogItem == null) if (catalogItem == null)
@ -47,16 +57,24 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Controllers
return BadRequest($"Basket refers to a non-existing catalog item ({bitem.ProductId})"); return BadRequest($"Basket refers to a non-existing catalog item ({bitem.ProductId})");
} }
var itemInBasket = basket.Items.FirstOrDefault(x => x.ProductId == bitem.ProductId);
if (itemInBasket == null)
{
basket.Items.Add(new BasketDataItem() basket.Items.Add(new BasketDataItem()
{ {
Id = bitem.Id, Id = bitem.Id,
ProductId = catalogItem.Id.ToString(), ProductId = catalogItem.Id,
ProductName = catalogItem.Name, ProductName = catalogItem.Name,
PictureUrl = catalogItem.PictureUri, PictureUrl = catalogItem.PictureUri,
UnitPrice = catalogItem.Price, UnitPrice = catalogItem.Price,
Quantity = bitem.Quantity Quantity = bitem.Quantity
}); });
} }
else
{
itemInBasket.Quantity = bitem.Quantity;
}
}
await _basket.UpdateAsync(basket); await _basket.UpdateAsync(basket);
@ -123,7 +141,7 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Controllers
{ {
UnitPrice = item.Price, UnitPrice = item.Price,
PictureUrl = item.PictureUri, PictureUrl = item.PictureUri,
ProductId = item.Id.ToString(), ProductId = item.Id,
ProductName = item.Name, ProductName = item.Name,
Quantity = data.Quantity, Quantity = data.Quantity,
Id = Guid.NewGuid().ToString() Id = Guid.NewGuid().ToString()

View File

@ -8,6 +8,7 @@ using System.Linq;
using System.Net; using System.Net;
using System.Threading.Tasks; using System.Threading.Tasks;
using Serilog; using Serilog;
using Newtonsoft.Json;
namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Controllers namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Controllers
{ {
@ -31,8 +32,6 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Controllers
[ProducesResponseType(typeof(BasketData), (int)HttpStatusCode.OK)] [ProducesResponseType(typeof(BasketData), (int)HttpStatusCode.OK)]
public async Task<ActionResult<BasketData>> UpdateAllBasketAsync([FromBody] UpdateBasketRequest data) public async Task<ActionResult<BasketData>> UpdateAllBasketAsync([FromBody] UpdateBasketRequest data)
{ {
Log.Debug("UpdateAllBasketAsync");
if (data.Items == null || !data.Items.Any()) if (data.Items == null || !data.Items.Any())
{ {
return BadRequest("Need to pass at least one basket line"); return BadRequest("Need to pass at least one basket line");
@ -40,13 +39,20 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Controllers
// Retrieve the current basket // Retrieve the current basket
var basket = await _basket.GetById(data.BuyerId) ?? new BasketData(data.BuyerId); var basket = await _basket.GetById(data.BuyerId) ?? new BasketData(data.BuyerId);
Log.Debug("get basket by id response={@response}", basket);
var catalogItems = await _catalog.GetCatalogItemsAsync(data.Items.Select(x => x.ProductId)); var catalogItems = await _catalog.GetCatalogItemsAsync(data.Items.Select(x => x.ProductId));
Log.Debug("get catalog items response={@response}", catalogItems);
foreach (var bitem in data.Items) // group by product id to avoid duplicates
var itemsCalculated = data
.Items
.GroupBy(x => x.ProductId, x => x, (k, i) => new { productId = k, items = i })
.Select(groupedItem =>
{
var item = groupedItem.items.First();
item.Quantity = groupedItem.items.Sum(i => i.Quantity);
return item;
});
foreach (var bitem in itemsCalculated)
{ {
var catalogItem = catalogItems.SingleOrDefault(ci => ci.Id == bitem.ProductId); var catalogItem = catalogItems.SingleOrDefault(ci => ci.Id == bitem.ProductId);
if (catalogItem == null) if (catalogItem == null)
@ -54,16 +60,24 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Controllers
return BadRequest($"Basket refers to a non-existing catalog item ({bitem.ProductId})"); return BadRequest($"Basket refers to a non-existing catalog item ({bitem.ProductId})");
} }
var itemInBasket = basket.Items.FirstOrDefault(x => x.ProductId == bitem.ProductId);
if (itemInBasket == null)
{
basket.Items.Add(new BasketDataItem() basket.Items.Add(new BasketDataItem()
{ {
Id = bitem.Id, Id = bitem.Id,
ProductId = catalogItem.Id.ToString(), ProductId = catalogItem.Id,
ProductName = catalogItem.Name, ProductName = catalogItem.Name,
PictureUrl = catalogItem.PictureUri, PictureUrl = catalogItem.PictureUri,
UnitPrice = catalogItem.Price, UnitPrice = catalogItem.Price,
Quantity = bitem.Quantity Quantity = bitem.Quantity
}); });
} }
else
{
itemInBasket.Quantity = bitem.Quantity;
}
}
await _basket.UpdateAsync(basket); await _basket.UpdateAsync(basket);
@ -124,8 +138,7 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Controllers
// Step 2: Get current basket status // Step 2: Get current basket status
var currentBasket = (await _basket.GetById(data.BasketId)) ?? new BasketData(data.BasketId); var currentBasket = (await _basket.GetById(data.BasketId)) ?? new BasketData(data.BasketId);
// Step 3: Search if exist product into basket // Step 3: Search if exist product into basket
var product = currentBasket.Items.SingleOrDefault(i => i.ProductId == item.Id.ToString()); var product = currentBasket.Items.SingleOrDefault(i => i.ProductId == item.Id);
if (product != null) if (product != null)
{ {
// Step 4: Update quantity for product // Step 4: Update quantity for product
@ -138,7 +151,7 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Controllers
{ {
UnitPrice = item.Price, UnitPrice = item.Price,
PictureUrl = item.PictureUri, PictureUrl = item.PictureUri,
ProductId = item.Id.ToString(), ProductId = item.Id,
ProductName = item.Name, ProductName = item.Name,
Quantity = data.Quantity, Quantity = data.Quantity,
Id = Guid.NewGuid().ToString() Id = Guid.NewGuid().ToString()