using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.eShopWeb.RazorPages.ViewModels; using Microsoft.eShopWeb.RazorPages.Interfaces; using ApplicationCore.Interfaces; using Microsoft.AspNetCore.Identity; using Infrastructure.Identity; using System; using Microsoft.AspNetCore.Http; using System.Collections.Generic; using ApplicationCore.Entities.OrderAggregate; namespace Microsoft.eShopWeb.RazorPages.Pages.Basket { public class IndexModel : PageModel { private readonly IBasketService _basketService; private const string _basketSessionKey = "basketId"; private readonly IUriComposer _uriComposer; private readonly SignInManager _signInManager; private readonly IAppLogger _logger; private readonly IOrderService _orderService; private string _username = null; private readonly IBasketViewModelService _basketViewModelService; public IndexModel(IBasketService basketService, IBasketViewModelService basketViewModelService, IUriComposer uriComposer, SignInManager signInManager, IAppLogger logger, IOrderService orderService) { _basketService = basketService; _uriComposer = uriComposer; _signInManager = signInManager; _logger = logger; _orderService = orderService; _basketViewModelService = basketViewModelService; } public BasketViewModel BasketModel { get; set; } = new BasketViewModel(); public async Task OnGet() { await SetBasketModelAsync(); } public async Task OnPost(CatalogItemViewModel productDetails) { if (productDetails?.Id == null) { return RedirectToPage("/Index"); } await SetBasketModelAsync(); await _basketService.AddItemToBasket(BasketModel.Id, productDetails.Id, productDetails.Price, 1); await SetBasketModelAsync(); return RedirectToPage(); } public async Task OnPostUpdate(Dictionary items) { await SetBasketModelAsync(); await _basketService.SetQuantities(BasketModel.Id, items); await SetBasketModelAsync(); } public async Task OnPostCheckout(Dictionary items) { await SetBasketModelAsync(); await _basketService.SetQuantities(BasketModel.Id, items); await _orderService.CreateOrderAsync(BasketModel.Id, new Address("123 Main St.", "Kent", "OH", "United States", "44240")); await _basketService.DeleteBasketAsync(BasketModel.Id); return RedirectToPage("/Basket/CheckoutComplete"); } private async Task SetBasketModelAsync() { if (_signInManager.IsSignedIn(HttpContext.User)) { BasketModel = await _basketViewModelService.GetOrCreateBasketForUser(User.Identity.Name); } else { GetOrSetBasketCookieAndUserName(); BasketModel = await _basketViewModelService.GetOrCreateBasketForUser(_username); } } private void GetOrSetBasketCookieAndUserName() { if (Request.Cookies.ContainsKey(Constants.BASKET_COOKIENAME)) { _username = Request.Cookies[Constants.BASKET_COOKIENAME]; } if (_username != null) return; _username = Guid.NewGuid().ToString(); var cookieOptions = new CookieOptions(); cookieOptions.Expires = DateTime.Today.AddYears(10); Response.Cookies.Append(Constants.BASKET_COOKIENAME, _username, cookieOptions); } } }