This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
import { redirect } from '@sveltejs/kit';
|
||||
import PocketBase from 'pocketbase';
|
||||
import type { Handle } from '@sveltejs/kit';
|
||||
|
||||
const POCKETBASE_URL =
|
||||
process.env.VITE_POCKETBASE_URL ?? 'https://pocketbase.ccllc.pro';
|
||||
const LOGIN_PATH = '/login';
|
||||
const LOGOUT_PATH = '/logout';
|
||||
|
||||
function isPublicRoute(pathname: string): boolean {
|
||||
return (
|
||||
pathname === LOGIN_PATH ||
|
||||
pathname.startsWith(LOGIN_PATH + '/') ||
|
||||
pathname === LOGOUT_PATH
|
||||
);
|
||||
}
|
||||
|
||||
export const handle: Handle = async ({ event, resolve }) => {
|
||||
event.locals.pb = new PocketBase(POCKETBASE_URL);
|
||||
event.locals.pb.authStore.loadFromCookie(event.request.headers.get('cookie') ?? '');
|
||||
|
||||
try {
|
||||
if (event.locals.pb.authStore.isValid) {
|
||||
await event.locals.pb.collection('users').authRefresh();
|
||||
}
|
||||
} catch {
|
||||
event.locals.pb.authStore.clear();
|
||||
}
|
||||
|
||||
const record = event.locals.pb.authStore.record;
|
||||
event.locals.user = record
|
||||
? {
|
||||
id: record.id,
|
||||
email: record.email,
|
||||
name: record.name,
|
||||
avatar: record.avatar,
|
||||
darkmode: !!record.darkmode
|
||||
}
|
||||
: null;
|
||||
|
||||
if (!event.locals.user && !isPublicRoute(event.url.pathname)) {
|
||||
const redirectTo = event.url.pathname + event.url.search;
|
||||
const loginUrl =
|
||||
redirectTo && redirectTo !== '/'
|
||||
? `${LOGIN_PATH}?redirectTo=${encodeURIComponent(redirectTo)}`
|
||||
: LOGIN_PATH;
|
||||
throw redirect(303, loginUrl);
|
||||
}
|
||||
|
||||
const response = await resolve(event);
|
||||
response.headers.append(
|
||||
'set-cookie',
|
||||
event.locals.pb.authStore.exportToCookie({ httpOnly: false, sameSite: 'Lax' })
|
||||
);
|
||||
return response;
|
||||
};
|
||||
Reference in New Issue
Block a user