From 1d6ca4abd89aa3982860ae82a7822c9e3b42d9b9 Mon Sep 17 00:00:00 2001 From: Patrick Date: Thu, 18 Sep 2025 16:55:10 +0200 Subject: [PATCH] implemented basic user registration --- src/lib/errors.ts | 6 ++++ src/lib/server/database.ts | 5 +++ src/lib/server/usermgmt.ts | 43 +++++++++++++++++++++++ src/routes/api/register/+server.ts | 41 +++++++++++++++++++++ src/routes/login/register/+page.server.ts | 9 ++++- 5 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 src/lib/errors.ts create mode 100644 src/lib/server/database.ts create mode 100644 src/lib/server/usermgmt.ts create mode 100644 src/routes/api/register/+server.ts diff --git a/src/lib/errors.ts b/src/lib/errors.ts new file mode 100644 index 0000000..7a31215 --- /dev/null +++ b/src/lib/errors.ts @@ -0,0 +1,6 @@ + +export class ArgumentError extends Error { + constructor(message: string) { + super(message) + } +} diff --git a/src/lib/server/database.ts b/src/lib/server/database.ts new file mode 100644 index 0000000..fdc7831 --- /dev/null +++ b/src/lib/server/database.ts @@ -0,0 +1,5 @@ +import { PrismaClient } from "@prisma/client" + +const prisma = new PrismaClient() + +export default prisma diff --git a/src/lib/server/usermgmt.ts b/src/lib/server/usermgmt.ts new file mode 100644 index 0000000..7299801 --- /dev/null +++ b/src/lib/server/usermgmt.ts @@ -0,0 +1,43 @@ +import Bun from "bun" + +import { ArgumentError } from "$lib/errors" + +import Log from "$lib/server/log" +import db from "$lib/server/database" + +class UserMgmt { + + async register(email: string, password: string, display_name: string) { + if (email.length == 0 || password.length == 0 || display_name.length == 0) { + throw new ArgumentError("No field may be empty") + } + + const user = await db.user.create({ + data: { + email: email, + password_hash: await Bun.password.hash(password, "argon2id"), + display_name: display_name + } + }) + + Log.info(Log.module.USER, `Created user with id ${user.id}`) + console.log(user) + + return user; + } + + async login(email: string, password: string) { + const user = await db.user.findUnique({ + where: { + email: email + } + }) + + + } + +} + +const _manager = new UserMgmt() + +export default _manager diff --git a/src/routes/api/register/+server.ts b/src/routes/api/register/+server.ts new file mode 100644 index 0000000..b1949e1 --- /dev/null +++ b/src/routes/api/register/+server.ts @@ -0,0 +1,41 @@ +import type { RequestHandler } from "./$types" + +import { json, error } from "@sveltejs/kit" + +import UserMgmt from "$lib/server/usermgmt" + +import Util from "$lib/util" + +export const POST: RequestHandler = async ({ request }) => { + + const data = await request.formData() + + const email = data.get("email") + const password = data.get("password") + const display_name = data.get("display_name") + + if (data.keys.length > 3 || !(typeof email === "string" && typeof password === "string" && typeof display_name === "string")) { + return error(400, { message: "Invalid field arguments" }) + } + if (email.length == 0) { + return error(400, { message: "email must not be empty" }) + } + if (password.length == 0) { + return error(400, { message: "password must not be empty" }) + } + if (display_name.length == 0) { + return error(400, { message: "Display name must not be empty" }) + } + + if (!Util.check_email_format(email)) { + return error(400, { message: "invalid email format" }) + } + + try { + const user = UserMgmt.register(email, password, display_name) + } catch (e) { + return error(500) + } + + return json({}) +} diff --git a/src/routes/login/register/+page.server.ts b/src/routes/login/register/+page.server.ts index febf509..54a4ab6 100644 --- a/src/routes/login/register/+page.server.ts +++ b/src/routes/login/register/+page.server.ts @@ -1,10 +1,17 @@ import type { Actions } from "./$types"; export const actions = { - register: async ({ request }) => { + register: async ({ request, fetch }) => { console.log("register") + const result = await fetch("/api/register", { + method: "POST", + body: await request.formData() + }) + + console.log(result) + return { message: "Erfolg" } } } satisfies Actions