public async Task AddressAndPayment()

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);
            }
        }