From 9ef0e46f5fb59dd86f862ce07c8aac868db1590a Mon Sep 17 00:00:00 2001 From: Bart van der Braak Date: Mon, 29 Jan 2024 13:50:14 +0100 Subject: [PATCH] feat: add auth locations --- apps/web/src/lib/config/nav.ts | 16 +++- .../src/routes/(auth)/login/+page.server.ts | 48 +++--------- apps/web/src/routes/(auth)/login/+page.svelte | 78 +++++++++++++------ apps/web/src/routes/(auth)/logout/+server.ts | 6 ++ .../{signup => register}/+page.server.ts | 2 +- .../src/routes/(auth)/register/+page.svelte | 39 ++++++++++ .../(auth)/reset-password/+page.server.ts | 18 +++++ .../routes/(auth)/reset-password/+page.svelte | 44 +++++++++++ .../web/src/routes/(auth)/signup/+page.svelte | 23 ------ apps/web/src/routes/(board)/+layout.server.ts | 10 --- .../src/routes/(dashboard)/+layout.server.ts | 9 +++ .../dashboard}/+page.svelte | 0 apps/web/src/routes/+page.server.ts | 2 +- 13 files changed, 200 insertions(+), 95 deletions(-) create mode 100644 apps/web/src/routes/(auth)/logout/+server.ts rename apps/web/src/routes/(auth)/{signup => register}/+page.server.ts (94%) create mode 100644 apps/web/src/routes/(auth)/register/+page.svelte create mode 100644 apps/web/src/routes/(auth)/reset-password/+page.server.ts create mode 100644 apps/web/src/routes/(auth)/reset-password/+page.svelte delete mode 100644 apps/web/src/routes/(auth)/signup/+page.svelte delete mode 100644 apps/web/src/routes/(board)/+layout.server.ts create mode 100644 apps/web/src/routes/(dashboard)/+layout.server.ts rename apps/web/src/routes/{(board)/board => (dashboard)/dashboard}/+page.svelte (100%) diff --git a/apps/web/src/lib/config/nav.ts b/apps/web/src/lib/config/nav.ts index 489181f..5a82e5d 100644 --- a/apps/web/src/lib/config/nav.ts +++ b/apps/web/src/lib/config/nav.ts @@ -16,8 +16,20 @@ export const navConfig: NavConfig = { href: '/login' }, { - title: 'Signup', - href: '/signup' + title: 'Register', + href: '/register' + }, + { + title: 'Dashboard', + href: '/dashboard' + }, + { + title: 'Settings', + href: '/settings' + }, + { + title: 'Logout', + href: '/logout' } ], sidebarNav: [] diff --git a/apps/web/src/routes/(auth)/login/+page.server.ts b/apps/web/src/routes/(auth)/login/+page.server.ts index 20fc83f..1646945 100644 --- a/apps/web/src/routes/(auth)/login/+page.server.ts +++ b/apps/web/src/routes/(auth)/login/+page.server.ts @@ -1,48 +1,24 @@ -import { redirect } from '@sveltejs/kit'; +import { error, redirect } from '@sveltejs/kit'; export const actions = { - default: async ({ request, locals }: { request: Request; locals: App.Locals }) => { - if (locals.pocketBase.authStore.isValid) { - return; - } - - const formData = await request.formData(); - - const email = formData.get('email'); - const password = formData.get('password'); + login: async ({ request, locals }: { request: Request; locals: App.Locals }) => { + const body = Object.fromEntries(await request.formData()); try { - if (typeof email !== 'string') { - throw new Error('Email must be a string'); - } - - if (email.length < 5) { - throw new Error('Please enter a valid e-mail address'); - } - - if (typeof password !== 'string') { - throw new Error('Password must be a string'); - } - - if (password.length < 8) { - throw new Error('Password must be at least 8 characters in length'); - } - + const email = body.email.toString(); + const password = body.password.toString(); await locals.pocketBase.collection('users').authWithPassword(email, password); - } catch (error) { - console.error(error); - - if (!(error instanceof Error)) { + if (!locals.pocketBase?.authStore?.model?.verified) { + locals.pocketBase.authStore.clear(); return { - email, - password, - error: 'Unknown error occured when signing up user' + notVerified: true }; } - - return { error: error.message, email, password }; + } catch (err) { + console.log('Error: ', err); + throw error(500, 'Something went wrong logging in'); } throw redirect(303, '/'); } -}; +}; \ No newline at end of file diff --git a/apps/web/src/routes/(auth)/login/+page.svelte b/apps/web/src/routes/(auth)/login/+page.svelte index 9bdf34d..b29edd2 100644 --- a/apps/web/src/routes/(auth)/login/+page.svelte +++ b/apps/web/src/routes/(auth)/login/+page.svelte @@ -1,25 +1,59 @@ - -

Log in

+
+

+ Login to your account +

+

+ Or register if you don't already have an account. +

+
+
+ + +
+
+ + +
+ - - - - - -
- -{#if form?.error} -

{form.error}

-{/if} - -

Don't have an account?

- -Sign up +
+ +
+ {#if form?.notVerified} +
+
+ + You must verify your email before you can login. +
+
+ {/if} + +
\ No newline at end of file diff --git a/apps/web/src/routes/(auth)/logout/+server.ts b/apps/web/src/routes/(auth)/logout/+server.ts new file mode 100644 index 0000000..bb4dc0e --- /dev/null +++ b/apps/web/src/routes/(auth)/logout/+server.ts @@ -0,0 +1,6 @@ +import { redirect } from "@sveltejs/kit"; + +export const GET = ({locals}: {locals: App.Locals}) => { + locals.pocketBase.authStore.clear(); + throw redirect(303, '/login'); +} \ No newline at end of file diff --git a/apps/web/src/routes/(auth)/signup/+page.server.ts b/apps/web/src/routes/(auth)/register/+page.server.ts similarity index 94% rename from apps/web/src/routes/(auth)/signup/+page.server.ts rename to apps/web/src/routes/(auth)/register/+page.server.ts index ae464a3..771068e 100644 --- a/apps/web/src/routes/(auth)/signup/+page.server.ts +++ b/apps/web/src/routes/(auth)/register/+page.server.ts @@ -1,7 +1,7 @@ import { redirect } from '@sveltejs/kit'; export const actions = { - default: async ({ request, locals }: { request: Request; locals: App.Locals }) => { + register: async ({ request, locals }: { request: Request; locals: App.Locals }) => { if (locals.pocketBase.authStore.isValid) { return; } diff --git a/apps/web/src/routes/(auth)/register/+page.svelte b/apps/web/src/routes/(auth)/register/+page.svelte new file mode 100644 index 0000000..4316e08 --- /dev/null +++ b/apps/web/src/routes/(auth)/register/+page.svelte @@ -0,0 +1,39 @@ +
+

+ Register for an account +

+

+ Or sign in if you already have an account. +

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
\ No newline at end of file diff --git a/apps/web/src/routes/(auth)/reset-password/+page.server.ts b/apps/web/src/routes/(auth)/reset-password/+page.server.ts new file mode 100644 index 0000000..b9ae825 --- /dev/null +++ b/apps/web/src/routes/(auth)/reset-password/+page.server.ts @@ -0,0 +1,18 @@ +import { error } from '@sveltejs/kit'; + +export const actions = { + resetPassword: async ({ request, locals }: { request: Request; locals: App.Locals }) => { + const body = Object.fromEntries(await request.formData()); + + try { + const email = body.email.toString(); + await locals.pocketBase.collection('users').requestPasswordReset(email); + return { + success: true + }; + } catch (err) { + console.log('Error: ', err); + throw error(500, 'Something went wrong'); + } + } +}; \ No newline at end of file diff --git a/apps/web/src/routes/(auth)/reset-password/+page.svelte b/apps/web/src/routes/(auth)/reset-password/+page.svelte new file mode 100644 index 0000000..d23cf8b --- /dev/null +++ b/apps/web/src/routes/(auth)/reset-password/+page.svelte @@ -0,0 +1,44 @@ + + +
+

+ Reset Your Password +

+

We'll send you an email with a link to reset your password.

+
+
+ + +
+
+ +
+ {#if form?.success} +
+
+ + An email has been sent to reset your password! +
+
+ {/if} +
+
\ No newline at end of file diff --git a/apps/web/src/routes/(auth)/signup/+page.svelte b/apps/web/src/routes/(auth)/signup/+page.svelte deleted file mode 100644 index e1606db..0000000 --- a/apps/web/src/routes/(auth)/signup/+page.svelte +++ /dev/null @@ -1,23 +0,0 @@ - - -

Sign up

- -
- - - - - -
- -{#if form?.error} -

{form.error}

-{/if} - -

Already have an account?

- -Log in diff --git a/apps/web/src/routes/(board)/+layout.server.ts b/apps/web/src/routes/(board)/+layout.server.ts deleted file mode 100644 index f144f49..0000000 --- a/apps/web/src/routes/(board)/+layout.server.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { redirect } from '@sveltejs/kit'; -import type { LayoutServerLoad } from './$types'; - -export const load = (async ({ locals }) => { - if (!locals.pocketBase.authStore.isValid) { - throw redirect(303, '/signup'); - } - - return {}; -}) satisfies LayoutServerLoad; diff --git a/apps/web/src/routes/(dashboard)/+layout.server.ts b/apps/web/src/routes/(dashboard)/+layout.server.ts new file mode 100644 index 0000000..99b7112 --- /dev/null +++ b/apps/web/src/routes/(dashboard)/+layout.server.ts @@ -0,0 +1,9 @@ +import { redirect } from '@sveltejs/kit'; + +export const load = (async ({ locals }: { locals: App.Locals }) => { + if (!locals.pocketBase.authStore.isValid) { + throw redirect(303, '/register'); + } + + return {}; +}) \ No newline at end of file diff --git a/apps/web/src/routes/(board)/board/+page.svelte b/apps/web/src/routes/(dashboard)/dashboard/+page.svelte similarity index 100% rename from apps/web/src/routes/(board)/board/+page.svelte rename to apps/web/src/routes/(dashboard)/dashboard/+page.svelte diff --git a/apps/web/src/routes/+page.server.ts b/apps/web/src/routes/+page.server.ts index 96bcf6f..af787b2 100644 --- a/apps/web/src/routes/+page.server.ts +++ b/apps/web/src/routes/+page.server.ts @@ -4,4 +4,4 @@ export const load = (async ({ locals }) => { return { authenticated: locals.pocketBase.authStore.isValid }; -}) satisfies PageServerLoad; +}) satisfies PageServerLoad; \ No newline at end of file