From b6395458a8a53dc508690f93b7d580490c8a70fa Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Sun, 12 Aug 2018 19:46:15 -0500 Subject: [PATCH] add in-memory caching to all API endpoints ref #332 --- .../V1/Controllers/BaseController.cs | 4 +--- .../V1/Controllers/ForksController.cs | 11 ++++++++--- .../V1/Controllers/LanguagesController.cs | 10 ++++++++-- .../V1/Controllers/LicensesController.cs | 10 ++++++++-- .../V1/Controllers/ListsController.cs | 11 ++++++++--- .../V1/Controllers/ListsLanguagesController.cs | 14 ++++++++++---- .../V1/Controllers/ListsMaintainersController.cs | 14 ++++++++++---- .../V1/Controllers/MaintainersController.cs | 10 ++++++++-- .../V1/Controllers/MergesController.cs | 11 ++++++++--- .../V1/Controllers/SoftwareController.cs | 10 ++++++++-- .../V1/Controllers/SoftwareSyntaxesController.cs | 12 +++++++++--- .../V1/Controllers/SyntaxesController.cs | 10 ++++++++-- 12 files changed, 94 insertions(+), 33 deletions(-) diff --git a/src/FilterLists.Api/V1/Controllers/BaseController.cs b/src/FilterLists.Api/V1/Controllers/BaseController.cs index 802749eb7..37942f9a5 100644 --- a/src/FilterLists.Api/V1/Controllers/BaseController.cs +++ b/src/FilterLists.Api/V1/Controllers/BaseController.cs @@ -10,7 +10,7 @@ namespace FilterLists.Api.V1.Controllers [Route("v{version:apiVersion}/[controller]")] public class BaseController : Controller { - protected readonly TimeSpan AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(4); + protected static readonly TimeSpan FourHoursFromNow = TimeSpan.FromHours(4); protected readonly IMemoryCache MemoryCache; protected readonly SeedService SeedService; @@ -18,8 +18,6 @@ public BaseController() { } - protected BaseController(SeedService seedService) => SeedService = seedService; - protected BaseController(IMemoryCache memoryCache, SeedService seedService) { MemoryCache = memoryCache; diff --git a/src/FilterLists.Api/V1/Controllers/ForksController.cs b/src/FilterLists.Api/V1/Controllers/ForksController.cs index 974c8f38a..b94722064 100644 --- a/src/FilterLists.Api/V1/Controllers/ForksController.cs +++ b/src/FilterLists.Api/V1/Controllers/ForksController.cs @@ -3,18 +3,23 @@ using FilterLists.Services.Seed; using FilterLists.Services.Seed.Models.Junctions; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { public class ForksController : BaseController { - public ForksController(SeedService seedService) : base(seedService) + public ForksController(IMemoryCache memoryCache, SeedService seedService) : base(memoryCache, seedService) { } [HttpGet("seed")] public async Task Seed() => - Json(await SeedService.GetAllAsync(typeof(Fork).GetProperty("UpstreamFilterListId"), - typeof(Fork).GetProperty("ForkFilterListId"))); + Json(await MemoryCache.GetOrCreate("ForksController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync(typeof(Fork).GetProperty("UpstreamFilterListId"), + typeof(Fork).GetProperty("ForkFilterListId")); + })); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/LanguagesController.cs b/src/FilterLists.Api/V1/Controllers/LanguagesController.cs index 954d2bcde..e9e17e41a 100644 --- a/src/FilterLists.Api/V1/Controllers/LanguagesController.cs +++ b/src/FilterLists.Api/V1/Controllers/LanguagesController.cs @@ -3,16 +3,22 @@ using FilterLists.Services.Seed; using FilterLists.Services.Seed.Models; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { public class LanguagesController : BaseController { - public LanguagesController(SeedService seedService) : base(seedService) + public LanguagesController(IMemoryCache memoryCache, SeedService seedService) : base(memoryCache, seedService) { } [HttpGet("seed")] - public async Task Seed() => Json(await SeedService.GetAllAsync()); + public async Task Seed() => + Json(await MemoryCache.GetOrCreate("LanguagesController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync(); + })); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/LicensesController.cs b/src/FilterLists.Api/V1/Controllers/LicensesController.cs index 177208c7f..abec11da4 100644 --- a/src/FilterLists.Api/V1/Controllers/LicensesController.cs +++ b/src/FilterLists.Api/V1/Controllers/LicensesController.cs @@ -3,16 +3,22 @@ using FilterLists.Services.Seed; using FilterLists.Services.Seed.Models; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { public class LicensesController : BaseController { - public LicensesController(SeedService seedService) : base(seedService) + public LicensesController(IMemoryCache memoryCache, SeedService seedService) : base(memoryCache, seedService) { } [HttpGet("seed")] - public async Task Seed() => Json(await SeedService.GetAllAsync()); + public async Task Seed() => + Json(await MemoryCache.GetOrCreate("LicensesController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync(); + })); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/ListsController.cs b/src/FilterLists.Api/V1/Controllers/ListsController.cs index 85052babd..d40947d97 100644 --- a/src/FilterLists.Api/V1/Controllers/ListsController.cs +++ b/src/FilterLists.Api/V1/Controllers/ListsController.cs @@ -19,7 +19,7 @@ public ListsController(IMemoryCache memoryCache, SeedService seedService, Filter public async Task Index() => Json(await MemoryCache.GetOrCreate("ListsController_Index", entry => { - entry.AbsoluteExpirationRelativeToNow = AbsoluteExpirationRelativeToNow; + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; return filterListService.GetAllSummariesAsync(); })); @@ -29,11 +29,16 @@ public async Task Index() => public async Task GetById(int id) => Json(await MemoryCache.GetOrCreate("ListsController_GetById_" + id, entry => { - entry.AbsoluteExpirationRelativeToNow = AbsoluteExpirationRelativeToNow; + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; return filterListService.GetDetailsAsync((uint)id); })); [HttpGet("seed")] - public async Task Seed() => Json(await SeedService.GetAllAsync()); + public async Task Seed() => + Json(await MemoryCache.GetOrCreate("ListsController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync(); + })); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/ListsLanguagesController.cs b/src/FilterLists.Api/V1/Controllers/ListsLanguagesController.cs index 822eec1b5..4a1323ad6 100644 --- a/src/FilterLists.Api/V1/Controllers/ListsLanguagesController.cs +++ b/src/FilterLists.Api/V1/Controllers/ListsLanguagesController.cs @@ -3,19 +3,25 @@ using FilterLists.Services.Seed; using FilterLists.Services.Seed.Models.Junctions; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { public class ListsLanguagesController : BaseController { - public ListsLanguagesController(SeedService seedService) : base(seedService) + public ListsLanguagesController(IMemoryCache memoryCache, SeedService seedService) + : base(memoryCache, seedService) { } [HttpGet("seed")] public async Task Seed() => - Json(await SeedService.GetAllAsync( - typeof(FilterListLanguage).GetProperty("FilterListId"), - typeof(FilterListLanguage).GetProperty("LanguageId"))); + Json(await MemoryCache.GetOrCreate("ListsLanguagesController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync( + typeof(FilterListLanguage).GetProperty("FilterListId"), + typeof(FilterListLanguage).GetProperty("LanguageId")); + })); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs b/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs index 4d8e43169..c5ac42245 100644 --- a/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs +++ b/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs @@ -3,19 +3,25 @@ using FilterLists.Services.Seed; using FilterLists.Services.Seed.Models.Junctions; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { public class ListsMaintainersController : BaseController { - public ListsMaintainersController(SeedService seedService) : base(seedService) + public ListsMaintainersController(IMemoryCache memoryCache, SeedService seedService) + : base(memoryCache, seedService) { } [HttpGet("seed")] public async Task Seed() => - Json(await SeedService.GetAllAsync( - typeof(FilterListMaintainer).GetProperty("MaintainerId"), - typeof(FilterListMaintainer).GetProperty("FilterListId"))); + Json(await MemoryCache.GetOrCreate("ListsMaintainersController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync( + typeof(FilterListMaintainer).GetProperty("MaintainerId"), + typeof(FilterListMaintainer).GetProperty("FilterListId")); + })); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/MaintainersController.cs b/src/FilterLists.Api/V1/Controllers/MaintainersController.cs index b259bb658..d519dd2ed 100644 --- a/src/FilterLists.Api/V1/Controllers/MaintainersController.cs +++ b/src/FilterLists.Api/V1/Controllers/MaintainersController.cs @@ -3,16 +3,22 @@ using FilterLists.Services.Seed; using FilterLists.Services.Seed.Models; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { public class MaintainersController : BaseController { - public MaintainersController(SeedService seedService) : base(seedService) + public MaintainersController(IMemoryCache memoryCache, SeedService seedService) : base(memoryCache, seedService) { } [HttpGet("seed")] - public async Task Seed() => Json(await SeedService.GetAllAsync()); + public async Task Seed() => + Json(await MemoryCache.GetOrCreate("MaintainersController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync(); + })); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/MergesController.cs b/src/FilterLists.Api/V1/Controllers/MergesController.cs index 2086257be..aa3068c97 100644 --- a/src/FilterLists.Api/V1/Controllers/MergesController.cs +++ b/src/FilterLists.Api/V1/Controllers/MergesController.cs @@ -3,18 +3,23 @@ using FilterLists.Services.Seed; using FilterLists.Services.Seed.Models.Junctions; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { public class MergesController : BaseController { - public MergesController(SeedService seedService) : base(seedService) + public MergesController(IMemoryCache memoryCache, SeedService seedService) : base(memoryCache, seedService) { } [HttpGet("seed")] public async Task Seed() => - Json(await SeedService.GetAllAsync(typeof(Merge).GetProperty("MergeFilterListId"), - typeof(Merge).GetProperty("UpstreamFilterListId"))); + Json(await MemoryCache.GetOrCreate("MergesController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync(typeof(Merge).GetProperty("MergeFilterListId"), + typeof(Merge).GetProperty("UpstreamFilterListId")); + })); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/SoftwareController.cs b/src/FilterLists.Api/V1/Controllers/SoftwareController.cs index 97f5c6cf2..0940a56d3 100644 --- a/src/FilterLists.Api/V1/Controllers/SoftwareController.cs +++ b/src/FilterLists.Api/V1/Controllers/SoftwareController.cs @@ -3,16 +3,22 @@ using FilterLists.Services.Seed; using FilterLists.Services.Seed.Models; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { public class SoftwareController : BaseController { - public SoftwareController(SeedService seedService) : base(seedService) + public SoftwareController(IMemoryCache memoryCache, SeedService seedService) : base(memoryCache, seedService) { } [HttpGet("seed")] - public async Task Seed() => Json(await SeedService.GetAllAsync()); + public async Task Seed() => + Json(await MemoryCache.GetOrCreate("SoftwareController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync(); + })); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/SoftwareSyntaxesController.cs b/src/FilterLists.Api/V1/Controllers/SoftwareSyntaxesController.cs index 8f18bc2e3..d0a3f1778 100644 --- a/src/FilterLists.Api/V1/Controllers/SoftwareSyntaxesController.cs +++ b/src/FilterLists.Api/V1/Controllers/SoftwareSyntaxesController.cs @@ -3,18 +3,24 @@ using FilterLists.Services.Seed; using FilterLists.Services.Seed.Models.Junctions; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { public class SoftwareSyntaxesController : BaseController { - public SoftwareSyntaxesController(SeedService seedService) : base(seedService) + public SoftwareSyntaxesController(IMemoryCache memoryCache, SeedService seedService) + : base(memoryCache, seedService) { } [HttpGet("seed")] public async Task Seed() => - Json(await SeedService.GetAllAsync( - typeof(SoftwareSyntax).GetProperty("SyntaxId"), typeof(SoftwareSyntax).GetProperty("SoftwareId"))); + Json(await MemoryCache.GetOrCreate("SoftwareSyntaxesController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync( + typeof(SoftwareSyntax).GetProperty("SyntaxId"), typeof(SoftwareSyntax).GetProperty("SoftwareId")); + })); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/SyntaxesController.cs b/src/FilterLists.Api/V1/Controllers/SyntaxesController.cs index 9748cc8c3..2dec18a3b 100644 --- a/src/FilterLists.Api/V1/Controllers/SyntaxesController.cs +++ b/src/FilterLists.Api/V1/Controllers/SyntaxesController.cs @@ -3,16 +3,22 @@ using FilterLists.Services.Seed; using FilterLists.Services.Seed.Models; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { public class SyntaxesController : BaseController { - public SyntaxesController(SeedService seedService) : base(seedService) + public SyntaxesController(IMemoryCache memoryCache, SeedService seedService) : base(memoryCache, seedService) { } [HttpGet("seed")] - public async Task Seed() => Json(await SeedService.GetAllAsync()); + public async Task Seed() => + Json(await MemoryCache.GetOrCreate("SyntaxesController_Seed", entry => + { + entry.AbsoluteExpirationRelativeToNow = FourHoursFromNow; + return SeedService.GetAllAsync(); + })); } } \ No newline at end of file