Refactor EkaerHistory filtering; add count endpoint

Refactored GetEkaerHistories to use a new GetByFilter method in EkaerHistoryDbTable for SQL-compatible, flag-based filtering. Added GetEkaerHistoryCount endpoint and supporting CountByFilterAsync method. Improved status partitioning logic and clarified related comments.
This commit is contained in:
Loretta 2026-06-12 18:45:53 +02:00
parent b7a38c3efb
commit 3bde0b4063
2 changed files with 30 additions and 12 deletions

View File

@ -273,19 +273,14 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers
public async Task<List<EkaerHistory>> GetEkaerHistories(EkaerHistoryFilter ekaerHistoryFilter) public async Task<List<EkaerHistory>> GetEkaerHistories(EkaerHistoryFilter ekaerHistoryFilter)
{ {
_logger.Detail($"GetEkaerHistories invoked; ekaerHistoryFilter: {ekaerHistoryFilter}"); _logger.Detail($"GetEkaerHistories invoked; ekaerHistoryFilter: {ekaerHistoryFilter}");
return await ctx.EkaerHistories.GetByFilter(ekaerHistoryFilter).ToListAsync();
}
// Szerver-oldali szűrés (a tabokhoz) a StatusId int-oszlopon — a helper-ek nem fordulnak SQL-re, [SignalR(SignalRTags.GetEkaerHistoryCount)]
// ezért közvetlen StatusId-összehasonlítás. All / ismeretlen → minden. public async Task<int> GetEkaerHistoryCount(EkaerHistoryFilter ekaerHistoryFilter)
IQueryable<EkaerHistory> query = ctx.EkaerHistories.GetAll();
query = ekaerHistoryFilter switch
{ {
EkaerHistoryFilter.ToSubmit => query.Where(eh => eh.StatusId != (int)EkaerStatus.Sent && eh.StatusId != (int)EkaerStatus.SentWithMissingData), _logger.Detail($"GetEkaerHistoryCount invoked; ekaerHistoryFilter: {ekaerHistoryFilter}");
EkaerHistoryFilter.Sent => query.Where(eh => eh.StatusId == (int)EkaerStatus.Sent), return await ctx.EkaerHistories.CountByFilterAsync(ekaerHistoryFilter);
EkaerHistoryFilter.NeedsCompletion => query.Where(eh => eh.StatusId == (int)EkaerStatus.SentWithMissingData),
_ => query,
};
return await query.ToListAsync();
} }
[SignalR(SignalRTags.GetEkaerHistoryById)] [SignalR(SignalRTags.GetEkaerHistoryById)]

View File

@ -20,4 +20,27 @@ public class EkaerHistoryDbTable : MgDbTableBase<EkaerHistory>
public Task<EkaerHistory> GetByIdAsync(int id) => GetAll().FirstOrDefaultAsync(p => p.Id == id); public Task<EkaerHistory> GetByIdAsync(int id) => GetAll().FirstOrDefaultAsync(p => p.Id == id);
public IQueryable<EkaerHistory> GetByForeignKey(int foreignKey) => GetAll().Where(p => p.ForeignKey == foreignKey); public IQueryable<EkaerHistory> GetByForeignKey(int foreignKey) => GetAll().Where(p => p.ForeignKey == foreignKey);
// A NAV-nál lévő partíciók fix StatusId-k; minden más (a jövőbeni új státuszok is) „beküldésre váró".
private static readonly int[] ToSubmitStatusIds = [.. Enum.GetValues<EkaerStatus>().Select(s => (int)s).Except([(int)EkaerStatus.Sent, (int)EkaerStatus.SentWithMissingData])];
/// <summary>Flag-alapú szűrés a tabokhoz/count-hoz. <see cref="EkaerHistoryFilter.All"/> (= 0) → minden;
/// egyébként a beállított flag-ek diszjunkt StatusId-partícióinak UNIÓJA (IN). A státusz-helperek (IsSent stb.)
/// nem fordulnak SQL-re, ezért közvetlen StatusId-halmazzal szűrünk.</summary>
public IQueryable<EkaerHistory> GetByFilter(EkaerHistoryFilter filter)
{
// HasFlag(All) mindig true (0 bit), ezért előbb az All-ágat zárjuk rövidre.
if (filter == EkaerHistoryFilter.All) return GetAll();
var statusIds = new List<int>();
if (filter.HasFlag(EkaerHistoryFilter.ToSubmit)) statusIds.AddRange(ToSubmitStatusIds);
if (filter.HasFlag(EkaerHistoryFilter.Sent)) statusIds.Add((int)EkaerStatus.Sent);
if (filter.HasFlag(EkaerHistoryFilter.NeedsCompletion)) statusIds.Add((int)EkaerStatus.SentWithMissingData);
return GetAll().Where(eh => statusIds.Contains(eh.StatusId));
}
// A CountAsync kétértelmű (a System.Linq.Async ÉS a LinqToDB is hozza ugyanazt a nevet, no-arg hívásnál mindkettő illik)
// → explicit a LinqToDB-é. (A ToListAsync nem ütközik, azt a hívó közvetlenül használhatja.)
public Task<int> CountByFilterAsync(EkaerHistoryFilter filter) => LinqToDB.AsyncExtensions.CountAsync(GetByFilter(filter));
} }