using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.eShopWeb.ApplicationCore.Entities;
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
using Microsoft.eShopWeb.Web.Interfaces;
using Microsoft.eShopWeb.Web.ViewModels;
namespace Microsoft.eShopWeb.Web.Pages.Basket;
public class IndexModel : PageModel
{
private readonly IBasketService _basketService;
private readonly IBasketViewModelService _basketViewModelService;
private readonly IRepository<CatalogItem> _itemRepository;
public IndexModel(IBasketService basketService,
IBasketViewModelService basketViewModelService,
IRepository<CatalogItem> itemRepository)
{
_basketService = basketService;
_basketViewModelService = basketViewModelService;
_itemRepository = itemRepository;
}
public BasketViewModel BasketModel { get; set; } = new BasketViewModel();
public async Task OnGet()
{
BasketModel = await _basketViewModelService.GetOrCreateBasketForUser(GetOrSetBasketCookieAndUserName());
}
public async Task<IActionResult> OnPost(CatalogItemViewModel productDetails)
{
if (productDetails?.Id == null)
{
return RedirectToPage("/Index");
}
var item = await _itemRepository.GetByIdAsync(productDetails.Id);
if (item == null)
{
return RedirectToPage("/Index");
}
var username = GetOrSetBasketCookieAndUserName();
var basket = await _basketService.AddItemToBasket(username, productDetails.Id, item.Price);
BasketModel = await _basketViewModelService.Map(basket);
return RedirectToPage();
}
public async Task OnPostUpdate(IEnumerable<BasketItemViewModel> items)
{
if (!ModelState.IsValid)
{
return;
}
var basketView = await _basketViewModelService.GetOrCreateBasketForUser(GetOrSetBasketCookieAndUserName());
var updateModel = items.ToDictionary(b => b.Id.ToString(), b => b.Quantity);
var basket = await _basketService.SetQuantities(basketView.Id, updateModel);
BasketModel = await _basketViewModelService.Map(basket);
}
private Username GetOrSetBasketCookieAndUserName()
{
string userName = null;
if (Request.HttpContext.User.Identity.IsAuthenticated)
{
return new Username(Request.HttpContext.User.Identity.Name);
}
if (Request.Cookies.ContainsKey(Constants.BASKET_COOKIENAME))
{
userName = Request.Cookies[Constants.BASKET_COOKIENAME];
if (!Request.HttpContext.User.Identity.IsAuthenticated)
{
if (!Guid.TryParse(userName, out var _))
{
userName = null;
}
}
}
if (userName != null)
{
return new Username(userName);
}
userName = Guid.NewGuid().ToString();
var cookieOptions = new CookieOptions { IsEssential = true };
cookieOptions.Expires = DateTime.Today.AddYears(10);
Response.Cookies.Append(Constants.BASKET_COOKIENAME, userName, cookieOptions);
return new Username(userName);
}
}