Cleaning up Checkout auth (#64)

This commit is contained in:
Steve Smith
2017-10-23 13:51:27 -04:00
committed by GitHub
parent 749a37d6d9
commit 4a549c3401
7 changed files with 92 additions and 27 deletions

View File

@@ -17,7 +17,6 @@ namespace Microsoft.eShopWeb.Controllers
public class BasketController : Controller public class BasketController : Controller
{ {
private readonly IBasketService _basketService; private readonly IBasketService _basketService;
private const string _basketSessionKey = "basketId";
private readonly IUriComposer _uriComposer; private readonly IUriComposer _uriComposer;
private readonly SignInManager<ApplicationUser> _signInManager; private readonly SignInManager<ApplicationUser> _signInManager;
private readonly IAppLogger<BasketController> _logger; private readonly IAppLogger<BasketController> _logger;

View File

@@ -1,4 +1,5 @@
@page @page
@model CheckoutModel
@{ @{
ViewData["Title"] = "Checkout Complete"; ViewData["Title"] = "Checkout Complete";
} }

View File

@@ -0,0 +1,85 @@
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 CheckoutModel : PageModel
{
private readonly IBasketService _basketService;
private readonly IUriComposer _uriComposer;
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly IOrderService _orderService;
private string _username = null;
private readonly IBasketViewModelService _basketViewModelService;
public CheckoutModel(IBasketService basketService,
IBasketViewModelService basketViewModelService,
IUriComposer uriComposer,
SignInManager<ApplicationUser> signInManager,
IOrderService orderService)
{
_basketService = basketService;
_uriComposer = uriComposer;
_signInManager = signInManager;
_orderService = orderService;
_basketViewModelService = basketViewModelService;
}
public BasketViewModel BasketModel { get; set; } = new BasketViewModel();
public void OnGet()
{
}
public async Task<IActionResult> OnPost(Dictionary<string,int> 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();
}
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);
}
}
}

View File

@@ -69,7 +69,7 @@
<section class="esh-basket-item col-xs-push-8 col-xs-4"> <section class="esh-basket-item col-xs-push-8 col-xs-4">
<button class="btn esh-basket-checkout" name="updatebutton" value="" type="submit" <button class="btn esh-basket-checkout" name="updatebutton" value="" type="submit"
asp-page-handler="Update">[ Update ]</button> asp-page-handler="Update">[ Update ]</button>
<input type="submit" asp-page-handler="Checkout" <input type="submit" asp-page="Checkout"
class="btn esh-basket-checkout" class="btn esh-basket-checkout"
value="[ Checkout ]" name="action" /> value="[ Checkout ]" name="action" />
</section> </section>

View File

@@ -9,7 +9,6 @@ using Infrastructure.Identity;
using System; using System;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using System.Collections.Generic; using System.Collections.Generic;
using ApplicationCore.Entities.OrderAggregate;
namespace Microsoft.eShopWeb.RazorPages.Pages.Basket namespace Microsoft.eShopWeb.RazorPages.Pages.Basket
{ {
@@ -19,23 +18,17 @@ namespace Microsoft.eShopWeb.RazorPages.Pages.Basket
private const string _basketSessionKey = "basketId"; private const string _basketSessionKey = "basketId";
private readonly IUriComposer _uriComposer; private readonly IUriComposer _uriComposer;
private readonly SignInManager<ApplicationUser> _signInManager; private readonly SignInManager<ApplicationUser> _signInManager;
private readonly IAppLogger<IndexModel> _logger;
private readonly IOrderService _orderService;
private string _username = null; private string _username = null;
private readonly IBasketViewModelService _basketViewModelService; private readonly IBasketViewModelService _basketViewModelService;
public IndexModel(IBasketService basketService, public IndexModel(IBasketService basketService,
IBasketViewModelService basketViewModelService, IBasketViewModelService basketViewModelService,
IUriComposer uriComposer, IUriComposer uriComposer,
SignInManager<ApplicationUser> signInManager, SignInManager<ApplicationUser> signInManager)
IAppLogger<IndexModel> logger,
IOrderService orderService)
{ {
_basketService = basketService; _basketService = basketService;
_uriComposer = uriComposer; _uriComposer = uriComposer;
_signInManager = signInManager; _signInManager = signInManager;
_logger = logger;
_orderService = orderService;
_basketViewModelService = basketViewModelService; _basketViewModelService = basketViewModelService;
} }
@@ -69,19 +62,6 @@ namespace Microsoft.eShopWeb.RazorPages.Pages.Basket
await SetBasketModelAsync(); await SetBasketModelAsync();
} }
public async Task<IActionResult> OnPostCheckout(Dictionary<string,int> 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() private async Task SetBasketModelAsync()
{ {
if (_signInManager.IsSignedIn(HttpContext.User)) if (_signInManager.IsSignedIn(HttpContext.User))

View File

@@ -108,6 +108,7 @@ namespace Microsoft.eShopWeb.RazorPages
.AddRazorPagesOptions(options => .AddRazorPagesOptions(options =>
{ {
options.Conventions.AuthorizeFolder("/Order"); options.Conventions.AuthorizeFolder("/Order");
options.Conventions.AuthorizePage("/Basket/Checkout");
}); });
_services = services; _services = services;

View File

@@ -1,9 +1,8 @@
using System.IO; using Microsoft.eShopWeb.ViewModels;
using Xunit;
using System.Threading.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
using Microsoft.eShopWeb.ViewModels;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using Xunit;
namespace FunctionalTests.Web.Controllers namespace FunctionalTests.Web.Controllers
{ {