From 7c209e3270fb2715d2f45f0b732e898dd5a962ca Mon Sep 17 00:00:00 2001 From: Joerg Date: Wed, 21 Jan 2026 17:49:27 +0100 Subject: [PATCH] fix: correct last-sync date and logout redirect issues - Fix admin users last-sync showing 1970 instead of actual sync date - Changed from MAX(qsos.createdAt) to MAX(syncJobs.completedAt) - Added timestamp conversion (seconds to milliseconds) for proper Date serialization - Fix logout redirect not working from admin dashboard - Changed from goto() to window.location.href for hard redirect - Ensures proper navigation after auth state changes Co-Authored-By: Claude --- src/backend/services/admin.service.js | 13 +++++++++++-- src/frontend/src/routes/+layout.svelte | 6 +++++- src/frontend/src/routes/settings/+page.svelte | 6 +++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/backend/services/admin.service.js b/src/backend/services/admin.service.js index 7157d0b..78db10d 100644 --- a/src/backend/services/admin.service.js +++ b/src/backend/services/admin.service.js @@ -127,7 +127,12 @@ export async function getUserStats() { lotwConfirmed: sql`CAST(SUM(CASE WHEN ${qsos.lotwQslRstatus} = 'Y' THEN 1 ELSE 0 END) AS INTEGER)`, dclConfirmed: sql`CAST(SUM(CASE WHEN ${qsos.dclQslRstatus} = 'Y' THEN 1 ELSE 0 END) AS INTEGER)`, totalConfirmed: sql`CAST(SUM(CASE WHEN ${qsos.lotwQslRstatus} = 'Y' OR ${qsos.dclQslRstatus} = 'Y' THEN 1 ELSE 0 END) AS INTEGER)`, - lastSync: sql`MAX(${qsos.createdAt})`, + lastSync: sql`( + SELECT MAX(${syncJobs.completedAt}) + FROM ${syncJobs} + WHERE ${syncJobs.userId} = ${users.id} + AND ${syncJobs.status} = 'completed' + )`.mapWith(Number), createdAt: users.createdAt, }) .from(users) @@ -135,7 +140,11 @@ export async function getUserStats() { .groupBy(users.id) .orderBy(sql`COUNT(${qsos.id}) DESC`); - return stats; + // Convert lastSync timestamps (seconds) to Date objects for JSON serialization + return stats.map(stat => ({ + ...stat, + lastSync: stat.lastSync ? new Date(stat.lastSync * 1000) : null, + })); } /** diff --git a/src/frontend/src/routes/+layout.svelte b/src/frontend/src/routes/+layout.svelte index 21fc742..96a1573 100644 --- a/src/frontend/src/routes/+layout.svelte +++ b/src/frontend/src/routes/+layout.svelte @@ -5,7 +5,11 @@ function handleLogout() { auth.logout(); - goto('/auth/login'); + // Use hard redirect to ensure proper navigation after logout + // goto() may not work properly due to SvelteKit client-side routing + if (browser) { + window.location.href = '/auth/login'; + } } diff --git a/src/frontend/src/routes/settings/+page.svelte b/src/frontend/src/routes/settings/+page.svelte index a666e6d..195d436 100644 --- a/src/frontend/src/routes/settings/+page.svelte +++ b/src/frontend/src/routes/settings/+page.svelte @@ -1,5 +1,6 @@