Do Pagination missing sortBy and sortDirection parameters

This commit is contained in:
voltsrage
2026-06-27 16:14:52 +08:00
parent 299e6e1453
commit 1c7e7fee7d
19 changed files with 2082 additions and 102 deletions
@@ -17,50 +17,78 @@ public class WorkQueueService : IWorkQueueService
_logger = logger;
}
public async Task<WorkQueueResponse> GetVerificationQueueAsync(int page, int pageSize)
private static readonly HashSet<string> _allowedSortFields = new(StringComparer.OrdinalIgnoreCase)
{
"createdAt", "updatedAt", "status", "batchType", "track"
};
public async Task<WorkQueueResponse> GetVerificationQueueAsync(
int page, int pageSize, string sortBy = "updatedAt", string sortDirection = "asc")
{
var query = _db.DigitizationBatches
.Where(b => b.Status == BatchStatus.PendingVerification)
.OrderBy(b => b.UpdatedAt);
.Where(b => b.Status == BatchStatus.PendingVerification);
return await BuildQueueResponseAsync("verification", query, page, pageSize);
return await BuildQueueResponseAsync("verification", query, page, pageSize, sortBy, sortDirection);
}
public async Task<WorkQueueResponse> GetEntryQueueAsync(int page, int pageSize)
public async Task<WorkQueueResponse> GetEntryQueueAsync(
int page, int pageSize, string sortBy = "updatedAt", string sortDirection = "asc")
{
var entryStatuses = new[]
{
BatchStatus.Uploaded,
BatchStatus.InEntry,
BatchStatus.Rejected
};
var query = _db.DigitizationBatches
.Where(b => entryStatuses.Contains(b.Status))
.OrderBy(b => b.UpdatedAt);
.Where(b => entryStatuses.Contains(b.Status));
return await BuildQueueResponseAsync("entry", query, page, pageSize);
return await BuildQueueResponseAsync("entry", query, page, pageSize, sortBy, sortDirection);
}
public async Task<WorkQueueResponse> GetClinicalApprovalQueueAsync(int page, int pageSize)
public async Task<WorkQueueResponse> GetClinicalApprovalQueueAsync(
int page, int pageSize, string sortBy = "updatedAt", string sortDirection = "asc")
{
var query = _db.DigitizationBatches
.Where(b => b.Status == BatchStatus.AwaitingClinicalApproval)
.OrderBy(b => b.UpdatedAt);
.Where(b => b.Status == BatchStatus.AwaitingClinicalApproval);
return await BuildQueueResponseAsync("clinical-approval", query, page, pageSize);
return await BuildQueueResponseAsync("clinical-approval", query, page, pageSize, sortBy, sortDirection);
}
private static IOrderedQueryable<DigitizationBatch> ApplySort(
IQueryable<DigitizationBatch> query, string sortBy, string sortDirection)
{
var desc = sortDirection.Equals("desc", StringComparison.OrdinalIgnoreCase);
return sortBy.ToLowerInvariant() switch
{
"createdat" => desc ? query.OrderByDescending(b => b.CreatedAt) : query.OrderBy(b => b.CreatedAt),
"updatedat" => desc ? query.OrderByDescending(b => b.UpdatedAt) : query.OrderBy(b => b.UpdatedAt),
"status" => desc ? query.OrderByDescending(b => b.Status) : query.OrderBy(b => b.Status),
"batchtype" => desc ? query.OrderByDescending(b => b.BatchType) : query.OrderBy(b => b.BatchType),
"track" => desc ? query.OrderByDescending(b => b.Track) : query.OrderBy(b => b.Track),
_ => query.OrderBy(b => b.UpdatedAt)
};
}
private async Task<WorkQueueResponse> BuildQueueResponseAsync(
string queueName,
IOrderedQueryable<DigitizationBatch> query,
IQueryable<DigitizationBatch> query,
int page,
int pageSize)
int pageSize,
string sortBy,
string sortDirection)
{
if (!_allowedSortFields.Contains(sortBy))
throw new ValidationException(
$"Invalid sortBy field '{sortBy}'. Allowed: {string.Join(", ", _allowedSortFields)}.",
"INVALID_SORT_FIELD");
var totalCount = await query.CountAsync();
var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);
var items = await query
var sorted = ApplySort(query, sortBy, sortDirection);
var items = await sorted
.Include(b => b.EnteredByUser)
.Include(b => b.Events)
.Skip((page - 1) * pageSize)