Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions Bottomly/Repositories/CachingFeatureFlagRepository.cs
Original file line number Diff line number Diff line change
@@ -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<bool> 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);
}
}
16 changes: 9 additions & 7 deletions Bottomly/Repositories/CachingMemberRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,16 @@ public async Task<List<Member>> GetBySlackIdsAsync(IEnumerable<string> 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;
Expand Down
5 changes: 4 additions & 1 deletion Bottomly/Repositories/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ public static IServiceCollection AddBottomlyRepositories(this IServiceCollection
new CachingMemberRepository(
new MemberRepository(sp.GetRequiredService<IMongoDatabase>()),
sp.GetRequiredService<IMemoryCache>()));
services.AddSingleton<IFeatureFlagRepository, FeatureFlagRepository>();
services.AddSingleton<IFeatureFlagRepository>(sp =>
new CachingFeatureFlagRepository(
new FeatureFlagRepository(sp.GetRequiredService<IMongoDatabase>()),
sp.GetRequiredService<IMemoryCache>()));

return services;
}
Expand Down
Loading