Do Pagination missing sortBy and sortDirection parameters
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user