From c5dab807da72f3bad284d0d76ce810fd59cfacf3 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 3 Dec 2025 18:09:55 +0530 Subject: [PATCH] fix: platform based org navigation via direct url hit. --- .../organization-[organization]/+layout.ts | 83 +++++++++++++++++-- 1 file changed, 78 insertions(+), 5 deletions(-) diff --git a/src/routes/(console)/organization-[organization]/+layout.ts b/src/routes/(console)/organization-[organization]/+layout.ts index 9d140e85e..17878b5bd 100644 --- a/src/routes/(console)/organization-[organization]/+layout.ts +++ b/src/routes/(console)/organization-[organization]/+layout.ts @@ -2,7 +2,7 @@ import { Dependencies } from '$lib/constants'; import { failedInvoice } from '$lib/stores/billing'; import { isCloud } from '$lib/system'; import { sdk } from '$lib/stores/sdk'; -import { error } from '@sveltejs/kit'; +import { error, redirect } from '@sveltejs/kit'; import type { LayoutLoad } from './$types'; import Breadcrumbs from './breadcrumbs.svelte'; import Header from './header.svelte'; @@ -15,14 +15,17 @@ import type { Plan } from '$lib/sdk/billing'; import { loadAvailableRegions } from '$routes/(console)/regions'; import type { Organization } from '$lib/stores/organization'; import { resolvedProfile } from '$lib/profiles/index.svelte'; +import { resolve } from '$app/paths'; export const load: LayoutLoad = async ({ params, depends, parent }) => { - const { preferences: prefs } = await parent(); + const { organizations, preferences: prefs } = await parent(); depends(Dependencies.ORGANIZATION); depends(Dependencies.MEMBERS); depends(Dependencies.PAYMENT_METHODS); + const requestedOrg = await checkPlatformAndRedirect(params, organizations, prefs); + let roles = isCloud ? [] : defaultRoles; let scopes = isCloud ? [] : defaultScopes; let currentPlan: Plan = null; @@ -38,6 +41,7 @@ export const load: LayoutLoad = async ({ params, depends, parent }) => { loadFailedInvoices(params.organization); } } + if (prefs[resolvedProfile.organizationPrefKey] !== params.organization) { const newPrefs = { ...prefs, @@ -46,8 +50,13 @@ export const load: LayoutLoad = async ({ params, depends, parent }) => { sdk.forConsole.account.updatePrefs({ prefs: newPrefs }); } - const [organization, members, countryList, locale] = await Promise.all([ - sdk.forConsole.teams.get({ teamId: params.organization }) as Promise, + // fetch org only if we haven't already fetched it for platform check + const orgPromise: Promise = requestedOrg + ? Promise.resolve(requestedOrg) + : (sdk.forConsole.teams.get({ teamId: params.organization }) as Promise); + + const [org, members, countryList, locale] = await Promise.all([ + orgPromise, sdk.forConsole.teams.listMemberships({ teamId: params.organization }), sdk.forConsole.locale.listCountries(), sdk.forConsole.locale.get(), @@ -58,7 +67,7 @@ export const load: LayoutLoad = async ({ params, depends, parent }) => { return { header: Header, breadcrumbs: Breadcrumbs, - organization, + organization: org, currentPlan, members, roles, @@ -91,3 +100,67 @@ function loadFailedInvoices(teamId: string) { } }); } + +async function checkPlatformAndRedirect( + params: { organization: string }, + organizations: { teams: Organization[] }, + prefs: Record +): Promise { + // check if preloaded + let requestedOrg = organizations.teams.find((team) => team.$id === params.organization); + + // not found, load! + if (!requestedOrg) { + try { + requestedOrg = (await sdk.forConsole.teams.get({ + teamId: params.organization + })) as Organization; + } catch (e) { + return null; + } + } + + if (requestedOrg && requestedOrg.platform !== resolvedProfile.organizationPlatform) { + const orgIdInPrefs = prefs[resolvedProfile.organizationPrefKey]; + + // grab the first org with matching platform + const samePlatformOrganization = organizations.teams.find( + (team) => team.platform === resolvedProfile.organizationPlatform + ); + + // exists, lets redirect! + if (samePlatformOrganization) { + redirect( + 303, + resolve('/(console)/organization-[organization]', { + organization: samePlatformOrganization.$id + }) + ); + } + // not in list, check prefs + else if (orgIdInPrefs) { + try { + // check if exists and is valid + const orgFromPrefs = (await sdk.forConsole.teams.get({ + teamId: orgIdInPrefs + })) as Organization; + + // exists and is valid, redirect + redirect( + 303, + resolve('/(console)/organization-[organization]', { + organization: orgFromPrefs.$id + }) + ); + } catch (e) { + redirect(303, resolve('/(console)')); + } + } else { + redirect(303, resolve('/(console)')); + } + } + + // send the org, + // if already in the full list so we don't have to make another API request. + return requestedOrg; +}