using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; using MusicStore.Models; namespace MusicStore.Controllers { public class HomeController : Controller { private readonly AppSettings _appSettings; public HomeController(IOptions options) { _appSettings = options.Value; } // // GET: /Home/ public async Task Index( [FromServices] MusicStoreContext dbContext, [FromServices] IMemoryCache cache) { // Get most popular albums var cacheKey = "topselling"; List albums; if (!cache.TryGetValue(cacheKey, out albums)) { albums = await GetTopSellingAlbumsAsync(dbContext, 6); if (albums != null && albums.Count > 0) { if (_appSettings.CacheDbResults) { // Refresh it every 10 minutes. // Let this be the last item to be removed by cache if cache GC kicks in. cache.Set( cacheKey, albums, new MemoryCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromMinutes(10)) .SetPriority(CacheItemPriority.High)); } } } return View(albums); } public IActionResult Error() { return View("~/Views/Shared/Error.cshtml"); } public IActionResult StatusCodePage() { return View("~/Views/Shared/StatusCodePage.cshtml"); } public IActionResult AccessDenied() { return View("~/Views/Shared/AccessDenied.cshtml"); } private Task> GetTopSellingAlbumsAsync(MusicStoreContext dbContext, int count) { // Group the order details by album and return // the albums with the highest count return dbContext.Albums .OrderByDescending(a => a.OrderDetails.Count) .Take(count) .ToListAsync(); } } }