Controller cleanup (#30)

* Cleaning up routes.

* Adding signout functionality

* Added simple checkout behavior
This commit is contained in:
Steve Smith
2017-08-07 14:12:48 -04:00
committed by GitHub
parent 4385c2f291
commit 97ef1c79a0
10 changed files with 125 additions and 86 deletions

View File

@@ -8,6 +8,7 @@ using Infrastructure.Identity;
namespace Microsoft.eShopWeb.Controllers
{
[Route("[controller]/[action]")]
public class AccountController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
@@ -17,7 +18,7 @@ namespace Microsoft.eShopWeb.Controllers
public AccountController(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
IOptions<IdentityCookieOptions> identityCookieOptions
IOptions<IdentityCookieOptions> identityCookieOptions
)
{
@@ -58,6 +59,16 @@ namespace Microsoft.eShopWeb.Controllers
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> SignOut()
{
HttpContext.Session.Clear();
await _signInManager.SignOutAsync();
return RedirectToAction(nameof(CatalogController.Index), "Catalog");
}
private IActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))

View File

@@ -1,43 +1,36 @@
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using ApplicationCore.Interfaces;
using Microsoft.eShopWeb.ApplicationCore.Entities;
using Microsoft.AspNetCore.Http;
using Microsoft.eShopWeb.ViewModels;
using System.Linq;
namespace Microsoft.eShopWeb.Controllers
{
[Route("[controller]/[action]")]
public class CartController : Controller
{
private readonly IBasketService _basketService;
//private readonly IIdentityParser<ApplicationUser> _appUserParser;
private const string _basketSessionKey = "basketId";
private readonly IUriComposer _uriComposer;
public CartController(IBasketService basketService,
IUriComposer uriComposer)
// IIdentityParser<ApplicationUser> appUserParser)
{
_basketService = basketService;
_uriComposer = uriComposer;
// _appUserParser = appUserParser;
}
// GET: /<controller>/
[HttpGet]
public async Task<IActionResult> Index()
{
//var user = _appUserParser.Parse(HttpContext.User);
var basketModel = await GetBasketFromSessionAsync();
return View(basketModel);
}
// GET: /Cart/AddToCart
// TODO: This should be a POST.
public async Task<IActionResult> AddToCart(CatalogItem productDetails)
// POST: /Cart/AddToCart
[HttpPost]
public async Task<IActionResult> AddToCart(CatalogItemViewModel productDetails)
{
if (productDetails?.Id == null)
{
@@ -50,6 +43,16 @@ namespace Microsoft.eShopWeb.Controllers
return RedirectToAction("Index");
}
[HttpPost]
public async Task<IActionResult> Checkout()
{
var basket = await GetBasketFromSessionAsync();
await _basketService.Checkout(basket.Id);
return View("Checkout");
}
private async Task<BasketViewModel> GetBasketFromSessionAsync()
{
string basketId = HttpContext.Session.GetString(_basketSessionKey);

View File

@@ -4,13 +4,15 @@ using System.Threading.Tasks;
namespace Microsoft.eShopWeb.Controllers
{
[Route("")]
public class CatalogController : Controller
{
private readonly ICatalogService _catalogService;
public CatalogController(ICatalogService catalogService) => _catalogService = catalogService;
// GET: /<controller>/
[HttpGet]
[HttpPost]
public async Task<IActionResult> Index(int? brandFilterApplied, int? typesFilterApplied, int? page)
{
var itemsPage = 10;
@@ -18,6 +20,7 @@ namespace Microsoft.eShopWeb.Controllers
return View(catalogModel);
}
[HttpGet("Error")]
public IActionResult Error()
{
return View();

View File

@@ -10,5 +10,7 @@ namespace ApplicationCore.Interfaces
Task<BasketViewModel> CreateBasketForUser(string userId);
Task AddItemToBasket(int basketId, int catalogItemId, decimal price, int quantity);
Task Checkout(int basketId);
}
}

View File

@@ -1,9 +1,7 @@
using ApplicationCore.Interfaces;
using System.Threading.Tasks;
using Microsoft.eShopWeb.ApplicationCore.Entities;
using Microsoft.EntityFrameworkCore;
using System;
using Infrastructure.Data;
using System.Linq;
using Microsoft.eShopWeb.ViewModels;
using System.Collections.Generic;
@@ -82,5 +80,14 @@ namespace Web.Services
_basketRepository.Update(basket);
}
public async Task Checkout(int basketId)
{
var basket = _basketRepository.GetById(basketId);
// TODO: Actually Process the order
_basketRepository.Delete(basket);
}
}
}

View File

@@ -132,13 +132,7 @@ namespace Microsoft.eShopWeb
app.UseIdentity();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Catalog}/{action=Index}/{id?}");
});
app.UseMvc();
}
public void ConfigureDevelopment(IApplicationBuilder app,

View File

@@ -0,0 +1,16 @@
@using Microsoft.eShopWeb.ViewModels
@{
ViewData["Title"] = "Checkout Complete";
@model BasketViewModel
}
<section class="esh-catalog-hero">
<div class="container">
<img class="esh-catalog-title" src="../images/main_banner_text.png" />
</div>
</section>
<div class="container">
<h1>Thanks for your Order!</h1>
<a asp-controller="Catalog" asp-action="Index">Continue Shopping...</a>
</div>

View File

@@ -13,64 +13,66 @@
@if (Model.Items.Any())
{
<article class="esh-basket-titles row">
<br />
<section class="esh-basket-title col-xs-3">Product</section>
<section class="esh-basket-title col-xs-3 hidden-lg-down"></section>
<section class="esh-basket-title col-xs-2">Price</section>
<section class="esh-basket-title col-xs-2">Quantity</section>
<section class="esh-basket-title col-xs-2">Cost</section>
</article>
<div class="esh-catalog-items row">
@foreach (var item in Model.Items)
{
<article class="esh-basket-items row">
<div>
<section class="esh-basket-item esh-basket-item--middle col-lg-3 hidden-lg-down">
<img class="esh-basket-image" src="@item.PictureUrl" />
</section>
<section class="esh-basket-item esh-basket-item--middle col-xs-3">@item.ProductName</section>
<section class="esh-basket-item esh-basket-item--middle col-xs-2">$ @item.UnitPrice.ToString("N2")</section>
<section class="esh-basket-item esh-basket-item--middle col-xs-2">
<input type="hidden" name="@("quantities[" + item.Id +"].Key")" value="@item.Id" />
<input type="number" class="esh-basket-input" min="1" name="@("quantities[" + item.Id +"].Value")" value="@item.Quantity" />
</section>
<section class="esh-basket-item esh-basket-item--middle esh-basket-item--mark col-xs-2">$ @Math.Round(item.Quantity * item.UnitPrice, 2).ToString("N2")</section>
<form method="post">
<article class="esh-basket-titles row">
<br />
<section class="esh-basket-title col-xs-3">Product</section>
<section class="esh-basket-title col-xs-3 hidden-lg-down"></section>
<section class="esh-basket-title col-xs-2">Price</section>
<section class="esh-basket-title col-xs-2">Quantity</section>
<section class="esh-basket-title col-xs-2">Cost</section>
</article>
<div class="esh-catalog-items row">
@foreach (var item in Model.Items)
{
<article class="esh-basket-items row">
<div>
<section class="esh-basket-item esh-basket-item--middle col-lg-3 hidden-lg-down">
<img class="esh-basket-image" src="@item.PictureUrl" />
</section>
<section class="esh-basket-item esh-basket-item--middle col-xs-3">@item.ProductName</section>
<section class="esh-basket-item esh-basket-item--middle col-xs-2">$ @item.UnitPrice.ToString("N2")</section>
<section class="esh-basket-item esh-basket-item--middle col-xs-2">
<input type="hidden" name="@("quantities[" + item.Id +"].Key")" value="@item.Id" />
<input type="number" class="esh-basket-input" min="1" name="@("quantities[" + item.Id +"].Value")" value="@item.Quantity" />
</section>
<section class="esh-basket-item esh-basket-item--middle esh-basket-item--mark col-xs-2">$ @Math.Round(item.Quantity * item.UnitPrice, 2).ToString("N2")</section>
</div>
<div class="row">
</div>
</article>
@*<div class="esh-catalog-item col-md-4">
@item.ProductId
</div>*@
<div class="container">
<article class="esh-basket-titles esh-basket-titles--clean row">
<section class="esh-basket-title col-xs-10"></section>
<section class="esh-basket-title col-xs-2">Total</section>
</article>
<article class="esh-basket-items row">
<section class="esh-basket-item col-xs-10"></section>
<section class="esh-basket-item esh-basket-item--mark col-xs-2">$ @Model.Total()</section>
</article>
<article class="esh-basket-items row">
<section class="esh-basket-item col-xs-7"></section>
<section class="esh-basket-item col-xs-2">
@*<button class="btn esh-basket-checkout" name="name" value="" type="submit">[ Update ]</button>*@
</section>
</article>
</div>
<div class="row">
</div>
</article>
@*<div class="esh-catalog-item col-md-4">
@item.ProductId
</div>*@
<div class="container">
<article class="esh-basket-titles esh-basket-titles--clean row">
<section class="esh-basket-title col-xs-10"></section>
<section class="esh-basket-title col-xs-2">Total</section>
</article>
<article class="esh-basket-items row">
<section class="esh-basket-item col-xs-10"></section>
<section class="esh-basket-item esh-basket-item--mark col-xs-2">$ @Model.Total()</section>
</article>
<article class="esh-basket-items row">
<section class="esh-basket-item col-xs-7"></section>
<section class="esh-basket-item col-xs-2">
<button class="btn esh-basket-checkout" name="name" value="" type="submit">[ Update ]</button>
</section>
<section class="esh-basket-item col-xs-3">
<input type="submit"
class="btn esh-basket-checkout"
value="[ Checkout ]" name="action" />
</section>
</article>
</div>
}
</div>
}
<section class="esh-basket-item col-xs-push-9 col-xs-3">
<input type="submit" asp-action="Checkout"
class="btn esh-basket-checkout"
value="[ Checkout ]" name="action" />
</section>
</div>
</form>
}
else
{

View File

@@ -30,6 +30,7 @@
</a>
</section>
@await Html.PartialAsync("_LoginPartial")
<section class="col-lg-1 col-xs-12"><a asp-controller="Cart" asp-action="Index">Cart</a></section>
</article>
</div>
@@ -47,7 +48,7 @@
</section>
<section class="col-sm-6">
<div class="esh-app-footer-text hidden-xs"> e-ShoponContainers. All right reserved </div>
<div class="esh-app-footer-text hidden-xs"> e-ShopOnWeb. All right reserved </div>
</section>
</article>

View File

@@ -14,13 +14,13 @@
<section class="esh-identity-drop">
<a class="esh-identity-item"
@*<a class="esh-identity-item"
asp-controller="Order"
asp-action="Index">
<div class="esh-identity-name esh-identity-name--upper">My orders</div>
<img class="esh-identity-image" src="~/images/my_orders.png">
</a>
</a>*@
<a class="esh-identity-item"
href="javascript:document.getElementById('logoutForm').submit()">
@@ -33,9 +33,9 @@
</div>
</section>
<section class="col-lg-1 col-xs-12">
@*@await Component.InvokeAsync("Cart", new { user = UserManager.Parse(User) })*@
</section>
@*<section class="col-lg-1 col-xs-12">
@await Component.InvokeAsync("Cart", new { user = UserManager.Parse(User) })
</section>*@
}
else
@@ -53,5 +53,5 @@ else
</div>
</section>
<section class="col-lg-1 col-xs-12"></section>
@*<section class="col-lg-1 col-xs-12"></section>*@
}