feat: implement user signup functionality with session management
This commit is contained in:
6
src/app.d.ts
vendored
6
src/app.d.ts
vendored
@@ -3,7 +3,11 @@
|
||||
declare global {
|
||||
namespace App {
|
||||
// interface Error {}
|
||||
// interface Locals {}
|
||||
interface Locals {
|
||||
session: {
|
||||
token: string;
|
||||
} | null;
|
||||
}
|
||||
// interface PageData {}
|
||||
// interface PageState {}
|
||||
// interface Platform {}
|
||||
|
||||
24
src/hooks.server.ts
Normal file
24
src/hooks.server.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import { db } from "$lib/server/db";
|
||||
import { sessionTable } from "$lib/server/db/schema";
|
||||
import type { Handle } from "@sveltejs/kit";
|
||||
import { createHash } from "crypto";
|
||||
import { and, eq, gt } from "drizzle-orm";
|
||||
|
||||
export const handle: Handle = async ({ event, resolve }) => {
|
||||
event.locals.session = null;
|
||||
|
||||
const rawToken = event.cookies.get("session");
|
||||
if (rawToken) {
|
||||
const hashedToken = createHash("sha256").update(rawToken).digest("hex");
|
||||
const [sessionRecord] = await db
|
||||
.select()
|
||||
.from(sessionTable)
|
||||
.where(and(eq(sessionTable.token, hashedToken), gt(sessionTable.expires_at, new Date())));
|
||||
|
||||
if (sessionRecord) {
|
||||
event.locals.session = { token: sessionRecord.token };
|
||||
}
|
||||
}
|
||||
|
||||
return await resolve(event);
|
||||
};
|
||||
@@ -1,6 +1,17 @@
|
||||
import { pgTable, serial, integer } from 'drizzle-orm/pg-core';
|
||||
import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';
|
||||
|
||||
export const user = pgTable('user', {
|
||||
export const userTable = pgTable('user', {
|
||||
id: serial('id').primaryKey(),
|
||||
age: integer('age')
|
||||
name: text('name').notNull(),
|
||||
email: text('email').notNull().unique(),
|
||||
password: text('password').notNull(),
|
||||
created_at: timestamp('created_at').defaultNow()
|
||||
});
|
||||
|
||||
export const sessionTable = pgTable('session', {
|
||||
id: serial('id').primaryKey(),
|
||||
user_id: serial('user_id').notNull().references(() => userTable.id),
|
||||
token: text('token').notNull().unique(),
|
||||
expires_at: timestamp('expires_at').notNull(),
|
||||
created_at: timestamp('created_at').defaultNow()
|
||||
});
|
||||
|
||||
22
src/routes/signup/+page.server.ts
Normal file
22
src/routes/signup/+page.server.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { db } from '$lib/server/db';
|
||||
import { userTable } from '$lib/server/db/schema';
|
||||
import type { Actions } from './$types';
|
||||
|
||||
export const actions = {
|
||||
default: async ({ request }) => {
|
||||
const formData = await request.formData();
|
||||
const name = formData.get('name');
|
||||
const email = formData.get('email');
|
||||
const password = formData.get('password');
|
||||
|
||||
// TODO: Implement data validation.
|
||||
|
||||
const userRecord = await db.insert(userTable).values({
|
||||
name: name as string,
|
||||
email: email as string,
|
||||
password: password as string
|
||||
}).returning();
|
||||
|
||||
// TODO: Handle post-signup logic (e.g., redirect, session creation).
|
||||
}
|
||||
} satisfies Actions;
|
||||
6
src/routes/signup/+page.svelte
Normal file
6
src/routes/signup/+page.svelte
Normal file
@@ -0,0 +1,6 @@
|
||||
<form method="post">
|
||||
<input type="text" name="name" placeholder="Name" required />
|
||||
<input type="email" name="email" placeholder="Email" required />
|
||||
<input type="password" name="password" placeholder="Password" required />
|
||||
<button type="submit">Sign Up</button>
|
||||
</form>
|
||||
Reference in New Issue
Block a user