+
+
{group.name}
+
+ {group.playerCount} membres
+
-
+ {#if group.playerCount < limit}
{#if $page.data.user?.groups.some((g) => g.name === group.name)}
{/if}
-
+ {/if}
{/each}
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 7db9b8a..d35e38e 100644
--- a/src/routes/(app)/chapters/[chapterId]/groups/new/+page.server.ts
+++ b/src/routes/(app)/chapters/[chapterId]/groups/new/+page.server.ts
@@ -1,15 +1,16 @@
+import { API_URL } from "$env/static/private";
import { fail, redirect, type Actions } from "@sveltejs/kit";
import type { PageServerLoad } from "./$types";
import { superValidate } from "sveltekit-superforms";
import { zod } from "sveltekit-superforms/adapters";
-import { API_URL } from "$env/static/private";
+import { handleRedirect } from "$lib/utils";
import { groupSchema } from "$lib/validations/group";
-export const load: PageServerLoad = async ({ params: { chapterId }, locals: { user } }) => {
+export const load: PageServerLoad = async ({ url, params: { chapterId }, locals: { user } }) => {
- if (!user) redirect(302, '/login');
+ if (!user) redirect(302, handleRedirect('login', url));
if (user.groups.find(g => g.chapter === parseInt(chapterId))) {
redirect(302, `/chapters/${chapterId}/groups`);
@@ -24,9 +25,9 @@ export const load: PageServerLoad = async ({ params: { chapterId }, locals: { us
};
export const actions: Actions = {
- default: async ({ locals: { user }, fetch, request, cookies, params: { chapterId } }) => {
+ default: async ({ url, locals: { user }, fetch, request, cookies, params: { chapterId } }) => {
- if (!user) redirect(302, '/login');
+ if (!user) redirect(302, handleRedirect('login', url));
if (!chapterId) redirect(302, '/chapters');
diff --git a/src/routes/(app)/chapters/[chapterId]/leaderboard/+page.server.ts b/src/routes/(app)/chapters/[chapterId]/leaderboard/+page.server.ts
index 15f9863..486f42b 100644
--- a/src/routes/(app)/chapters/[chapterId]/leaderboard/+page.server.ts
+++ b/src/routes/(app)/chapters/[chapterId]/leaderboard/+page.server.ts
@@ -1,12 +1,13 @@
import { API_URL } from '$env/static/private';
-import type { PageServerLoad } from './$types';
import { redirect } from '@sveltejs/kit';
+import type { PageServerLoad } from './$types';
import type { LeaderboardEvent } from '$lib/types';
+import { handleRedirect } from '$lib/utils';
-export const load: PageServerLoad = async ({ locals: { user }, fetch, cookies, params: { chapterId } }) => {
+export const load: PageServerLoad = async ({ url, locals: { user }, fetch, cookies, params: { chapterId } }) => {
- if (!user) redirect(302, '/login');
+ if (!user) redirect(302, handleRedirect('login', url));
if (!chapterId) redirect(302, '/');
diff --git a/src/routes/(app)/chapters/[chapterId]/puzzle/+page.server.ts b/src/routes/(app)/chapters/[chapterId]/puzzle/+page.server.ts
index 1a4e06b..5d22be6 100644
--- a/src/routes/(app)/chapters/[chapterId]/puzzle/+page.server.ts
+++ b/src/routes/(app)/chapters/[chapterId]/puzzle/+page.server.ts
@@ -2,7 +2,9 @@ import { redirect } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
-export const load = (async ({ locals: { user }, params: { chapterId } }) => {
- if (!user) redirect(302, '/login');
+import { handleRedirect } from '$lib/utils';
+
+export const load = (async ({ url, locals: { user }, params: { chapterId } }) => {
+ if (!user) redirect(302, handleRedirect('login', url));
redirect(302, chapterId ? `/chapters/${chapterId}` : `/chapters`);
}) satisfies PageServerLoad;
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 78d7189..41bf831 100644
--- a/src/routes/(app)/chapters/[chapterId]/puzzle/[puzzleId]/+page.server.ts
+++ b/src/routes/(app)/chapters/[chapterId]/puzzle/[puzzleId]/+page.server.ts
@@ -1,13 +1,14 @@
import { API_URL } from '$env/static/private';
import { error, redirect, type Actions } from '@sveltejs/kit';
-import type { PageServerLoad } from './$types';
import { compile } from 'mdsvex';
+import type { PageServerLoad } from './$types';
import type Puzzle from '$lib/components/puzzle.svelte';
import type { Chapter } from '$lib/types';
+import { handleRedirect } from '$lib/utils';
-export const load = (async ({ locals: { user }, fetch, cookies, params: { chapterId, puzzleId } }) => {
- if (!user) redirect(302, '/login');
+export const load = (async ({ url, locals: { user }, fetch, cookies, params: { chapterId, puzzleId } }) => {
+ if (!user) redirect(302, handleRedirect('login', url));
const session = cookies.get('session');
diff --git a/src/routes/(app)/groups/+page.svelte b/src/routes/(app)/groups/+page.svelte
deleted file mode 100644
index 42f2102..0000000
--- a/src/routes/(app)/groups/+page.svelte
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-TODO
diff --git a/src/routes/(app)/leaderboard/+page.server.ts b/src/routes/(app)/leaderboard/+page.server.ts
index 5d0267a..a785738 100644
--- a/src/routes/(app)/leaderboard/+page.server.ts
+++ b/src/routes/(app)/leaderboard/+page.server.ts
@@ -4,10 +4,11 @@ import { redirect } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
import type { Leaderboard } from '$lib/types';
+import { handleRedirect } from '$lib/utils';
-export const load = (async ({ locals: { user }, fetch, cookies }) => {
+export const load = (async ({ url, locals: { user }, fetch, cookies }) => {
- if (!user) redirect(302, '/login');
+ if (!user) redirect(302, handleRedirect('login', url));
const session = cookies.get('session');
diff --git a/src/routes/(app)/settings/+page.server.ts b/src/routes/(app)/settings/+page.server.ts
index 359b416..85aedf7 100644
--- a/src/routes/(app)/settings/+page.server.ts
+++ b/src/routes/(app)/settings/+page.server.ts
@@ -2,12 +2,14 @@ import { API_URL } from '$env/static/private';
import { fail, redirect, type Actions } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
-import { settingSchema } from '$lib/validations/auth';
import { zod } from 'sveltekit-superforms/adapters';
import { setError, superValidate } from 'sveltekit-superforms/server';
-export const load: PageServerLoad = async ({ locals: { user } }) => {
- if (!user) redirect(302, '/login');
+import { handleRedirect } from '$lib/utils';
+import { settingSchema } from '$lib/validations/auth';
+
+export const load: PageServerLoad = async ({ url, locals: { user } }) => {
+ if (!user) redirect(302, handleRedirect('login', url));
const form = await superValidate(user, zod(settingSchema));
diff --git a/src/routes/(auth)/+layout.svelte b/src/routes/(auth)/+layout.svelte
deleted file mode 100644
index 82a0c08..0000000
--- a/src/routes/(auth)/+layout.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/src/routes/(auth)/login/+page.server.ts b/src/routes/(auth)/login/+page.server.ts
index 20d2de9..88dfd07 100644
--- a/src/routes/(auth)/login/+page.server.ts
+++ b/src/routes/(auth)/login/+page.server.ts
@@ -21,7 +21,7 @@ export const load: PageServerLoad = async ({ locals: { user } }) => {
};
export const actions: Actions = {
- default: async ({ request, cookies, fetch }) => {
+ default: async ({ request, cookies, fetch, url: { searchParams } }) => {
const form = await superValidate(request, zod(loginSchema));
@@ -52,6 +52,11 @@ export const actions: Actions = {
sameSite: 'strict',
});
+ const redirectTo = searchParams.get('redirectTo');
+
+ if (redirectTo)
+ redirect(302, `/${redirectTo.slice(1)}`);
+
redirect(302, '/');
}
};
diff --git a/src/routes/(auth)/register/+page.server.ts b/src/routes/(auth)/register/+page.server.ts
index 776fc4e..bee7810 100644
--- a/src/routes/(auth)/register/+page.server.ts
+++ b/src/routes/(auth)/register/+page.server.ts
@@ -53,7 +53,7 @@ export const actions: Actions = {
form
};
},
- confirmation: async ({ request, cookies }) => {
+ confirmation: async ({ request, cookies, url: { searchParams } }) => {
const form = await superValidate(request, zod(registerConfirmationSchema));
if (!form.valid) {
@@ -93,6 +93,11 @@ export const actions: Actions = {
sameSite: 'strict',
});
+ const redirectTo = searchParams.get('redirectTo');
+
+ if (redirectTo)
+ redirect(302, `/${redirectTo.slice(1)}`);
+
redirect(302, '/');
- },
+ }
}
diff --git a/src/routes/(auth)/register/+page.svelte b/src/routes/(auth)/register/+page.svelte
index 571c982..8f31588 100644
--- a/src/routes/(auth)/register/+page.svelte
+++ b/src/routes/(auth)/register/+page.svelte
@@ -11,7 +11,6 @@
import Input from '$lib/components/ui/input/input.svelte';
import { registerConfirmationSchema, registerSchema } from '$lib/validations/auth';
- import { enhance } from '$app/forms';
export let data: PageData;
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index c627082..903425f 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -2,8 +2,11 @@
import '../app.css';
import { Metadata } from '$lib/components';
+ import { Toaster } from '$lib/components/ui/sonner';
+
+
--
2.39.5
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 3/3] 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 @@
+
+
+
+
Oops!
+
Apparement tu as navigué en eau trouble...
+
+
{$page.error?.errorId}
+
+
--
2.39.5