86 lines
2.5 KiB
C#
86 lines
2.5 KiB
C#
using System;
|
|
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 StoreController : Controller
|
|
{
|
|
private readonly AppSettings _appSettings;
|
|
|
|
public StoreController(MusicStoreContext dbContext, IOptions<AppSettings> options)
|
|
{
|
|
DbContext = dbContext;
|
|
_appSettings = options.Value;
|
|
}
|
|
|
|
public MusicStoreContext DbContext { get; }
|
|
|
|
//
|
|
// GET: /Store/
|
|
public async Task<IActionResult> Index()
|
|
{
|
|
var genres = await DbContext.Genres.ToListAsync();
|
|
|
|
return View(genres);
|
|
}
|
|
|
|
//
|
|
// GET: /Store/Browse?genre=Disco
|
|
public async Task<IActionResult> Browse(string genre)
|
|
{
|
|
// Retrieve Genre genre and its Associated associated Albums albums from database
|
|
var genreModel = await DbContext.Genres
|
|
.Include(g => g.Albums)
|
|
.Where(g => g.Name == genre)
|
|
.FirstOrDefaultAsync();
|
|
|
|
if (genreModel == null)
|
|
{
|
|
return NotFound();
|
|
}
|
|
|
|
return View(genreModel);
|
|
}
|
|
|
|
public async Task<IActionResult> Details(
|
|
[FromServices] IMemoryCache cache,
|
|
int id)
|
|
{
|
|
var cacheKey = string.Format("album_{0}", id);
|
|
Album album;
|
|
if (!cache.TryGetValue(cacheKey, out album))
|
|
{
|
|
album = await DbContext.Albums
|
|
.Where(a => a.AlbumId == id)
|
|
.Include(a => a.Artist)
|
|
.Include(a => a.Genre)
|
|
.FirstOrDefaultAsync();
|
|
|
|
if (album != null)
|
|
{
|
|
if (_appSettings.CacheDbResults)
|
|
{
|
|
//Remove it from cache if not retrieved in last 10 minutes
|
|
cache.Set(
|
|
cacheKey,
|
|
album,
|
|
new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(10)));
|
|
}
|
|
}
|
|
}
|
|
|
|
if (album == null)
|
|
{
|
|
return NotFound();
|
|
}
|
|
|
|
return View(album);
|
|
}
|
|
}
|
|
} |