Skip to content
Extraits de code Groupes Projets
hooks.server.ts 1,98 ko
Newer Older
  • Learn to ignore specific revisions
  • Brieuc Dubois's avatar
    Brieuc Dubois a validé
    import { type Handle, type RequestEvent } from '@sveltejs/kit';
    
    import { jwtDecode } from 'jwt-decode';
    import { type JWTContent } from '$lib/utils/login';
    
    import config from '$lib/config';
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    
    const PROXY_PATH = '/api';
    
    const handleApiProxy = async (event: RequestEvent, cookies: { name: string; value: string }[]) => {
    	const strippedPath = event.url.pathname.substring(PROXY_PATH.length);
    
    
    	console.log('redirect to ', `${config.API_URL}/v1${strippedPath}${event.url.search}`);
    	const urlPath = `${config.API_URL}/v1${strippedPath}${event.url.search}`;
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    	const proxiedUrl = new URL(urlPath);
    
    	event.request.headers.delete('connection');
    	event.request.headers.set('cookie', cookies.map((c) => `${c.name}=${c.value}`).join('; '));
    
    
    	return fetch(proxiedUrl.toString(), {
    		body: event.request.body,
    		method: event.request.method,
    		headers: event.request.headers,
    		// @ts-ignore: Duplex is missing
    		duplex: 'half'
    	}).catch((err: any) => {
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    		console.log('Could not proxy API request: ', err);
    		throw err;
    	});
    };
    
    
    export const handle: Handle = async ({ event, resolve }) => {
    
    	event.locals.user = null;
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    	event.locals.jwt = null;
    
    	event.locals.locale = 'fr';
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    	const cookies = event.cookies.getAll();
    
    	if (event.url.pathname.startsWith(PROXY_PATH)) {
    
    		console.log(event.url.pathname);
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    		return await handleApiProxy(event, cookies);
    	}
    
    	const jwt = event.cookies.get('access_token_cookie');
    	if (!jwt) {
    
    		return resolve(event);
    	}
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    	const decoded = jwtDecode<JWTContent>(jwt);
    
    	if (!decoded) {
    		return resolve(event);
    	}
    
    
    	const id = parseInt(decoded.subject.uid);
    
    	if (!id) {
    		return resolve(event);
    	}
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    	const response = await event.fetch(`/api/users/${id}`);
    	if (!response.ok) {
    		return resolve(event);
    	}
    
    	const user = await response.json();
    
    	if (!user) {
    		return resolve(event);
    	}
    
    	const localeCookie = event.cookies.get('locale');
    	const initLocale = localeCookie || event.locals.locale;
    
    
    Brieuc Dubois's avatar
    Brieuc Dubois a validé
    	event.locals.user = user;
    	event.locals.jwt = jwt;
    
    	event.locals.locale = initLocale;
    
    	return resolve(event);
    };