forked from mirror/crumbs-original
38 lines
1.0 KiB
TypeScript
38 lines
1.0 KiB
TypeScript
import type { Handle } from '@sveltejs/kit';
|
|
import { redirect } from '@sveltejs/kit';
|
|
import { validateSession, isSetupComplete } from '$lib/server/auth.js';
|
|
|
|
const PUBLIC_PATHS = ['/login', '/setup', '/api/auth/login', '/api/auth/setup'];
|
|
|
|
export const handle: Handle = async ({ event, resolve }) => {
|
|
const { pathname } = event.url;
|
|
|
|
// Allow public paths
|
|
if (PUBLIC_PATHS.some((p) => pathname.startsWith(p))) {
|
|
return resolve(event);
|
|
}
|
|
|
|
// Check if setup is complete
|
|
const setupDone = await isSetupComplete();
|
|
if (!setupDone) {
|
|
if (pathname !== '/setup') {
|
|
throw redirect(302, '/setup');
|
|
}
|
|
return resolve(event);
|
|
}
|
|
|
|
// Validate session
|
|
const sessionToken = event.cookies.get('session');
|
|
if (!sessionToken || !(await validateSession(sessionToken))) {
|
|
if (pathname.startsWith('/api/')) {
|
|
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
|
|
status: 401,
|
|
headers: { 'Content-Type': 'application/json' }
|
|
});
|
|
}
|
|
throw redirect(302, '/login');
|
|
}
|
|
|
|
return resolve(event);
|
|
};
|