38 lines
1.0 KiB
TypeScript
38 lines
1.0 KiB
TypeScript
import { ApiClient } from '$lib/server/api';
|
|
import { validateToken } from '$lib/server/auth';
|
|
import { redirect, type Handle } from '@sveltejs/kit';
|
|
import { sequence } from '@sveltejs/kit/hooks';
|
|
|
|
const authHandle: Handle = async ({ event, resolve }) => {
|
|
// Get auth token from cookies
|
|
const authToken = event.cookies.get('authToken');
|
|
|
|
if (authToken) {
|
|
// Validate the token
|
|
const api = new ApiClient(authToken);
|
|
const user = await validateToken(api);
|
|
|
|
if (user) {
|
|
// Token is valid
|
|
event.locals.user = user;
|
|
event.locals.authToken = authToken;
|
|
event.locals.api = api;
|
|
} else {
|
|
// Token invalid, clear auth cookie
|
|
event.cookies.delete('authToken', { path: '/' });
|
|
}
|
|
}
|
|
|
|
return resolve(event);
|
|
};
|
|
|
|
const protectedRoutesHandle: Handle = async ({ event, resolve }) => {
|
|
const isProtectedRoute = !event.url.pathname.startsWith('/login');
|
|
|
|
if (isProtectedRoute && !event.locals.user) throw redirect(303, '/login');
|
|
|
|
return resolve(event);
|
|
};
|
|
|
|
export const handle = sequence(authHandle, protectedRoutesHandle);
|