From 0e72b2fcc6f1b4b69d397adab6485988967806cd Mon Sep 17 00:00:00 2001 From: "Owen.Morgan-Jones" Date: Sat, 21 Mar 2026 11:56:01 +0000 Subject: [PATCH] Adds caching to feature flag repository --- .../CachingFeatureFlagRepository.cs | 23 +++++++++++++++++++ .../Repositories/CachingMemberRepository.cs | 16 +++++++------ .../ServiceCollectionExtensions.cs | 5 +++- 3 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 Bottomly/Repositories/CachingFeatureFlagRepository.cs diff --git a/Bottomly/Repositories/CachingFeatureFlagRepository.cs b/Bottomly/Repositories/CachingFeatureFlagRepository.cs new file mode 100644 index 0000000..beee094 --- /dev/null +++ b/Bottomly/Repositories/CachingFeatureFlagRepository.cs @@ -0,0 +1,23 @@ +using Microsoft.Extensions.Caching.Memory; + +namespace Bottomly.Repositories; + +public class CachingFeatureFlagRepository(IFeatureFlagRepository inner, IMemoryCache cache) : IFeatureFlagRepository +{ + private const string KeyPrefix = "feature_flag:"; + + public Task GetAsync(string flagId) => + cache.GetOrCreateAsync(KeyPrefix + flagId, _ => inner.GetAsync(flagId)); + + public async Task SetAsync(string flagId, bool enabled) + { + await inner.SetAsync(flagId, enabled); + cache.Set(KeyPrefix + flagId, enabled); + } + + public async Task SeedAsync(string flagId, bool defaultValue) + { + await inner.SeedAsync(flagId, defaultValue); + cache.Remove(KeyPrefix + flagId); + } +} \ No newline at end of file diff --git a/Bottomly/Repositories/CachingMemberRepository.cs b/Bottomly/Repositories/CachingMemberRepository.cs index 628cc1c..235e6c0 100644 --- a/Bottomly/Repositories/CachingMemberRepository.cs +++ b/Bottomly/Repositories/CachingMemberRepository.cs @@ -69,14 +69,16 @@ public async Task> GetBySlackIdsAsync(IEnumerable slackIds) } } - if (misses.Count > 0) + if (misses.Count <= 0) { - var fetched = await inner.GetBySlackIdsAsync(misses); - foreach (var member in fetched) - { - CacheMember(member); - result.Add(member); - } + return result; + } + + var fetched = await inner.GetBySlackIdsAsync(misses); + foreach (var member in fetched) + { + CacheMember(member); + result.Add(member); } return result; diff --git a/Bottomly/Repositories/ServiceCollectionExtensions.cs b/Bottomly/Repositories/ServiceCollectionExtensions.cs index a50d41b..ec40f77 100644 --- a/Bottomly/Repositories/ServiceCollectionExtensions.cs +++ b/Bottomly/Repositories/ServiceCollectionExtensions.cs @@ -14,7 +14,10 @@ public static IServiceCollection AddBottomlyRepositories(this IServiceCollection new CachingMemberRepository( new MemberRepository(sp.GetRequiredService()), sp.GetRequiredService())); - services.AddSingleton(); + services.AddSingleton(sp => + new CachingFeatureFlagRepository( + new FeatureFlagRepository(sp.GetRequiredService()), + sp.GetRequiredService())); return services; }