speed up the load times

This commit is contained in:
Fran Jurmanović
2025-07-01 21:41:24 +02:00
parent 995b3e6a63
commit 7ae883411b
4 changed files with 53 additions and 31 deletions

View File

@@ -18,7 +18,7 @@ async function fetchAPI(endpoint: string, method: string = 'GET', body?: object,
}); });
if (!response.ok) { if (!response.ok) {
if (endpoint != '/api' && response.status == 401) { if (response.status == 401) {
authStore.set({ authStore.set({
username: undefined, username: undefined,
password: undefined, password: undefined,
@@ -40,11 +40,15 @@ export async function fetchAPIEvent(
method: string = 'GET', method: string = 'GET',
body?: object body?: object
) { ) {
const { if (!event.cookies) {
data: { token } redirect(308, '/login');
} = await redisSessionManager.getSession(event.cookies); }
const session = await redisSessionManager.getSession(event.cookies);
if (!session?.data?.token) {
redirect(308, '/login');
}
return fetchAPI(endpoint, method, body, { Authorization: `Bearer ${token}` }); return fetchAPI(endpoint, method, body, { Authorization: `Bearer ${session.data.token}` });
} }
export default fetchAPI; export default fetchAPI;

View File

@@ -3,6 +3,14 @@ import { redisSessionManager } from '$stores/redisSessionManager';
import { env } from '$env/dynamic/private'; import { env } from '$env/dynamic/private';
import type Redis from 'ioredis'; import type Redis from 'ioredis';
const USER_CACHE_DURATION = 15 * 60 * 1000; // 15 minutes
interface SessionData {
token?: string;
user?: any;
userFetchedAt?: number;
}
export const handle: Handle = async ({ event, resolve }) => { export const handle: Handle = async ({ event, resolve }) => {
// Ensure redis is connected // Ensure redis is connected
const redisClient: Redis = redisSessionManager['redisClient']; const redisClient: Redis = redisSessionManager['redisClient'];
@@ -11,28 +19,45 @@ export const handle: Handle = async ({ event, resolve }) => {
await redisClient.connect(); await redisClient.connect();
} catch (err) { } catch (err) {
console.error('Redis connection failed', err); console.error('Redis connection failed', err);
// We can still continue without a user session, but log the error.
} }
} }
// Get session from cookie // Get session from cookie
const session = await redisSessionManager.getSession(event.cookies); const session = await redisSessionManager.getSession(event.cookies);
const sessionData: SessionData = session?.data || {};
if (session && session.data && session.data.token) { if (!sessionData.token) {
event.locals.user = null;
return resolve(event);
}
// Check if cached user data is still valid
if (sessionData.user && sessionData.userFetchedAt) {
const isExpired = Date.now() - sessionData.userFetchedAt > USER_CACHE_DURATION;
if (!isExpired) {
event.locals.user = sessionData.user;
return resolve(event);
}
}
// Fetch fresh user data
try { try {
// Fetch user data from /api/me
const response = await fetch(`${env.API_BASE_URL}/auth/me`, { const response = await fetch(`${env.API_BASE_URL}/auth/me`, {
headers: { headers: {
Authorization: `Bearer ${session.data.token}` Authorization: `Bearer ${sessionData.token}`
} }
}); });
if (response.ok) { if (response.ok) {
const user = await response.json(); const user = await response.json();
event.locals.user = user; event.locals.user = user;
// Cache user data in session
sessionData.user = user;
sessionData.userFetchedAt = Date.now();
await redisSessionManager.createSession(event.cookies, sessionData, user.id);
} else { } else {
console.log(await response.text(), response.status); // Token invalid, clear session
// Token might be invalid/expired, clear it
event.locals.user = null; event.locals.user = null;
await redisSessionManager.deleteCookie(event.cookies); await redisSessionManager.deleteCookie(event.cookies);
} }
@@ -40,9 +65,6 @@ export const handle: Handle = async ({ event, resolve }) => {
console.error('Failed to fetch user:', error); console.error('Failed to fetch user:', error);
event.locals.user = null; event.locals.user = null;
} }
} else {
event.locals.user = null;
}
return resolve(event); return resolve(event);
}; };

View File

@@ -3,8 +3,6 @@ import { getServers, restartService, startService, stopService } from '$api/serv
import { fail, redirect, type Actions, type RequestEvent } from '@sveltejs/kit'; import { fail, redirect, type Actions, type RequestEvent } from '@sveltejs/kit';
export const load = async (event: RequestEvent) => { export const load = async (event: RequestEvent) => {
const isAuth = await checkAuth(event);
if (!isAuth) return redirect(308, '/login');
const servers = await getServers(event); const servers = await getServers(event);
return { servers }; return { servers };
}; };

View File

@@ -15,8 +15,6 @@ import { subDays, formatISO } from 'date-fns';
import { UTCDate } from '@date-fns/utc'; import { UTCDate } from '@date-fns/utc';
export const load = async (event: RequestEvent) => { export const load = async (event: RequestEvent) => {
const isAuth = await checkAuth(event);
if (!isAuth) return redirect(308, '/login');
if (!event.params.id) return redirect(308, '/dashboard'); if (!event.params.id) return redirect(308, '/dashboard');
const today = new UTCDate(); const today = new UTCDate();
const endDate = formatISO(today); const endDate = formatISO(today);