in UnicornStore/Controllers/CheckoutController.cs [38:85]
public async Task<IActionResult> AddressAndPayment(
[FromServices] UnicornStoreContext dbContext,
[FromForm] Order order,
CancellationToken requestAborted)
{
if (!ModelState.IsValid)
{
return View(order);
}
var formCollection = await HttpContext.Request.ReadFormAsync();
try
{
if (string.Equals(formCollection["PromoCode"].FirstOrDefault(), PromoCode,
StringComparison.OrdinalIgnoreCase) == false)
{
return View(order);
}
else
{
order.Username = HttpContext.User.Identity.Name;
order.OrderDate = DateTime.Now;
//Add the Order
// TODO: investigate why intermediary SaveChangesAsync() is necessary.
await dbContext.Orders.AddAsync(order);
await dbContext.SaveChangesAsync();
//Process the order
var cart = ShoppingCart.GetCart(dbContext, HttpContext);
await cart.CreateOrder(order);
// Save all changes
await dbContext.SaveChangesAsync(requestAborted);
_logger.LogInformation("User {userName} started checkout of {orderId}.", order.Username, order.OrderId);
return RedirectToAction("Complete", new { id = order.OrderId });
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Checkout failed");
//Invalid - redisplay with errors
return View(order);
}
}