mirror of
https://github.com/nikdoof/pocket-id.git
synced 2025-12-14 15:22:18 +00:00
68 lines
1.9 KiB
TypeScript
68 lines
1.9 KiB
TypeScript
import { env } from '$env/dynamic/private';
|
|
import type { Handle, HandleServerError } from '@sveltejs/kit';
|
|
import { AxiosError } from 'axios';
|
|
import jwt from 'jsonwebtoken';
|
|
|
|
// Workaround so that we can also import this environment variable into client-side code
|
|
// If we would directly import $env/dynamic/private into the api-service.ts file, it would throw an error
|
|
// this is still secure as process will just be undefined in the browser
|
|
process.env.INTERNAL_BACKEND_URL = env.INTERNAL_BACKEND_URL ?? 'http://localhost:8080';
|
|
|
|
export const handle: Handle = async ({ event, resolve }) => {
|
|
const accessToken = event.cookies.get('access_token');
|
|
|
|
let isSignedIn: boolean = false;
|
|
let isAdmin: boolean = false;
|
|
|
|
if (accessToken) {
|
|
const jwtPayload = jwt.decode(accessToken, { json: true });
|
|
if (jwtPayload?.exp && jwtPayload.exp * 1000 > Date.now()) {
|
|
isSignedIn = true;
|
|
isAdmin = jwtPayload?.isAdmin || false;
|
|
}
|
|
}
|
|
|
|
if (event.url.pathname.startsWith('/settings') && !event.url.pathname.startsWith('/login')) {
|
|
if (!isSignedIn) {
|
|
return new Response(null, {
|
|
status: 302,
|
|
headers: { location: '/login' }
|
|
});
|
|
}
|
|
}
|
|
|
|
if (event.url.pathname.startsWith('/login') && isSignedIn) {
|
|
return new Response(null, {
|
|
status: 302,
|
|
headers: { location: '/settings' }
|
|
});
|
|
}
|
|
|
|
if (event.url.pathname.startsWith('/settings/admin') && !isAdmin) {
|
|
return new Response(null, {
|
|
status: 302,
|
|
headers: { location: '/settings' }
|
|
});
|
|
}
|
|
|
|
const response = await resolve(event);
|
|
return response;
|
|
};
|
|
|
|
export const handleError: HandleServerError = async ({ error, message, status }) => {
|
|
if (error instanceof AxiosError) {
|
|
message = error.response?.data.error || message;
|
|
status = error.response?.status || status;
|
|
console.error(
|
|
`Axios error: ${error.request.path} - ${error.response?.data.error ?? error.message}`
|
|
);
|
|
} else {
|
|
console.error(error);
|
|
}
|
|
|
|
return {
|
|
message,
|
|
status
|
|
};
|
|
};
|