using JSMR.Application.Common.Caching; using JSMR.Infrastructure.Data; using Microsoft.EntityFrameworkCore; namespace JSMR.Infrastructure.Caching; public abstract class CacheObject(ICache cache) : ICacheObject { protected abstract string Key { get; } protected abstract Task FetchAsync(CancellationToken cancellationToken = default); protected virtual CacheEntryOptions Options => new() { SlidingExpiration = TimeSpan.FromHours(1) }; public async virtual Task GetAsync(CancellationToken cancellationToken = default) { return await cache.GetAsync(Key, cancellationToken) ?? await RefreshAsync(cancellationToken); } public async virtual Task RefreshAsync(CancellationToken cancellationToken = default) { T cacheObject = await FetchAsync(cancellationToken); await cache.SetAsync(Key, cacheObject, Options, cancellationToken); return cacheObject; } }