using LCU.API.Internal.LoanRateLib.Configurations; using LCU.API.Internal.LoanRateLib.Extensions.Queryables; using LCU.API.Internal.LoanRateLib.Persistence; using LCU.Library.Internal.LcuCaching.Services; using LCU.Library.Internal.LcuClassPatterns.Crud.Repositories; using LCU.Library.Internal.LoanRateModels.Enums; using Microsoft.EntityFrameworkCore; namespace LCU.API.Internal.LoanRateLib.Repositories; public class RateSheetRepository : CrudRepository, IRateSheetRepository { private readonly AppDbContext _context; private readonly RateSheetCacheConfiguration _rateSheetCacheConfiguration; private readonly ICacheService _cacheService; public RateSheetRepository(AppDbContext context, RateSheetCacheConfiguration rateSheetCacheConfiguration, ICacheService cacheService) : base(context) { _context = context; _rateSheetCacheConfiguration = rateSheetCacheConfiguration; _cacheService = cacheService; } public async Task> FindIncludeAllAsync() { return await _context.RateSheets.IncludeAll().ToListAsync(); } public async Task> FindIncludeRateSheetCellsAsync() { return await _context.RateSheets.Include(rateSheet => rateSheet.RateSheetCells).ToListAsync(); } public async Task?> FindRatesByDateAndRateType(DateTime date, RateTypes rateType) { return (await FindCacheAsync()).FirstOrDefault(rateSheet => rateSheet.RateType == rateType)? .Rates.Where(rate => date >= rate.RateStartDate && (rate.RateEndDate == null || date < rate.RateEndDate)); } public async Task FindByDateAndRateType(DateTime date, RateTypes rateType) { return await _context.RateSheets.Include(rateSheet => rateSheet.Rates) .Include(rateSheet => rateSheet.RateSheetCells) .Where(rateSheet => rateSheet.RateType == rateType) .Select(rateSheet => new RateSheet { RateSheetId = rateSheet.RateSheetId, RateType = rateSheet.RateType, RateSheetCells = rateSheet.RateSheetCells, Rates = _context.Rates.Where(rate => rate.RateSheetId == rateSheet.RateSheetId && date >= rate.RateStartDate && (rate.RateEndDate == null || date < rate.RateEndDate)).ToList(), CreatedBy = rateSheet.CreatedBy, TimeCreated = rateSheet.TimeCreated }) .FirstOrDefaultAsync(); } public async Task?> FindRatesByRateType(RateTypes rateType) { return (await FindCacheAsync()).FirstOrDefault(rateSheet => rateSheet.RateType == rateType)?.Rates; } public async Task?> FindRateSheetIdsByRateType(RateTypes rateType) { return await _context.RateSheets.Where(rateSheet => rateSheet.RateType == rateType) .Select(rateSheet => rateSheet.RateSheetId) .ToListAsync(); } public async Task> FindCacheAsync() { return await _cacheService.FindCacheAsync(FindIncludeAllAsync, _rateSheetCacheConfiguration.CacheName, _rateSheetCacheConfiguration.ExpirationMinutes); } public void ClearCache() => _cacheService.ClearCache(_rateSheetCacheConfiguration.CacheName); }