From 30c157468e2bba0da8391e905ba6fb5f2602de41 Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Thu, 12 Mar 2026 08:57:39 +0100 Subject: [PATCH] chore: debug cookies better --- apps/dashboard/src/hooks.server.ts | 5 ++++- apps/dashboard/src/lib/features/app/init.svelte.ts | 5 +++++ apps/dashboard/src/lib/utils/functions/cookies.ts | 13 +++++++++++++ apps/dashboard/src/lib/utils/services/api/index.ts | 7 ++----- apps/dashboard/src/routes/+layout.svelte | 4 ++-- 5 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 apps/dashboard/src/lib/utils/functions/cookies.ts diff --git a/apps/dashboard/src/hooks.server.ts b/apps/dashboard/src/hooks.server.ts index 0731c4ae..87b85d41 100644 --- a/apps/dashboard/src/hooks.server.ts +++ b/apps/dashboard/src/hooks.server.ts @@ -1,4 +1,5 @@ import { getSessionData } from '$lib/utils/services/auth/session'; +import { getCioCookieString } from '$lib/utils/functions/cookies'; import { type Handle, redirect } from '@sveltejs/kit'; import { isPublicApiRoute, isPublicRoute } from '$lib/utils/functions/routes/isPublicRoute'; import { ROUTE } from '$lib/utils/constants/routes'; @@ -22,12 +23,14 @@ export const handle: Handle = async (args) => { const handlePagesRoutes: Handle = async ({ event, resolve }) => { const { pathname } = event.url; + const hasCioCookie = Boolean(getCioCookieString(event.cookies)); if (isPublicRoute(pathname)) { return resolve(event); } - if (!event.locals.user) { + if (!event.locals.user && !hasCioCookie) { + console.log('no user and no cio cookie, redirecting to login'); const shouldAddRedirectParam = !pathname.includes(ROUTE.LOGOUT); const fullPath = pathname + event.url.search; const redirectPath = shouldAddRedirectParam diff --git a/apps/dashboard/src/lib/features/app/init.svelte.ts b/apps/dashboard/src/lib/features/app/init.svelte.ts index 1b90c18c..0788b9cf 100644 --- a/apps/dashboard/src/lib/features/app/init.svelte.ts +++ b/apps/dashboard/src/lib/features/app/init.svelte.ts @@ -111,6 +111,7 @@ class AppInitApi extends BaseApi { const redirect = page.url.searchParams.get('redirect'); if (redirect) { + console.log('redirecting to', redirect); // goto redirect won't accept dynamic url so we need to use window.location.href window.location.href = redirect; return; @@ -118,6 +119,7 @@ class AppInitApi extends BaseApi { // This allows you to be on the landing page of an organization site and not be redirected if (isOrgSite && window.location.pathname === '/') { + console.log('no redirect is needed'); return; } @@ -130,11 +132,13 @@ class AppInitApi extends BaseApi { if (isCloud) { const shouldRedirectToOnboarding = !userHasOrganizations && !isOrgSite; if (shouldRedirectToOnboarding) { + console.log('cloud: redirecting to onboarding'); return goto(resolve(`/onboarding`, {})); } } else { // Self-hosted: when user has no orgs, route to /onboarding if (!userHasOrganizations) { + console.log('self-hosted: redirecting to onboarding'); return goto(resolve(`/onboarding`, {})); } } @@ -142,6 +146,7 @@ class AppInitApi extends BaseApi { if (!shouldRedirectOnAuth(page.url.pathname)) return; const shouldGoToLMS = isCloud ? isOrgSite || !!isStudent : !!isStudent; + console.log('redirecting to', shouldGoToLMS ? 'lms' : 'org'); return shouldGoToLMS ? this.goToLMS() : this.goToOrg(); } diff --git a/apps/dashboard/src/lib/utils/functions/cookies.ts b/apps/dashboard/src/lib/utils/functions/cookies.ts new file mode 100644 index 00000000..a968d4f0 --- /dev/null +++ b/apps/dashboard/src/lib/utils/functions/cookies.ts @@ -0,0 +1,13 @@ +import type { Cookies } from '@sveltejs/kit'; + +/** + * Returns the classroomio cookie string for API/auth requests. + * Filters cookies whose names include "classroomio" and joins them as `name=value; ...`. + */ +export function getCioCookieString(cookies: Cookies): string { + return cookies + .getAll() + .filter((c) => c.name.includes('classroomio')) + .map((c) => `${c.name}=${c.value}`) + .join('; '); +} diff --git a/apps/dashboard/src/lib/utils/services/api/index.ts b/apps/dashboard/src/lib/utils/services/api/index.ts index 328bb4f0..fffbaa7d 100644 --- a/apps/dashboard/src/lib/utils/services/api/index.ts +++ b/apps/dashboard/src/lib/utils/services/api/index.ts @@ -7,6 +7,7 @@ import { get } from 'svelte/store'; import { currentOrg } from '$lib/utils/store/org'; import type { Cookies } from '@sveltejs/kit'; import { env } from '$env/dynamic/public'; +import { getCioCookieString } from '$lib/utils/functions/cookies'; export const getRequestBaseUrl = () => { if (typeof window === 'undefined') { @@ -221,11 +222,7 @@ export function getApiHeaders( cookies: Cookies, orgId?: string ): { headers: { cookie: string; 'cio-org-id'?: string } } { - const cioCookies = cookies - .getAll() - .filter((c) => c.name.includes('classroomio')) - .map((c) => `${c.name}=${c.value}`) - .join('; '); + const cioCookies = getCioCookieString(cookies); console.log('cioCookies', cioCookies); console.log('cookies', cookies.getAll()); diff --git a/apps/dashboard/src/routes/+layout.svelte b/apps/dashboard/src/routes/+layout.svelte index 0a62179b..a34158bf 100644 --- a/apps/dashboard/src/routes/+layout.svelte +++ b/apps/dashboard/src/routes/+layout.svelte @@ -79,7 +79,7 @@ const isSessionReady = $derived(!$session.isPending && !$session.isRefetching && $session.data); // The goal of this effect is to make sure that we do a redirect to /login if the session data is expired - // This should be happening on the hooks.server.ts but we've made the home page public so we can show a loading spinner while the app is initializing OR an error message if the backend is down. + // This should be happening on the hooks.server.ts (if there is no cookie) but we've made the home page public so we can show a loading spinner while the app is initializing OR an error message if the backend is down. $effect(() => { if ($session.isPending || $session.isRefetching || !!$session.data) { console.log('session is pending or refetching'); @@ -91,7 +91,7 @@ return; } - if (!$session.data && path !== '/login') { + if (!$session.data && !path.startsWith('/login')) { console.log('session data is not available, go to login'); window.location.href = '/login'; }