From 3c1260340412e6512cf89844bdc6d2a05f3685c2 Mon Sep 17 00:00:00 2001 From: glazk0 <43091603+glazk0@users.noreply.github.com> Date: Mon, 1 Apr 2024 00:32:47 +0200 Subject: [PATCH] Interceptors --- src/app.d.ts | 8 +++-- src/hooks.server.ts | 31 ++++++++++++++++++- src/routes/(app)/+page.server.ts | 10 ++---- src/routes/(app)/chapters/+page.server.ts | 10 ++---- .../chapters/[chapterId]/+page.server.ts | 10 ++---- .../[chapterId]/groups/+page.server.ts | 31 +++---------------- .../[chapterId]/groups/new/+page.server.ts | 7 +---- .../[chapterId]/leaderboard/+page.server.ts | 10 ++---- .../puzzle/[puzzleId]/+page.server.ts | 22 ++++++------- src/routes/(app)/leaderboard/+page.server.ts | 10 ++---- src/routes/(app)/settings/+layout.svelte | 10 +++++- src/routes/(app)/settings/+page.server.ts | 7 +---- src/routes/+error.svelte | 14 +++++++++ 13 files changed, 86 insertions(+), 94 deletions(-) create mode 100644 src/routes/+error.svelte diff --git a/src/app.d.ts b/src/app.d.ts index 276009c..b1bfd97 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -5,7 +5,10 @@ import type { User } from '$lib/types'; // for information about these interfaces declare global { namespace App { - // interface Error {} + interface Error { + message: string; + errorId: string; + } interface Locals { user: User | null; } @@ -16,4 +19,5 @@ declare global { } } -export {}; +export { }; + diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 8e87a4b..8814496 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,4 +1,4 @@ -import type { Handle } from '@sveltejs/kit'; +import type { Handle, HandleFetch, HandleServerError } from '@sveltejs/kit'; import { API_URL } from '$env/static/private'; @@ -30,3 +30,32 @@ export const handle: Handle = async ({ event, resolve }) => { return resolve(event); }; + +export const handleFetch: HandleFetch = async ({ request, fetch, event: { cookies } }) => { + + const session = cookies.get('session'); + + if (!session) { + return fetch(request); + } + + request = new Request(request, { + headers: { + ...request.headers, + Authorization: `Bearer ${session}` + }, + }); + + return fetch(request); +} + +export const handleError: HandleServerError = async ({ error, status }) => { + const errorId = crypto.randomUUID(); + + console.error(`Error ID: ${errorId} - Status: ${status} - ${error}`); + + return { + message: 'Whoops!', + errorId, + }; +}; diff --git a/src/routes/(app)/+page.server.ts b/src/routes/(app)/+page.server.ts index bbb84fd..5836b73 100644 --- a/src/routes/(app)/+page.server.ts +++ b/src/routes/(app)/+page.server.ts @@ -6,17 +6,11 @@ import type { PageServerLoad } from './$types'; import type { Chapter } from '$lib/types'; import { handleRedirect } from '$lib/utils'; -export const load = (async ({ url, fetch, cookies, locals: { user } }) => { +export const load = (async ({ url, fetch, locals: { user } }) => { if (!user) redirect(302, handleRedirect('login', url)); - const session = cookies.get('session'); - - const res = await fetch(`${API_URL}/chapters`, { - headers: { - Authorization: `Bearer ${session}` - } - }); + const res = await fetch(`${API_URL}/chapters`); if (!res.ok) { return { diff --git a/src/routes/(app)/chapters/+page.server.ts b/src/routes/(app)/chapters/+page.server.ts index 2e407f9..306f8fb 100644 --- a/src/routes/(app)/chapters/+page.server.ts +++ b/src/routes/(app)/chapters/+page.server.ts @@ -6,17 +6,11 @@ import type { PageServerLoad } from './$types'; import type { Chapter } from '$lib/types'; import { handleRedirect } from '$lib/utils'; -export const load = (async ({ url, locals: { user }, fetch, cookies }) => { +export const load = (async ({ url, locals: { user }, fetch }) => { if (!user) redirect(302, handleRedirect('login', url)); - const session = cookies.get('session'); - - const res = await fetch(`${API_URL}/chapters`, { - headers: { - Authorization: `Bearer ${session}` - } - }); + const res = await fetch(`${API_URL}/chapters`); if (!res.ok) { return { diff --git a/src/routes/(app)/chapters/[chapterId]/+page.server.ts b/src/routes/(app)/chapters/[chapterId]/+page.server.ts index d37de34..f43be00 100644 --- a/src/routes/(app)/chapters/[chapterId]/+page.server.ts +++ b/src/routes/(app)/chapters/[chapterId]/+page.server.ts @@ -6,17 +6,11 @@ import type { Chapter } from '$lib/types'; import { handleRedirect } from '$lib/utils'; import { redirect } from '@sveltejs/kit'; -export const load = (async ({ url, locals: { user }, fetch, cookies, params: { chapterId } }) => { +export const load = (async ({ url, locals: { user }, fetch, params: { chapterId } }) => { if (!user) redirect(302, handleRedirect('login', url)); - const session = cookies.get('session'); - - const res = await fetch(`${API_URL}/chapter/${chapterId}`, { - headers: { - Authorization: `Bearer ${session}` - } - }); + const res = await fetch(`${API_URL}/chapter/${chapterId}`); if (!res.ok) { redirect(302, '/chapters'); diff --git a/src/routes/(app)/chapters/[chapterId]/groups/+page.server.ts b/src/routes/(app)/chapters/[chapterId]/groups/+page.server.ts index 2d2a3ea..801fef8 100644 --- a/src/routes/(app)/chapters/[chapterId]/groups/+page.server.ts +++ b/src/routes/(app)/chapters/[chapterId]/groups/+page.server.ts @@ -6,17 +6,11 @@ import type { Chapter, Group } from '$lib/types'; import { handleRedirect } from '$lib/utils'; import { redirect } from '@sveltejs/kit'; -export const load: PageServerLoad = async ({ url, locals: { user }, fetch, cookies, params: { chapterId } }) => { +export const load: PageServerLoad = async ({ url, locals: { user }, fetch, params: { chapterId } }) => { if (!user) redirect(302, handleRedirect('login', url)); - const session = cookies.get('session'); - - let res = await fetch(`${API_URL}/chapter/${chapterId}`, { - headers: { - Authorization: `Bearer ${session}` - } - }); + let res = await fetch(`${API_URL}/chapter/${chapterId}`); if (!res.ok) { redirect(302, '/chapters'); @@ -28,12 +22,7 @@ export const load: PageServerLoad = async ({ url, locals: { user }, fetch, cooki redirect(302, '/chapters'); } - res = await fetch(`${API_URL}/groups/${chapter.id}`, { - headers: - { - Authorization: `Bearer ${session}` - } - }); + res = await fetch(`${API_URL}/groups/${chapter.id}`); if (!res.ok) { redirect(302, `/chapters/${chapterId}`); @@ -50,19 +39,14 @@ export const load: PageServerLoad = async ({ url, locals: { user }, fetch, cooki export const actions: Actions = { - join: async ({ fetch, params: { chapterId }, cookies, request }) => { + join: async ({ fetch, params: { chapterId }, request }) => { const data = await request.formData(); const name = data.get('name') as string; - const session = cookies.get('session'); - const res = await fetch(`${API_URL}/groupJoin`, { method: 'POST', - headers: { - Authorization: `Bearer ${session}` - }, body: JSON.stringify({ name, chapter: parseInt(chapterId), @@ -95,19 +79,14 @@ export const actions: Actions = { message: "Une erreur s'est produite" }; }, - leave: async ({ fetch, params: { chapterId }, cookies, request }) => { + leave: async ({ fetch, params: { chapterId }, request }) => { const data = await request.formData(); const name = data.get('name') as string; - const session = cookies.get('session'); - const res = await fetch(`${API_URL}/groupQuit`, { method: 'POST', - headers: { - Authorization: `Bearer ${session}` - }, body: JSON.stringify({ name, chapter: parseInt(chapterId), diff --git a/src/routes/(app)/chapters/[chapterId]/groups/new/+page.server.ts b/src/routes/(app)/chapters/[chapterId]/groups/new/+page.server.ts index d35e38e..bfe3c0d 100644 --- a/src/routes/(app)/chapters/[chapterId]/groups/new/+page.server.ts +++ b/src/routes/(app)/chapters/[chapterId]/groups/new/+page.server.ts @@ -25,14 +25,12 @@ export const load: PageServerLoad = async ({ url, params: { chapterId }, locals: }; export const actions: Actions = { - default: async ({ url, locals: { user }, fetch, request, cookies, params: { chapterId } }) => { + default: async ({ url, locals: { user }, fetch, request, params: { chapterId } }) => { if (!user) redirect(302, handleRedirect('login', url)); if (!chapterId) redirect(302, '/chapters'); - const session = cookies.get('session'); - const form = await superValidate(request, zod(groupSchema)); if (!form.valid) { @@ -41,9 +39,6 @@ export const actions: Actions = { const res = await fetch(`${API_URL}/groupCreate`, { method: 'POST', - headers: { - Authorization: `Bearer ${session}` - }, body: JSON.stringify({ ...form.data, chapter: parseInt(chapterId) diff --git a/src/routes/(app)/chapters/[chapterId]/leaderboard/+page.server.ts b/src/routes/(app)/chapters/[chapterId]/leaderboard/+page.server.ts index 486f42b..d328875 100644 --- a/src/routes/(app)/chapters/[chapterId]/leaderboard/+page.server.ts +++ b/src/routes/(app)/chapters/[chapterId]/leaderboard/+page.server.ts @@ -5,19 +5,13 @@ import type { PageServerLoad } from './$types'; import type { LeaderboardEvent } from '$lib/types'; import { handleRedirect } from '$lib/utils'; -export const load: PageServerLoad = async ({ url, locals: { user }, fetch, cookies, params: { chapterId } }) => { +export const load: PageServerLoad = async ({ url, locals: { user }, fetch, params: { chapterId } }) => { if (!user) redirect(302, handleRedirect('login', url)); if (!chapterId) redirect(302, '/'); - const session = cookies.get('session'); - - const res = await fetch(`${API_URL}/leaderboard/${chapterId}`, { - headers: { - Authorization: `Bearer ${session}` - } - }); + const res = await fetch(`${API_URL}/leaderboard/${chapterId}`); if (!res.ok) return { leaderboard: [] diff --git a/src/routes/(app)/chapters/[chapterId]/puzzle/[puzzleId]/+page.server.ts b/src/routes/(app)/chapters/[chapterId]/puzzle/[puzzleId]/+page.server.ts index 41bf831..d5983df 100644 --- a/src/routes/(app)/chapters/[chapterId]/puzzle/[puzzleId]/+page.server.ts +++ b/src/routes/(app)/chapters/[chapterId]/puzzle/[puzzleId]/+page.server.ts @@ -16,11 +16,7 @@ export const load = (async ({ url, locals: { user }, fetch, cookies, params: { c redirect(302, `/chapters/${chapterId}`); } - let res = await fetch(`${API_URL}/chapter/${chapterId}`, { - headers: { - Authorization: `Bearer ${session}` - } - }); + let res = await fetch(`${API_URL}/chapter/${chapterId}`); if (!res.ok) { redirect(302, `/chapters`); @@ -39,20 +35,22 @@ export const load = (async ({ url, locals: { user }, fetch, cookies, params: { c redirect(302, `/chapters/${chapterId}`); } - res = await fetch(`${API_URL}/puzzle/${puzzleId}`, { - headers: { - Authorization: `Bearer ${session}` - } - }); + res = await fetch(`${API_URL}/puzzle/${puzzleId}`); if (!res.ok) { - error(404, 'Puzzle not found'); + error(404, { + errorId: 'puzzle_not_found', + message: 'Puzzle not found' + }); } const puzzle: Puzzle = await res.json(); if (!puzzle) { - error(404, 'Puzzle not found'); + error(404, { + errorId: 'puzzle_not_found', + message: 'Puzzle not found' + }); } const content = await compile(puzzle.content); diff --git a/src/routes/(app)/leaderboard/+page.server.ts b/src/routes/(app)/leaderboard/+page.server.ts index a785738..3b1b37d 100644 --- a/src/routes/(app)/leaderboard/+page.server.ts +++ b/src/routes/(app)/leaderboard/+page.server.ts @@ -6,17 +6,11 @@ import type { PageServerLoad } from './$types'; import type { Leaderboard } from '$lib/types'; import { handleRedirect } from '$lib/utils'; -export const load = (async ({ url, locals: { user }, fetch, cookies }) => { +export const load = (async ({ url, locals: { user }, fetch }) => { if (!user) redirect(302, handleRedirect('login', url)); - const session = cookies.get('session'); - - const res = await fetch(`${API_URL}/leaderboard`, { - headers: { - Authorization: `Bearer ${session}` - } - }); + const res = await fetch(`${API_URL}/leaderboard`); if (!res.ok) { return { diff --git a/src/routes/(app)/settings/+layout.svelte b/src/routes/(app)/settings/+layout.svelte index a858d9c..9d993e3 100644 --- a/src/routes/(app)/settings/+layout.svelte +++ b/src/routes/(app)/settings/+layout.svelte @@ -1,5 +1,7 @@ + +
Apparement tu as navigué en eau trouble...
+ +{$page.error?.errorId}
+