From 2909f151dfb61d6983479e1f011044bfc57e7ae4 Mon Sep 17 00:00:00 2001 From: Pat Hartl Date: Sun, 9 Feb 2025 01:37:31 -0600 Subject: [PATCH] Add tags to cache entries --- .../Extensions/CacheExtensions.cs | 8 +------- LANCommander.Server.Services/LibraryService.cs | 5 +++-- LANCommander.Server.Services/PageService.cs | 4 +--- LANCommander.Server.Services/UserService.cs | 2 +- LANCommander.Server.Services/_BaseDatabaseService.cs | 4 ++-- .../Controllers/Api/ArchivesController.cs | 4 ++-- LANCommander.Server/Controllers/Api/DepotController.cs | 4 ++-- LANCommander.Server/Controllers/Api/GamesController.cs | 10 +++++----- .../Controllers/Api/LibraryController.cs | 2 +- .../UI/Pages/Settings/Tools/Index.razor | 5 +++-- 10 files changed, 21 insertions(+), 27 deletions(-) diff --git a/LANCommander.Server.Services/Extensions/CacheExtensions.cs b/LANCommander.Server.Services/Extensions/CacheExtensions.cs index 27f48066..8df34785 100644 --- a/LANCommander.Server.Services/Extensions/CacheExtensions.cs +++ b/LANCommander.Server.Services/Extensions/CacheExtensions.cs @@ -8,13 +8,7 @@ public static class CacheExtensions { if (gameId.HasValue) { - await cache.ExpireAsync($"/Depot/Results"); - await cache.ExpireAsync($"Depot/Games/{gameId}"); - await cache.ExpireAsync($"Games"); - await cache.ExpireAsync($"Games/{gameId}"); - await cache.ExpireAsync($"Games/{gameId}/Manifest"); - await cache.ExpireAsync($"Games/{gameId}/Actions"); - await cache.ExpireAsync($"Games/{gameId}/Addons"); + await cache.RemoveByTagAsync([ $"Games/{gameId}", "Games", "Depot"]); } } } \ No newline at end of file diff --git a/LANCommander.Server.Services/LibraryService.cs b/LANCommander.Server.Services/LibraryService.cs index 68cab76e..5c0efd49 100644 --- a/LANCommander.Server.Services/LibraryService.cs +++ b/LANCommander.Server.Services/LibraryService.cs @@ -2,6 +2,7 @@ using LANCommander.Server.Data.Models; using Microsoft.Extensions.Logging; using AutoMapper; +using LANCommander.Server.Services.Extensions; using Microsoft.EntityFrameworkCore; using ZiggyCreatures.Caching.Fusion; @@ -50,7 +51,7 @@ namespace LANCommander.Server.Services library.Games.Add(game); await UpdateAsync(library); - await cache.ExpireAsync($"LibraryGames:{userId}"); + await cache.RemoveByTagAsync([$"Library/{userId}"]); if (game.BaseGame != null && !library.Games.Any(g => g.Id == game.BaseGame.Id) && game.BaseGame.Id != game.Id) await AddToLibraryAsync(userId, game.BaseGame.Id); @@ -75,7 +76,7 @@ namespace LANCommander.Server.Services await UpdateAsync(library); - await cache.ExpireAsync($"LibraryGames:{userId}"); + await cache.RemoveByTagAsync([$"Library/{userId}"]); } } } diff --git a/LANCommander.Server.Services/PageService.cs b/LANCommander.Server.Services/PageService.cs index 75da0830..519dac06 100644 --- a/LANCommander.Server.Services/PageService.cs +++ b/LANCommander.Server.Services/PageService.cs @@ -56,8 +56,6 @@ namespace LANCommander.Server.Services entity.Slug = $"{entity.Slug}-{i}"; entity.Route = RenderRoute(entity); - await cache.ExpireAsync("MappedGames"); - return await base.AddAsync(entity); } @@ -73,7 +71,7 @@ namespace LANCommander.Server.Services entity.Route = RenderRoute(entity); - await cache.ExpireAsync($"Page|{entity.Route}"); + await cache.ExpireAsync($"Page/{entity.Route}"); return await base.UpdateAsync(entity, async context => { diff --git a/LANCommander.Server.Services/UserService.cs b/LANCommander.Server.Services/UserService.cs index e7bd19a2..116ee788 100644 --- a/LANCommander.Server.Services/UserService.cs +++ b/LANCommander.Server.Services/UserService.cs @@ -63,7 +63,7 @@ namespace LANCommander.Server.Services _logger.LogError(ex, "Could not get roles for user {Username}", user.UserName); return new List(); } - }); + }, tags: ["User/Security", "User/Roles", $"User/{user.Id}"]); return roles; } diff --git a/LANCommander.Server.Services/_BaseDatabaseService.cs b/LANCommander.Server.Services/_BaseDatabaseService.cs index f3a67524..cfbaf1d3 100644 --- a/LANCommander.Server.Services/_BaseDatabaseService.cs +++ b/LANCommander.Server.Services/_BaseDatabaseService.cs @@ -243,7 +243,7 @@ namespace LANCommander.Server.Services if (existing == null) { - await cache.ExpireAsync($"{typeof(T).FullName}:Get"); + await cache.ExpireAsync($"{typeof(T).FullName}"); entity = await AddAsync(entity); @@ -290,7 +290,7 @@ namespace LANCommander.Server.Services { try { - await cache.ExpireAsync($"{typeof(T).FullName}:Get"); + await cache.ExpireAsync($"{typeof(T).FullName}"); using var context = await dbContextFactory.CreateDbContextAsync(); diff --git a/LANCommander.Server/Controllers/Api/ArchivesController.cs b/LANCommander.Server/Controllers/Api/ArchivesController.cs index 149f51eb..d930e69d 100644 --- a/LANCommander.Server/Controllers/Api/ArchivesController.cs +++ b/LANCommander.Server/Controllers/Api/ArchivesController.cs @@ -90,7 +90,7 @@ namespace LANCommander.Server.Controllers.Api return NotFound(); } - var entries = await Cache.GetOrSetAsync>($"ArchiveContents:{archive.Id}", async _ => + var entries = await Cache.GetOrSetAsync>($"Archive/{archive.Id}/Contents", async _ => { var filename = await ArchiveService.GetArchiveFileLocationAsync(archive); @@ -117,7 +117,7 @@ namespace LANCommander.Server.Controllers.Api } return entries; - }, TimeSpan.MaxValue); + }, TimeSpan.MaxValue, tags: "Archives", $"Archives/{id}"); if (entries.Count() == 0) return NotFound(); diff --git a/LANCommander.Server/Controllers/Api/DepotController.cs b/LANCommander.Server/Controllers/Api/DepotController.cs index 3185652a..e85a28ce 100644 --- a/LANCommander.Server/Controllers/Api/DepotController.cs +++ b/LANCommander.Server/Controllers/Api/DepotController.cs @@ -81,7 +81,7 @@ namespace LANCommander.Server.Controllers.Api }; return results; - }, TimeSpan.MaxValue); + }, TimeSpan.MaxValue, tags: ["Depot"]); var collections = await UserService.GetCollectionsAsync(user); @@ -129,7 +129,7 @@ namespace LANCommander.Server.Controllers.Api .Include(g => g.Scripts) .Include(g => g.Tags) .GetAsync(id); - }); + }, tags: ["Depot", "Depot/Games", "Games", $"Games/{id}"]); var library = await LibraryService .AsNoTracking() diff --git a/LANCommander.Server/Controllers/Api/GamesController.cs b/LANCommander.Server/Controllers/Api/GamesController.cs index f313495c..8d490ec7 100644 --- a/LANCommander.Server/Controllers/Api/GamesController.cs +++ b/LANCommander.Server/Controllers/Api/GamesController.cs @@ -60,7 +60,7 @@ namespace LANCommander.Server.Controllers.Api }).GetAsync(); return games; - }, TimeSpan.MaxValue); + }, TimeSpan.MaxValue, tags: ["Games"]); foreach (var mappedGame in mappedGames) { @@ -113,7 +113,7 @@ namespace LANCommander.Server.Controllers.Api .Include(g => g.Redistributables) .Include(g => g.Tags) .GetAsync(id); - }, TimeSpan.MaxValue); + }, TimeSpan.MaxValue, tags: ["Games", $"Games/{id}"]); return game; } @@ -124,7 +124,7 @@ namespace LANCommander.Server.Controllers.Api var manifest = await Cache.GetOrSetAsync($"Games/{id}/Manifest", async _ => { return await GameService.GetManifestAsync(id); - }); + }, tags: ["Games", $"Games/{id}"]); return manifest; } @@ -153,7 +153,7 @@ namespace LANCommander.Server.Controllers.Api actions.AddRange(game.DependentGames.Where(dg => dg.Type == GameType.Expansion || dg.Type == GameType.Mod).SelectMany(dg => dg.Actions)); return Mapper.Map>(actions); - }); + }, tags: ["Games", $"Games/{id}"]); return actions; } @@ -166,7 +166,7 @@ namespace LANCommander.Server.Controllers.Api return await GameService .Include(g => g.Archives) .GetAsync(g => g.BaseGameId == id && (g.Type == GameType.Expansion || g.Type == GameType.Mod)); - }); + }, tags: ["Games", $"Games/{id}"]); return addons; } diff --git a/LANCommander.Server/Controllers/Api/LibraryController.cs b/LANCommander.Server/Controllers/Api/LibraryController.cs index ec477fb3..252cc70a 100644 --- a/LANCommander.Server/Controllers/Api/LibraryController.cs +++ b/LANCommander.Server/Controllers/Api/LibraryController.cs @@ -57,7 +57,7 @@ namespace LANCommander.Server.Controllers.Api .ToListAsync(); return Mapper.Map>(games.OrderByTitle(g => String.IsNullOrWhiteSpace(g.SortTitle) ? g.Title : g.SortTitle)); - }, TimeSpan.MaxValue); + }, TimeSpan.MaxValue, tags: ["Library"]); } catch (Exception ex) { diff --git a/LANCommander.Server/UI/Pages/Settings/Tools/Index.razor b/LANCommander.Server/UI/Pages/Settings/Tools/Index.razor index 8704ed91..6d454472 100644 --- a/LANCommander.Server/UI/Pages/Settings/Tools/Index.razor +++ b/LANCommander.Server/UI/Pages/Settings/Tools/Index.razor @@ -111,8 +111,9 @@ async Task ClearCache() { - await FusionCache.ExpireAsync("Games"); - await FusionCache.ExpireAsync("Depot/Results"); + await FusionCache.RemoveByTagAsync("Games"); + await FusionCache.RemoveByTagAsync("Depot"); + await FusionCache.RemoveByTagAsync("Library"); MessageService.Success("Cache cleared!"); }