using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using UnicornStore.Models; using UnicornStore.ViewModels; namespace UnicornStore.Controllers { public class ShoppingCartController : Controller { private readonly ILogger<ShoppingCartController> _logger; public ShoppingCartController(UnicornStoreContext dbContext, ILogger<ShoppingCartController> logger) { DbContext = dbContext; _logger = logger; } public UnicornStoreContext DbContext { get; } // // GET: /ShoppingCart/ public async Task<IActionResult> Index() { var cart = ShoppingCart.GetCart(DbContext, HttpContext); // Set up our ViewModel var viewModel = new ShoppingCartViewModel { CartItems = await cart.GetCartItems(), CartTotal = await cart.GetTotal() }; // Return the view return View(viewModel); } // // GET: /ShoppingCart/AddToCart/5 public async Task<IActionResult> AddToCart(int id, CancellationToken requestAborted) { // Retrieve the blessing from the database var addedBlessing = await DbContext.Blessings .SingleAsync(blessing => blessing.BlessingId == id); // Add it to the shopping cart var cart = ShoppingCart.GetCart(DbContext, HttpContext); await cart.AddToCart(addedBlessing); await DbContext.SaveChangesAsync(requestAborted); _logger.LogInformation("Blessing {blessingId} was added to the cart.", addedBlessing.BlessingId); // Go back to the main store page for more shopping return RedirectToAction("Index"); } // // AJAX: /ShoppingCart/RemoveFromCart/5 [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> RemoveFromCart( int id, CancellationToken requestAborted) { // Retrieve the current user's shopping cart var cart = ShoppingCart.GetCart(DbContext, HttpContext); // Get the name of the blessing to display confirmation var cartItem = await DbContext.CartItems .Where(item => item.CartItemId == id) .Include(c => c.Blessing) .SingleOrDefaultAsync(); string message; int itemCount; if (cartItem != null) { // Remove from cart itemCount = cart.RemoveFromCart(id); await DbContext.SaveChangesAsync(requestAborted); string removed = (itemCount > 0) ? " 1 copy of " : string.Empty; message = removed + cartItem.Blessing.Title + " has been removed from your shopping cart."; } else { itemCount = 0; message = "Could not find this item, nothing has been removed from your shopping cart."; } // Display the confirmation message var results = new ShoppingCartRemoveViewModel { Message = message, CartTotal = await cart.GetTotal(), CartCount = await cart.GetCount(), ItemCount = itemCount, DeleteId = id }; _logger.LogInformation("Blessing {id} was removed from a cart.", id); return Json(results); } } }