feat: implement user signup functionality with session management

This commit is contained in:
2025-12-01 13:56:04 +01:00
parent 79476b4bed
commit 0d16393b2e
5 changed files with 71 additions and 4 deletions

6
src/app.d.ts vendored
View File

@@ -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
View 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);
};

View File

@@ -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()
});

View 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;

View 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>