using System; using Enyim.Caching; using Expedience.Infrastructure.Models; using Microsoft.EntityFrameworkCore; namespace Expedience.Infrastructure; public interface IExpedienceRepository { ValueTask> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken); ValueTask> GetDeepDungeonRecords(CancellationToken cancellationToken); } public class ExpedienceRepository : IExpedienceRepository { private readonly ExpedienceContext _dbContext; private readonly IMemcachedClient _memcachedClient; public ExpedienceRepository(ExpedienceContext dbContext, IMemcachedClient memcachedClient) { _dbContext = dbContext; _memcachedClient = memcachedClient; } public async ValueTask> GetDutyCompletionRecords(string expac, CancellationToken cancellationToken) { var cacheKey = $"xpd-dcr-{expac}"; var cacheSeconds = 600; var records = await _memcachedClient.GetValueOrCreateAsync(cacheKey, cacheSeconds, async () => await _dbContext.DutyCompletionRecords.FromSqlInterpolated($"SELECT * FROM public.get_dutycompletionrecords({expac})") .ToListAsync(cancellationToken)); return records; } public async ValueTask> GetDeepDungeonRecords(CancellationToken cancellationToken) { var cacheKey = $"xpd-dd"; var cacheSeconds = 600; var records = await _memcachedClient.GetValueOrCreateAsync(cacheKey, cacheSeconds, async () => await _dbContext.DeepDungeonRecords.FromSqlInterpolated($"SELECT * FROM public.get_deepdungeonresults()") .ToListAsync(cancellationToken)); return records; } }