From 3d2b367bf9efb771943a0a9e682abb7863f23228 Mon Sep 17 00:00:00 2001 From: Brian Nelson Date: Mon, 8 Sep 2025 10:03:20 -0400 Subject: [PATCH] forms and database actions --- src/lib/server/database.js | 42 +++++++++++++ src/routes/todo/+page.server.js | 38 ++++++++++++ src/routes/todo/+page.svelte | 107 ++++++++++++++++++++++++++++++++ src/routes/todo/remove.svg | 1 + 4 files changed, 188 insertions(+) create mode 100644 src/lib/server/database.js create mode 100644 src/routes/todo/+page.server.js create mode 100644 src/routes/todo/+page.svelte create mode 100644 src/routes/todo/remove.svg diff --git a/src/lib/server/database.js b/src/lib/server/database.js new file mode 100644 index 0000000..ba17f0a --- /dev/null +++ b/src/lib/server/database.js @@ -0,0 +1,42 @@ +//@ts-nocheck + +const db = new Map(); + +export function getTodos(userid) { + if (!db.get(userid)) { + db.set(userid, [{ + id: crypto.randomUUID(), + description: 'Learn SvelteKit', + done: false + }]) + } + + return db.get(userid) +} + +export function createTodo(userid, description) { + if (description === '') { + throw new Error('todo must have a description'); + } + + const todos = db.get(userid); + + if (todos.find((todo) => todo.description === description)) { + throw new Error('todos must be unique'); + } + + todos.push({ + id: crypto.randomUUID(), + description, + done: false + }); +} + +export function deleteTodo(userid, todoid) { + const todos = db.get(userid); + const index = todos.findIndex((todo) => todo.id === todoid); + + if (index !== -1) { + todos.splice(index, 1); + } +} \ No newline at end of file diff --git a/src/routes/todo/+page.server.js b/src/routes/todo/+page.server.js new file mode 100644 index 0000000..08553f5 --- /dev/null +++ b/src/routes/todo/+page.server.js @@ -0,0 +1,38 @@ +//@ts-nocheck + +import { fail } from '@sveltejs/kit'; +import * as db from '$lib/server/database'; + +export function load({ cookies }) { + let id = cookies.get('userid'); + + if (!id) { + id = crypto.randomUUID(); + cookies.set('userid', id, { path: '/' }); + } + + return { + todos: db.getTodos(id) + }; +} + +export const actions = { + create: async ({ cookies, request }) => { + await new Promise((fulfill) => setTimeout(fulfill, 1000)); + const data = await request.formData(); + try { + db.createTodo(cookies.get('userid'), data.get('description')); + } catch (error) { + return fail(422, { + description: data.get('description'), + error: error.message + }); + } + }, + + delete: async({ cookies, request }) => { + await new Promise((fulfill) => setTimeout(fulfill, 1000)); + const data = await request.formData(); + db.deleteTodo(cookies.get('userid'), data.get('id')); + } +} \ No newline at end of file diff --git a/src/routes/todo/+page.svelte b/src/routes/todo/+page.svelte new file mode 100644 index 0000000..d88a1fa --- /dev/null +++ b/src/routes/todo/+page.svelte @@ -0,0 +1,107 @@ + + +
+

todos

+ + {#if form?.error} +

{form.error}

+ {/if} + +
{ + creating = true + + return async ({ update }) => { + await update(); + creating = false; + } + }} + > + +
+ + + + {#if creating} + saving... + {/if} +
+ + \ No newline at end of file diff --git a/src/routes/todo/remove.svg b/src/routes/todo/remove.svg new file mode 100644 index 0000000..62b24d6 --- /dev/null +++ b/src/routes/todo/remove.svg @@ -0,0 +1 @@ + \ No newline at end of file