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 namespace Microsoft.eShopWeb.Controllers
{ {
[Route("[controller]/[action]")]
public class AccountController : Controller public class AccountController : Controller
{ {
private readonly UserManager<ApplicationUser> _userManager; private readonly UserManager<ApplicationUser> _userManager;
@@ -58,6 +59,16 @@ namespace Microsoft.eShopWeb.Controllers
return View(model); 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) private IActionResult RedirectToLocal(string returnUrl)
{ {
if (Url.IsLocalUrl(returnUrl)) if (Url.IsLocalUrl(returnUrl))

View File

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

View File

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

View File

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

View File

@@ -1,9 +1,7 @@
using ApplicationCore.Interfaces; using ApplicationCore.Interfaces;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.eShopWeb.ApplicationCore.Entities; using Microsoft.eShopWeb.ApplicationCore.Entities;
using Microsoft.EntityFrameworkCore;
using System; using System;
using Infrastructure.Data;
using System.Linq; using System.Linq;
using Microsoft.eShopWeb.ViewModels; using Microsoft.eShopWeb.ViewModels;
using System.Collections.Generic; using System.Collections.Generic;
@@ -82,5 +80,14 @@ namespace Web.Services
_basketRepository.Update(basket); _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.UseIdentity();
app.UseMvc(routes => app.UseMvc();
{
routes.MapRoute(
name: "default",
template: "{controller=Catalog}/{action=Index}/{id?}");
});
} }
public void ConfigureDevelopment(IApplicationBuilder app, 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,6 +13,7 @@
@if (Model.Items.Any()) @if (Model.Items.Any())
{ {
<form method="post">
<article class="esh-basket-titles row"> <article class="esh-basket-titles row">
<br /> <br />
<section class="esh-basket-title col-xs-3">Product</section> <section class="esh-basket-title col-xs-3">Product</section>
@@ -59,18 +60,19 @@
<article class="esh-basket-items row"> <article class="esh-basket-items row">
<section class="esh-basket-item col-xs-7"></section> <section class="esh-basket-item col-xs-7"></section>
<section class="esh-basket-item col-xs-2"> <section class="esh-basket-item col-xs-2">
<button class="btn esh-basket-checkout" name="name" value="" type="submit">[ Update ]</button> @*<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> </section>
</article> </article>
</div> </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 else
{ {

View File

@@ -30,6 +30,7 @@
</a> </a>
</section> </section>
@await Html.PartialAsync("_LoginPartial") @await Html.PartialAsync("_LoginPartial")
<section class="col-lg-1 col-xs-12"><a asp-controller="Cart" asp-action="Index">Cart</a></section>
</article> </article>
</div> </div>
@@ -47,7 +48,7 @@
</section> </section>
<section class="col-sm-6"> <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> </section>
</article> </article>

View File

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