From bbe9184f5490c29a2e354359db058675a96cf1d3 Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Wed, 15 Jan 2025 15:29:41 -0500 Subject: [PATCH] load user env --- src/app.d.ts | 4 ++ src/hooks.server.ts | 4 +- src/lib/server/middleware/index.ts | 1 + src/lib/server/middleware/server/index.ts | 1 + .../server/middleware/server/loadUserEnv.ts | 40 +++++++++++++++++++ src/routes/app/settings/+page.server.ts | 2 +- 6 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/lib/server/middleware/index.ts create mode 100644 src/lib/server/middleware/server/index.ts create mode 100644 src/lib/server/middleware/server/loadUserEnv.ts diff --git a/src/app.d.ts b/src/app.d.ts index 086138d..5aa6da4 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,5 +1,7 @@ // See https://svelte.dev/docs/kit/types#app.d.ts +import type { Tenant, User } from '@prisma/client'; + // for information about these interfaces declare global { namespace App { @@ -10,6 +12,8 @@ declare global { orgId?: string | null; sessionId?: string; }; + user: User; + tenant: Tenant; } // interface PageData {} // interface PageState {} diff --git a/src/hooks.server.ts b/src/hooks.server.ts index e182571..5d5908e 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,3 +1,5 @@ +import { loadUserEnv } from '$lib/server/middleware'; +import { sequence } from '@sveltejs/kit/hooks'; import { withClerkHandler } from 'clerk-sveltekit/server'; -export const handle = withClerkHandler(); +export const handle = sequence(withClerkHandler(), loadUserEnv()); diff --git a/src/lib/server/middleware/index.ts b/src/lib/server/middleware/index.ts new file mode 100644 index 0000000..0ce5251 --- /dev/null +++ b/src/lib/server/middleware/index.ts @@ -0,0 +1 @@ +export * from './server'; diff --git a/src/lib/server/middleware/server/index.ts b/src/lib/server/middleware/server/index.ts new file mode 100644 index 0000000..2bcd448 --- /dev/null +++ b/src/lib/server/middleware/server/index.ts @@ -0,0 +1 @@ +export * from './loadUserEnv'; diff --git a/src/lib/server/middleware/server/loadUserEnv.ts b/src/lib/server/middleware/server/loadUserEnv.ts new file mode 100644 index 0000000..78630a0 --- /dev/null +++ b/src/lib/server/middleware/server/loadUserEnv.ts @@ -0,0 +1,40 @@ +import { logger } from '$lib/server/logger'; +import { prisma } from '$lib/server/prisma'; +import type { Handle } from '@sveltejs/kit'; + +const unAuthedRoutes = ['/login']; + +export function loadUserEnv(): Handle { + return async ({ event, resolve }) => { + if (event.route.id === null || unAuthedRoutes.includes(event.route.id)) { + return resolve(event); + } + try { + const tenant = await prisma.tenant.findUniqueOrThrow({ + where: { + clerkOrganizationId: event.locals.auth.orgId ?? undefined, + }, + }); + const user = await prisma.user.findUniqueOrThrow({ + where: { + clerkId_tenantId: { clerkId: event.locals.auth.userId!, tenantId: tenant.id }, + }, + }); + + event.locals.tenant = tenant; + event.locals.user = user; + } catch (error) { + if (error instanceof Error) { + logger.error(error.message); + } + return new Response(null, { + status: 307, + headers: { + location: '/login', + }, + }); + } + + return resolve(event); + }; +} diff --git a/src/routes/app/settings/+page.server.ts b/src/routes/app/settings/+page.server.ts index 2c60456..6586588 100644 --- a/src/routes/app/settings/+page.server.ts +++ b/src/routes/app/settings/+page.server.ts @@ -21,7 +21,7 @@ export const load = async (event) => { export const actions = { update: async (event) => { const form = await event.request.formData(); - const tenantId = event.locals.auth!.orgId!; + const tenantId = event.locals.tenant.id; if (!form.has('accountSID')) { return fail(400, { error: 'account_sid_missing' });