From e45b0e34c91a29a5e19951215a0c76321e59a510 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Mon, 4 Aug 2025 09:41:13 +0200 Subject: [PATCH 01/12] =?UTF-8?q?add=20=C2=B4unique=C2=B4=20constraint=20i?= =?UTF-8?q?n=20db=20init=20script=20for=20username?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/init/init_db.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/init/init_db.ts b/src/init/init_db.ts index 559708b..b057c3c 100644 --- a/src/init/init_db.ts +++ b/src/init/init_db.ts @@ -5,7 +5,7 @@ const db = new Database('./src/lib/data/tatort.db'); let createSQLStmt = `CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT NOT NULL, + name TEXT NOT NULL UNIQUE, pw TEXT NOT NULL)`; db.exec(createSQLStmt); From 26b94938a99a6f9ba191ad55dc377ef8560c0737 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 6 Aug 2025 08:37:24 +0200 Subject: [PATCH 02/12] user list and possibility of adding new users implemented on FE and BE --- src/lib/server/userService.ts | 36 ++++ src/routes/(angemeldet)/+page.svelte | 12 ++ .../(angemeldet)/user-management/+page.svelte | 180 ++++++++++++++++++ src/routes/api/users/+server.ts | 25 +++ 4 files changed, 253 insertions(+) create mode 100644 src/lib/server/userService.ts create mode 100644 src/routes/(angemeldet)/user-management/+page.svelte create mode 100644 src/routes/api/users/+server.ts diff --git a/src/lib/server/userService.ts b/src/lib/server/userService.ts new file mode 100644 index 0000000..80c41ae --- /dev/null +++ b/src/lib/server/userService.ts @@ -0,0 +1,36 @@ +import { db } from '$lib/server/dbService'; + +export const getUsers = (): { userId: string; userName: string }[] => { + const getUsersSQLStmt = `SELECT id, name + FROM users;`; + const statement = db.prepare(getUsersSQLStmt); + const result = statement.all() as { id: string; name: string }[]; + const userList: { userId: string; userName: string }[] = []; + + for (const resultItem of result) { + const user = { userId: resultItem.id, userName: resultItem.name }; + userList.push(user); + } + + return userList; +}; + +export const addUser = (userName: string, userPassword: string): number => { + const addUserSQLStmt = `INSERT into users(name, pw) + values (?, ?)`; + const statement = db.prepare(addUserSQLStmt); + + let rowCount; + try { + const info = statement.run(userName, userPassword); + rowCount = info.changes; + } catch (error) { + console.log(error); + rowCount = 0; + } + + return rowCount; +}; + +export const deleteUser = () => { +}; diff --git a/src/routes/(angemeldet)/+page.svelte b/src/routes/(angemeldet)/+page.svelte index 6287a40..16f5d0a 100644 --- a/src/routes/(angemeldet)/+page.svelte +++ b/src/routes/(angemeldet)/+page.svelte @@ -42,6 +42,18 @@

Fügen Sie einem Tatort Bilder hinzu.

{/if} +
+
+ +
+ + Benutzerverwaltung + + +

Füge neue Benutzer hinzu oder entferne welche.

+
diff --git a/src/routes/(angemeldet)/user-management/+page.svelte b/src/routes/(angemeldet)/user-management/+page.svelte new file mode 100644 index 0000000..ebff868 --- /dev/null +++ b/src/routes/(angemeldet)/user-management/+page.svelte @@ -0,0 +1,180 @@ + + +

+ Benutzerverwaltung +

+ +

+ Benutzerliste +

+ +
+ + + + + + + + + {#each userList as user} + + + + + {/each} + +
BenutzernameEntfernen
{user.userName} + +
+
+ +

+ Neuer Nutzer +

+ +
+
+
+ + +
+ +
+ + +
+
+
+ +
+ {#if addUserError} + + {/if} + {#if addUserSuccess} + + {/if} + + +
+ + \ No newline at end of file diff --git a/src/routes/api/users/+server.ts b/src/routes/api/users/+server.ts new file mode 100644 index 0000000..c14b677 --- /dev/null +++ b/src/routes/api/users/+server.ts @@ -0,0 +1,25 @@ +import { json } from '@sveltejs/kit'; +import { addUser, getUsers } from '$lib/server/userService'; + +export function GET({ locals }) { + if (!locals.user) { + return json({ error: 'Unauthorized' }, { status: 401 }); + } + + const users_list = getUsers(); + + return new Response(JSON.stringify(users_list)); +} + +export async function POST({ request, locals }) { + if (!locals.user) { + return json({ error: 'Unauthorized' }, { status: 401 }); + } + + const data = await request.json(); + const userName = data.userName; + const userPassword = data.userPassword; + const rowCount = addUser(userName, userPassword); + + return new Response(null, { status: rowCount == 1 ? 200 : 400 }); +} From dd06c93b1c261dfab1438e796bad87ae2159983d Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 6 Aug 2025 09:58:00 +0200 Subject: [PATCH 03/12] fix currentUser fetching from loaded data --- src/routes/(angemeldet)/user-management/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(angemeldet)/user-management/+page.svelte b/src/routes/(angemeldet)/user-management/+page.svelte index ebff868..a0478a9 100644 --- a/src/routes/(angemeldet)/user-management/+page.svelte +++ b/src/routes/(angemeldet)/user-management/+page.svelte @@ -11,7 +11,7 @@ let userList = $state([]) let addUserError = $state(false); let addUserSuccess = $state(false); - const currentUser: string = data.id; + const currentUser: string = data.user.id; onMount(async () => { userList = await getUsers(); From 4f0526c71f26f9a4c784f7f3c41b66f24a4c25cf Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 6 Aug 2025 09:59:18 +0200 Subject: [PATCH 04/12] rename loop item variable for userlist-user --- src/routes/(angemeldet)/user-management/+page.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/(angemeldet)/user-management/+page.svelte b/src/routes/(angemeldet)/user-management/+page.svelte index a0478a9..24fa530 100644 --- a/src/routes/(angemeldet)/user-management/+page.svelte +++ b/src/routes/(angemeldet)/user-management/+page.svelte @@ -88,16 +88,16 @@ - {#each userList as user} + {#each userList as userItem} - {user.userName} + {userItem.userName} +