From fbd2efa994292e0f4e15d0ab4c5df718f529c933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kr=C3=BCger?= Date: Tue, 10 Mar 2026 11:49:50 +0100 Subject: [PATCH] feat: server-side pagination and filtering for admin queues page - Move queue, status, and offset to URL search params (?queue=&status=&offset=) - Load jobs server-side in +page.server.ts with auth token (matches other admin pages) - Derive total from adminQueues counts (waiting+active+completed+failed+delayed) so pagination knows total without an extra query - Add fetchFn/token params to getAdminQueueJobs for server-side use - Retry/remove/pause/resume actions now use invalidateAll() instead of local state Co-Authored-By: Claude Sonnet 4.6 --- packages/frontend/src/lib/services.ts | 13 +- .../src/routes/admin/queues/+page.server.ts | 34 ++- .../src/routes/admin/queues/+page.svelte | 207 +++++++++--------- 3 files changed, 145 insertions(+), 109 deletions(-) diff --git a/packages/frontend/src/lib/services.ts b/packages/frontend/src/lib/services.ts index 66125c3..5fbe506 100644 --- a/packages/frontend/src/lib/services.ts +++ b/packages/frontend/src/lib/services.ts @@ -1981,12 +1981,17 @@ export async function getAdminQueueJobs( status?: string, limit?: number, offset?: number, + fetchFn?: typeof globalThis.fetch, + token?: string, ): Promise { return loggedApiCall("getAdminQueueJobs", async () => { - const data = await getGraphQLClient().request<{ adminQueueJobs: Job[] }>( - ADMIN_QUEUE_JOBS_QUERY, - { queue, status, limit, offset }, - ); + const client = token ? getAuthClient(token, fetchFn) : getGraphQLClient(fetchFn); + const data = await client.request<{ adminQueueJobs: Job[] }>(ADMIN_QUEUE_JOBS_QUERY, { + queue, + status, + limit, + offset, + }); return data.adminQueueJobs; }); } diff --git a/packages/frontend/src/routes/admin/queues/+page.server.ts b/packages/frontend/src/routes/admin/queues/+page.server.ts index b214bbd..b8d3432 100644 --- a/packages/frontend/src/routes/admin/queues/+page.server.ts +++ b/packages/frontend/src/routes/admin/queues/+page.server.ts @@ -1,7 +1,35 @@ -import { getAdminQueues } from "$lib/services"; +import { getAdminQueues, getAdminQueueJobs } from "$lib/services"; -export async function load({ fetch, cookies }) { +const LIMIT = 25; + +export async function load({ fetch, cookies, url }) { const token = cookies.get("session_token") || ""; const queues = await getAdminQueues(fetch, token).catch(() => []); - return { queues }; + + const queueParam = url.searchParams.get("queue") ?? queues[0]?.name ?? null; + const status = url.searchParams.get("status") ?? null; + const offset = parseInt(url.searchParams.get("offset") ?? "0") || 0; + + let jobs: Awaited> = []; + let total = 0; + + if (queueParam) { + jobs = await getAdminQueueJobs( + queueParam, + status ?? undefined, + LIMIT, + offset, + fetch, + token, + ).catch(() => []); + + const queueInfo = queues.find((q) => q.name === queueParam); + if (queueInfo) { + const { waiting, active, completed, failed, delayed } = queueInfo.counts; + const counts: Record = { waiting, active, completed, failed, delayed }; + total = status ? (counts[status] ?? 0) : Object.values(counts).reduce((a, b) => a + b, 0); + } + } + + return { queues, queue: queueParam, status, jobs, total, offset, limit: LIMIT }; } diff --git a/packages/frontend/src/routes/admin/queues/+page.svelte b/packages/frontend/src/routes/admin/queues/+page.svelte index 6b408af..7ac55c2 100644 --- a/packages/frontend/src/routes/admin/queues/+page.svelte +++ b/packages/frontend/src/routes/admin/queues/+page.svelte @@ -1,14 +1,10 @@