From 1b6a257e65a9cdef3af30e85b06e1f6393717dca Mon Sep 17 00:00:00 2001 From: TZGyn Date: Wed, 17 Apr 2024 22:37:21 +0800 Subject: [PATCH] update login page to use superform --- .../(auth)/login/(components)/form.svelte | 55 +++++++++++ .../src/routes/(auth)/login/+page.server.ts | 54 +++++++++++ frontend/src/routes/(auth)/login/+page.svelte | 97 ++----------------- frontend/src/routes/(auth)/login/schema.ts | 4 +- frontend/src/routes/api/login/+server.ts | 52 ---------- 5 files changed, 121 insertions(+), 141 deletions(-) create mode 100644 frontend/src/routes/(auth)/login/(components)/form.svelte create mode 100644 frontend/src/routes/(auth)/login/+page.server.ts delete mode 100644 frontend/src/routes/api/login/+server.ts diff --git a/frontend/src/routes/(auth)/login/(components)/form.svelte b/frontend/src/routes/(auth)/login/(components)/form.svelte new file mode 100644 index 0000000..473ff0f --- /dev/null +++ b/frontend/src/routes/(auth)/login/(components)/form.svelte @@ -0,0 +1,55 @@ + + +
+ + + Email + + + + + + + Password + + + + + Login +
diff --git a/frontend/src/routes/(auth)/login/+page.server.ts b/frontend/src/routes/(auth)/login/+page.server.ts new file mode 100644 index 0000000..a930f9d --- /dev/null +++ b/frontend/src/routes/(auth)/login/+page.server.ts @@ -0,0 +1,54 @@ +import type { PageServerLoad, Actions } from './$types' +import { fail } from '@sveltejs/kit' +import { setError, superValidate } from 'sveltekit-superforms' +import { formSchema } from './schema' +import { zod } from 'sveltekit-superforms/adapters' +import { db } from '$lib/db' +import { user as userSchema } from '$lib/db/schema' +import { eq } from 'drizzle-orm' +import { lucia } from '$lib/server/auth' + +export const load = (async (event) => { + return { + form: await superValidate(zod(formSchema)), + } +}) satisfies PageServerLoad + +export const actions: Actions = { + default: async (event) => { + const form = await superValidate(event, zod(formSchema)) + if (!form.valid) { + return fail(400, { + form, + }) + } + + const users = await db + .select() + .from(userSchema) + .where(eq(userSchema.email, form.data.email)) + + const user = users[0] + + const matchPassword = + user && + (await Bun.password.verify(form.data.password, user.password)) + + if (!user || !matchPassword) { + return setError(form, 'email', 'Invalid credentials') + } + + const session = await lucia.createSession(user.id, {}) + const sessionCookie = lucia.createSessionCookie(session.id) + + event.cookies.set(sessionCookie.name, sessionCookie.value, { + ...sessionCookie.attributes, + path: '/', + secure: Bun.env.APP_ENV === 'prod', + }) + + return { + form, + } + }, +} diff --git a/frontend/src/routes/(auth)/login/+page.svelte b/frontend/src/routes/(auth)/login/+page.svelte index f589f51..3018a8a 100644 --- a/frontend/src/routes/(auth)/login/+page.svelte +++ b/frontend/src/routes/(auth)/login/+page.svelte @@ -1,69 +1,27 @@
-
+ class="container relative flex-col justify-center items-center h-screen md:grid lg:grid-cols-2 lg:px-0 lg:max-w-none"> +
+ class="flex flex-col justify-center mx-auto space-y-6 w-full sm:w-[350px]">

Login to your account @@ -72,34 +30,8 @@ Enter your email below to login to your account

-
-
- - -
-
- - -
- -
-

+

+

Don't Have An Account? Signup{' '}

-
diff --git a/frontend/src/routes/(auth)/login/schema.ts b/frontend/src/routes/(auth)/login/schema.ts index ba5706d..50f6979 100644 --- a/frontend/src/routes/(auth)/login/schema.ts +++ b/frontend/src/routes/(auth)/login/schema.ts @@ -1,8 +1,8 @@ import { z } from 'zod' export const formSchema = z.object({ - email: z.string().email(), - password: z.string().min(8), + email: z.string(), + password: z.string(), }) export type FormSchema = typeof formSchema diff --git a/frontend/src/routes/api/login/+server.ts b/frontend/src/routes/api/login/+server.ts deleted file mode 100644 index 47b25d7..0000000 --- a/frontend/src/routes/api/login/+server.ts +++ /dev/null @@ -1,52 +0,0 @@ -import type { RequestHandler } from './$types' -import { user as userSchema } from '$lib/db/schema' -import { db } from '$lib/db' -import { eq } from 'drizzle-orm' -import { userLoginSchema } from '$lib/server/types' -import { lucia } from '$lib/server/auth' - -export const GET: RequestHandler = async () => { - return new Response() -} - -export const POST: RequestHandler = async (event) => { - const body = await event.request.json() - - const userLogin = userLoginSchema.safeParse(body) - - if (!userLogin.success) { - return new Response( - JSON.stringify({ - success: false, - }), - ) - } - - const users = await db - .select() - .from(userSchema) - .where(eq(userSchema.email, userLogin.data.email)) - - const user = users[0] - const matchPassword = - user && - (await Bun.password.verify( - userLogin.data.password, - user.password, - )) - - if (user && matchPassword) { - const session = await lucia.createSession(user.id, {}) - const sessionCookie = lucia.createSessionCookie(session.id) - - event.cookies.set(sessionCookie.name, sessionCookie.value, { - ...sessionCookie.attributes, - path: '/', - secure: Bun.env.APP_ENV === 'prod', - }) - - return new Response(JSON.stringify({ success: true })) - } else { - return new Response(JSON.stringify({ success: false })) - } -}