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 {
|
declare global {
|
||||||
namespace App {
|
namespace App {
|
||||||
// interface Error {}
|
// interface Error {}
|
||||||
// interface Locals {}
|
interface Locals {
|
||||||
|
session: {
|
||||||
|
token: string;
|
||||||
|
} | null;
|
||||||
|
}
|
||||||
// interface PageData {}
|
// interface PageData {}
|
||||||
// interface PageState {}
|
// interface PageState {}
|
||||||
// interface Platform {}
|
// 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(),
|
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