Breaking 05_03 in twain

This commit is contained in:
Jess Chadwick
2018-06-11 01:44:36 -04:00
parent 20458e435e
commit cedb4e8f46
299 changed files with 61234 additions and 85 deletions

View File

@ -58,6 +58,7 @@
<Compile Include="Models\ShoppingCart.cs" /> <Compile Include="Models\ShoppingCart.cs" />
<Compile Include="Models\ShoppingCartItem.cs" /> <Compile Include="Models\ShoppingCartItem.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Requests\UpdateProductRequest.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="App.config" /> <None Include="App.config" />

View File

@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace HPlusSports.Models namespace HPlusSports.Requests
{ {
public class UpdateProductRequest public class UpdateProductRequest
{ {
@ -34,4 +34,4 @@ namespace HPlusSports.Models
public string LastUpdatedUserId { get; set; } public string LastUpdatedUserId { get; set; }
} }
} }

View File

@ -1,7 +1,8 @@
using HPlusSports.Models; using System;
using System;
using System.Linq; using System.Linq;
using System.Web.Mvc; using System.Web.Mvc;
using HPlusSports.Models;
using HPlusSports.Requests;
namespace HPlusSports.Controllers namespace HPlusSports.Controllers
{ {
@ -10,11 +11,6 @@ namespace HPlusSports.Controllers
{ {
private HPlusSportsDbContext _context; private HPlusSportsDbContext _context;
public InventoryController()
: this(new HPlusSportsDbContext())
{
}
public InventoryController(HPlusSportsDbContext context) public InventoryController(HPlusSportsDbContext context)
{ {
_context = context; _context = context;
@ -35,7 +31,6 @@ namespace HPlusSports.Controllers
{ {
return View(); return View();
} }
[HttpPost] [HttpPost]
public ActionResult Create(CreateProductRequest request) public ActionResult Create(CreateProductRequest request)
{ {
@ -44,7 +39,8 @@ namespace HPlusSports.Controllers
return View(); return View();
} }
var product = new Product { var product = new Product
{
CategoryId = request.CategoryId, CategoryId = request.CategoryId,
Description = request.Description, Description = request.Description,
MSRP = request.MSRP, MSRP = request.MSRP,
@ -59,8 +55,7 @@ namespace HPlusSports.Controllers
_context.Products.Add(product); _context.Products.Add(product);
_context.SaveChanges(); _context.SaveChanges();
TempData["SuccessMessage"] = TempData.SuccessMessage($"Successfully created \"{product.Name}\"");
$"Successfully created \"{product.Name}\"";
return RedirectToAction(nameof(Index)); return RedirectToAction(nameof(Index));
} }
@ -72,43 +67,41 @@ namespace HPlusSports.Controllers
if (existing == null) if (existing == null)
{ {
return ProductListError( TempData.ErrorMessage($"Couldn't update product #\"{id}\": product not found!");
$"Couldn't update product #\"{id}\": product not found!"
);
} }
return View(existing); return View(existing);
} }
[HttpPost] [HttpPost]
public ActionResult Update(long id, Product product) public ActionResult Update(UpdateProductRequest request)
{ {
if (!ModelState.IsValid) if (!ModelState.IsValid)
{ {
return View(); return View();
} }
var existing = _context.Products.Find(id); request.LastUpdatedUserId = GetUserId(this);
var existing = _context.Products.Find(request.Id);
if (existing == null) if (existing == null)
{ {
return ProductListError( TempData.ErrorMessage($"Couldn't update product #\"{request.Id}\": product not found!");
$"Couldn't update product #\"{id}\": product not found!" return View();
);
} }
var hasPriceChanged = existing.Price != product.Price; var hasPriceChanged = existing.Price != request.Price;
existing.CategoryId = product.CategoryId; existing.CategoryId = request.CategoryId;
existing.Description = product.Description; existing.Description = request.Description;
existing.MSRP = product.MSRP; existing.MSRP = request.MSRP;
existing.Name = product.Name; existing.Name = request.Name;
existing.Price = product.Price; existing.Price = request.Price;
existing.SKU = product.SKU; existing.SKU = request.SKU;
existing.Summary = product.Summary; existing.Summary = request.Summary;
existing.LastUpdated = DateTime.UtcNow; existing.LastUpdated = DateTime.UtcNow;
existing.LastUpdatedUserId = GetUserId(this);
_context.SaveChanges(); _context.SaveChanges();
@ -117,13 +110,13 @@ namespace HPlusSports.Controllers
var cartsToUpdate = var cartsToUpdate =
_context.ShoppingCarts _context.ShoppingCarts
.Include("Items") .Include("Items")
.Where(cart => cart.Items.Any(x => x.SKU == product.SKU)); .Where(cart => cart.Items.Any(x => x.SKU == request.SKU));
foreach (var cart in cartsToUpdate) foreach (var cart in cartsToUpdate)
{ {
foreach (var cartItem in cart.Items.Where(x => x.SKU == product.SKU)) foreach (var cartItem in cart.Items.Where(x => x.SKU == request.SKU))
{ {
cartItem.Price = product.Price; cartItem.Price = request.Price;
} }
cart.Recalculate(); cart.Recalculate();
@ -132,8 +125,7 @@ namespace HPlusSports.Controllers
_context.SaveChanges(); _context.SaveChanges();
TempData["SuccessMessage"] = TempData.SuccessMessage($"Successfully updated \"{request.Name}\"");
$"Successfully updated \"{product.Name}\"";
return RedirectToAction(nameof(Index)); return RedirectToAction(nameof(Index));
} }

View File

@ -7,8 +7,19 @@ namespace HPlusSports
{ {
public static class TempDataExtensions public static class TempDataExtensions
{ {
const string ErrorMessageKey = "ErrorMessage";
const string SuccessMessageKey = "SuccessMessage"; const string SuccessMessageKey = "SuccessMessage";
public static string ErrorMessage(this System.Web.Mvc.TempDataDictionary tempData)
{
return tempData[ErrorMessageKey] as string;
}
public static void ErrorMessage(this System.Web.Mvc.TempDataDictionary tempData, string errorMessage)
{
tempData[ErrorMessageKey] = errorMessage;
}
public static string SuccessMessage(this System.Web.Mvc.TempDataDictionary tempData) public static string SuccessMessage(this System.Web.Mvc.TempDataDictionary tempData)
{ {
return tempData[SuccessMessageKey] as string; return tempData[SuccessMessageKey] as string;

View File

@ -57,8 +57,8 @@
<Compile Include="Models\Review.cs" /> <Compile Include="Models\Review.cs" />
<Compile Include="Models\ShoppingCart.cs" /> <Compile Include="Models\ShoppingCart.cs" />
<Compile Include="Models\ShoppingCartItem.cs" /> <Compile Include="Models\ShoppingCartItem.cs" />
<Compile Include="Requests\UpdateProductRequest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Requests\UpdateProductRequest.cs" />
<Compile Include="Services\ProductUpdateService.cs" /> <Compile Include="Services\ProductUpdateService.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -125,7 +125,7 @@ namespace HPlusSports
return return
Regex.Replace( Regex.Replace(
Regex.Replace( Regex.Replace(
source, source.Replace("<h2>Description</h2>", ""),
"<[^>]*>", "<[^>]*>",
"" ""
), ),

View File

@ -40,4 +40,4 @@ namespace HPlusSports.Requests
public string LastUpdatedUserId { get; set; } public string LastUpdatedUserId { get; set; }
} }
} }

View File

@ -1,9 +1,9 @@
using System; using HPlusSports.Requests;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using HPlusSports.Requests;
namespace HPlusSports.Services namespace HPlusSports.Services
{ {
@ -38,8 +38,8 @@ namespace HPlusSports.Services
existing.Price = request.Price; existing.Price = request.Price;
existing.SKU = request.SKU; existing.SKU = request.SKU;
existing.Summary = request.Summary; existing.Summary = request.Summary;
existing.LastUpdated = DateTime.UtcNow; existing.LastUpdated = DateTime.UtcNow;
existing.LastUpdatedUserId = request.LastUpdatedUserId;
_context.SaveChanges(); _context.SaveChanges();

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Mvc;
namespace HPlusSports.App_Start
{
public class Dependencies
{
public static void Register()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(Dependencies).Assembly);
builder.RegisterType<HPlusSportsDbContext>()
.InstancePerRequest();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
}

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@ -0,0 +1,175 @@
using System;
using System.Linq;
using System.Web.Mvc;
using HPlusSports.Models;
using HPlusSports.Requests;
namespace HPlusSports.Controllers
{
[Authorize(Roles = UserRoles.Admin)]
public class InventoryController : Controller
{
private HPlusSportsDbContext _context;
public InventoryController(HPlusSportsDbContext context)
{
_context = context;
}
public ActionResult Index()
{
var products =
_context.Products
.OrderBy(x => x.CategoryId)
.ThenBy(x => x.Name);
return View(products);
}
[HttpGet]
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(CreateProductRequest request)
{
if (!ModelState.IsValid)
{
return View();
}
var product = new Product
{
CategoryId = request.CategoryId,
Description = request.Description,
MSRP = request.MSRP,
Name = request.Name,
Price = request.Price,
SKU = request.SKU,
Summary = request.Summary,
LastUpdated = DateTime.UtcNow,
LastUpdatedUserId = GetUserId(this),
};
_context.Products.Add(product);
_context.SaveChanges();
TempData.SuccessMessage($"Successfully created \"{product.Name}\"");
return RedirectToAction(nameof(Index));
}
[HttpGet]
public ActionResult Update(long id)
{
var existing = _context.Products.Find(id);
if (existing == null)
{
TempData.ErrorMessage($"Couldn't update product #\"{id}\": product not found!");
}
return View(existing);
}
[HttpPost]
public ActionResult Update(UpdateProductRequest request)
{
if (!ModelState.IsValid)
{
return View();
}
request.LastUpdatedUserId = GetUserId(this);
var existing = _context.Products.Find(request.Id);
if (existing == null)
{
TempData.ErrorMessage($"Couldn't update product #\"{request.Id}\": product not found!");
return View();
}
var hasPriceChanged = existing.Price != request.Price;
existing.CategoryId = request.CategoryId;
existing.Description = request.Description;
existing.MSRP = request.MSRP;
existing.Name = request.Name;
existing.Price = request.Price;
existing.SKU = request.SKU;
existing.Summary = request.Summary;
existing.LastUpdated = DateTime.UtcNow;
_context.SaveChanges();
if (hasPriceChanged)
{
var cartsToUpdate =
_context.ShoppingCarts
.Include("Items")
.Where(cart => cart.Items.Any(x => x.SKU == request.SKU));
foreach (var cart in cartsToUpdate)
{
foreach (var cartItem in cart.Items.Where(x => x.SKU == request.SKU))
{
cartItem.Price = request.Price;
}
cart.Recalculate();
}
}
_context.SaveChanges();
TempData.SuccessMessage($"Successfully updated \"{request.Name}\"");
return RedirectToAction(nameof(Index));
}
public ActionResult Delete(long id)
{
var product = _context.Products.Find(id);
if (product == null)
{
return ProductListError(
$"Couldn't delete \"{product.Name}\": product not found!"
);
}
_context.Products.Remove(product);
_context.SaveChanges();
TempData["SuccessMessage"] =
$"Successfully deleted \"{product.Name}\"";
return RedirectToAction(nameof(Index));
}
private ActionResult ProductListError(string error)
{
TempData["ErrorMessage"] = error;
return RedirectToAction(nameof(Index));
}
protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
ViewData["CategoryId"] =
_context.Categories
.Select(x => new SelectListItem
{
Text = x.Name,
Value = x.Id.ToString(),
})
.ToArray();
}
// Overwriteable function for unit testing
internal Func<Controller, string> GetUserId =
(controller) => controller.User.Identity.Name;
}
}

View File

@ -10,9 +10,14 @@ namespace HPlusSports
const string ErrorMessageKey = "ErrorMessage"; const string ErrorMessageKey = "ErrorMessage";
const string SuccessMessageKey = "SuccessMessage"; const string SuccessMessageKey = "SuccessMessage";
public static bool HasSuccessMessage(this System.Web.Mvc.TempDataDictionary tempData) public static string ErrorMessage(this System.Web.Mvc.TempDataDictionary tempData)
{ {
return !string.IsNullOrWhiteSpace(tempData[SuccessMessageKey] as string); return tempData[ErrorMessageKey] as string;
}
public static void ErrorMessage(this System.Web.Mvc.TempDataDictionary tempData, string errorMessage)
{
tempData[ErrorMessageKey] = errorMessage;
} }
public static string SuccessMessage(this System.Web.Mvc.TempDataDictionary tempData) public static string SuccessMessage(this System.Web.Mvc.TempDataDictionary tempData)
@ -24,21 +29,5 @@ namespace HPlusSports
{ {
tempData[SuccessMessageKey] = successMessage; tempData[SuccessMessageKey] = successMessage;
} }
public static bool HasErrorMessage(this System.Web.Mvc.TempDataDictionary tempData)
{
return !string.IsNullOrWhiteSpace(tempData[ErrorMessageKey] as string);
}
public static string ErrorMessage(this System.Web.Mvc.TempDataDictionary tempData)
{
return tempData[ErrorMessageKey] as string;
}
public static void ErrorMessage(this System.Web.Mvc.TempDataDictionary tempData, string errorMessage)
{
tempData[ErrorMessageKey] = errorMessage;
}
} }
} }

View File

@ -4,18 +4,18 @@
ViewBag.Title = "Inventory"; ViewBag.Title = "Inventory";
} }
@if (TempData.HasSuccessMessage()) @if (TempData["SuccessMessage"] != null)
{ {
<div class="alert alert-error alert-dismissible" role="alert"> <div class="alert alert-error alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button> <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
@TempData.SuccessMessage() @TempData["SuccessMessage"]
</div> </div>
} }
else if (TempData.HasErrorMessage()) else if (TempData["ErrorMessage"] != null)
{ {
<div class="alert alert-error alert-dismissible" role="alert"> <div class="alert alert-error alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button> <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
@TempData.ErrorMessage() @TempData["ErrorMessage"]
</div> </div>
} }

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View File

@ -57,8 +57,8 @@
<Compile Include="Models\Review.cs" /> <Compile Include="Models\Review.cs" />
<Compile Include="Models\ShoppingCart.cs" /> <Compile Include="Models\ShoppingCart.cs" />
<Compile Include="Models\ShoppingCartItem.cs" /> <Compile Include="Models\ShoppingCartItem.cs" />
<Compile Include="Requests\UpdateProductRequest.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Requests\UpdateProductRequest.cs" />
<Compile Include="Services\ProductUpdateService.cs" /> <Compile Include="Services\ProductUpdateService.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -125,7 +125,7 @@ namespace HPlusSports
return return
Regex.Replace( Regex.Replace(
Regex.Replace( Regex.Replace(
source, source.Replace("<h2>Description</h2>", ""),
"<[^>]*>", "<[^>]*>",
"" ""
), ),

Some files were not shown because too many files have changed in this diff Show More