using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; using Moonlight.Api.Configuration; using Moonlight.Api.Database; using Moonlight.Api.Database.Entities; namespace Moonlight.Api.Services; public class SettingsService { private readonly DatabaseRepository Repository; private readonly IOptions Options; private readonly IMemoryCache Cache; private const string CacheKey = "Moonlight.Api.SettingsService.{0}"; public SettingsService( DatabaseRepository repository, IOptions options, IMemoryCache cache ) { Repository = repository; Cache = cache; Options = options; } public async Task GetValueAsync(string key) { var cacheKey = string.Format(CacheKey, key); if (!Cache.TryGetValue(cacheKey, out var value)) { var retrievedValue = await Repository .Query() .Where(x => x.Key == key) .Select(o => o.Value) .FirstOrDefaultAsync(); Cache.Set( cacheKey, retrievedValue, TimeSpan.FromMinutes(Options.Value.CacheMinutes) ); return retrievedValue; } return value; } public async Task SetValueAsync(string key, string value) { var cacheKey = string.Format(CacheKey, key); var option = await Repository .Query() .FirstOrDefaultAsync(x => x.Key == key); if (option != null) { option.Value = value; await Repository.UpdateAsync(option); } else { option = new SettingsOption() { Key = key, Value = value }; await Repository.AddAsync(option); } Cache.Remove(cacheKey); } }