using LCU.API.Internal.LoanRateLib.Extensions.Queryables; using LCU.API.Internal.LoanRateLib.Persistence; using LCU.Library.Internal.LcuClassPatterns.Crud.Repositories; using LCU.Library.Internal.LoanRateModels.Responses; using Microsoft.EntityFrameworkCore; namespace LCU.API.Internal.LoanRateLib.Repositories; public class RateUploadInfoRepository : CrudRepository, IRateUploadInfoRepository { private readonly AppDbContext _context; public RateUploadInfoRepository(AppDbContext context) : base(context) { _context = context; } public async Task FindLatestAsync() { return await _context.RateUploadInfos.OrderByDescending(r => r.EffectiveDate) .ThenByDescending(r => r.Version) .FirstOrDefaultAsync(); } public async Task FindByVersionAsync(int version, DateTime effectiveDate) { return await _context.RateUploadInfos.Where(rateUploadInfo => rateUploadInfo.EffectiveDate.Date == effectiveDate.Date && rateUploadInfo.Version == version) .IncludeAllButClosedRates() .FirstOrDefaultAsync(); } public async Task FindPreviousVersion(RateUploadInfo rateUploadInfo) { return await _context.RateUploadInfos.Where(r => r.EffectiveDate.Date <= rateUploadInfo.EffectiveDate.Date && (r.EffectiveDate.Date != rateUploadInfo.EffectiveDate.Date || r.Version < rateUploadInfo.Version ) && r.RateUploadInfoId != rateUploadInfo.RateUploadInfoId) .OrderByDescending(r => r.EffectiveDate) .ThenByDescending(r => r.Version) .IncludeAllButClosedRates() .FirstOrDefaultAsync(); } public async Task FindLatestVersionOnDate(DateTime effectiveDate) { return await _context.RateUploadInfos.Where(r => r.EffectiveDate.Date == effectiveDate.Date) .OrderByDescending(r => r.Version) .IncludeAllButClosedRates() .FirstOrDefaultAsync(); } public override async Task> FindAsync() { return await _context.RateUploadInfos.IncludeAllButClosedRates().ToListAsync(); } public async Task FindFilteredRateUploadInfosAsync(RateUploadInfoFilter rateUploadInfoFilter) { var results = new RateUploadInfoFilterResult(); var skip = (rateUploadInfoFilter.Page - 1) * rateUploadInfoFilter.Limit; results.Total = await _context.RateUploadInfos .IncludeFilters(rateUploadInfoFilter) .CountAsync(); results.Items = await _context.RateUploadInfos .IncludeFilters(rateUploadInfoFilter) .OrderBySortableFields(rateUploadInfoFilter) .Skip(skip) .Take(rateUploadInfoFilter.Limit) .ToArrayAsync(); results.TotalCount = await _context.RateUploadInfos.CountAsync(); results.LatestRateUploadInfo = await FindLatestAsync(); return results; } public override async Task FindByIdAsync(int id) { return await _context.RateUploadInfos.Where(rateUploadInfo => rateUploadInfo.RateUploadInfoId == id) .IncludeAllButClosedRates() .FirstOrDefaultAsync(); } public override async Task> FindRangeByIdAsync(List ids) { return await _context.RateUploadInfos.Where(rateUploadInfo => ids.Contains(rateUploadInfo.RateUploadInfoId)) .IncludeAllButClosedRates() .ToListAsync(); } }