diff --git a/src/lib/components/forms/InputSelect.svelte b/src/lib/components/forms/InputSelect.svelte deleted file mode 100644 index b66bfde..0000000 --- a/src/lib/components/forms/InputSelect.svelte +++ /dev/null @@ -1,74 +0,0 @@ - - -
- - - -
- {#if selectData.length == 0} -

None available

- {:else} -

{selectData.filter(d => d.selected).length} selected

- - - {/if} - - {#if expanded} - - {/if} -
-
\ No newline at end of file diff --git a/src/lib/components/forms/InputText.svelte b/src/lib/components/forms/InputText.svelte deleted file mode 100644 index 22c7cdb..0000000 --- a/src/lib/components/forms/InputText.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - -
- - -
\ No newline at end of file diff --git a/src/lib/components/forms/InputToggle.svelte b/src/lib/components/forms/InputToggle.svelte deleted file mode 100644 index 6ae1381..0000000 --- a/src/lib/components/forms/InputToggle.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - -
- - - - -
\ No newline at end of file diff --git a/src/lib/components/resources/ResourceCard.svelte b/src/lib/components/resources/ResourceCard.svelte deleted file mode 100644 index 8c28bf2..0000000 --- a/src/lib/components/resources/ResourceCard.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - -
-
-

{title}

-

{subtitle}

-
-
- {#if actionsSnippet} - {@render actionsSnippet()} - {/if} -
-
\ No newline at end of file diff --git a/src/lib/components/resources/ResourceEditPage.svelte b/src/lib/components/resources/ResourceEditPage.svelte deleted file mode 100644 index dd1f34d..0000000 --- a/src/lib/components/resources/ResourceEditPage.svelte +++ /dev/null @@ -1,38 +0,0 @@ - - -
- - - - - - -
- {@render children()} -
- - {#if error} -
- -
- {/if} -
\ No newline at end of file diff --git a/src/lib/components/resources/ResourceListPage.svelte b/src/lib/components/resources/ResourceListPage.svelte deleted file mode 100644 index 464e59f..0000000 --- a/src/lib/components/resources/ResourceListPage.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - -
- - {@render actionSnippet()} - - - - -
- {@render contentSnippet()} -
-
\ No newline at end of file diff --git a/src/lib/components/resources/ResourcePageHeader.svelte b/src/lib/components/resources/ResourcePageHeader.svelte deleted file mode 100644 index 080f7d0..0000000 --- a/src/lib/components/resources/ResourcePageHeader.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - -
-

{title}

- {@render children()} -
\ No newline at end of file diff --git a/src/lib/components/ui/Button.svelte b/src/lib/components/ui/Button.svelte deleted file mode 100644 index 7465b5d..0000000 --- a/src/lib/components/ui/Button.svelte +++ /dev/null @@ -1,58 +0,0 @@ - - - -{#if a} - - {#if Icon} - - {/if} - - {@render children?.()} - -{:else} - -{/if} \ No newline at end of file diff --git a/src/lib/components/ui/Collapsible.svelte b/src/lib/components/ui/Collapsible.svelte deleted file mode 100644 index 74fb14e..0000000 --- a/src/lib/components/ui/Collapsible.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - -
- - - {#if expanded} -
- {@render children()} -
- {/if} -
\ No newline at end of file diff --git a/src/lib/components/ui/HorizontalSpacer.svelte b/src/lib/components/ui/HorizontalSpacer.svelte deleted file mode 100644 index 98e8d92..0000000 --- a/src/lib/components/ui/HorizontalSpacer.svelte +++ /dev/null @@ -1 +0,0 @@ -
\ No newline at end of file diff --git a/src/lib/server/guard.ts b/src/lib/server/guard.ts index 0c041d0..b5ad685 100644 --- a/src/lib/server/guard.ts +++ b/src/lib/server/guard.ts @@ -27,7 +27,7 @@ export class Guard { } if (this.adminRequired && !this.user?.admin) { - redirect(302, '/dashboard'); + redirect(302, '/dash'); } return this; diff --git a/src/routes/dashboard/+layout.server.ts b/src/routes/dashboard/+layout.server.ts deleted file mode 100644 index 3446805..0000000 --- a/src/routes/dashboard/+layout.server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { LayoutServerLoad } from "./$types"; - -export const load: LayoutServerLoad = async ({ locals: { guard } }) => { - const user = guard.requiresAuth().orRedirects().getUser(); - - return { - user, - } -}; \ No newline at end of file diff --git a/src/routes/dashboard/+layout.svelte b/src/routes/dashboard/+layout.svelte deleted file mode 100644 index 6c9d09c..0000000 --- a/src/routes/dashboard/+layout.svelte +++ /dev/null @@ -1,60 +0,0 @@ - - -
- - - - -
- {@render children()} -
-
- diff --git a/src/routes/dashboard/+page.server.ts b/src/routes/dashboard/+page.server.ts deleted file mode 100644 index 328f836..0000000 --- a/src/routes/dashboard/+page.server.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { redirect, type ServerLoad } from "@sveltejs/kit"; - -export const load: ServerLoad = async ({ locals: { guard }}) => { - guard.requiresAuth().orRedirects(); - redirect(302, '/dashboard/devices'); -}; \ No newline at end of file diff --git a/src/routes/dashboard/devices/+page.server.ts b/src/routes/dashboard/devices/+page.server.ts deleted file mode 100644 index 7efc0a0..0000000 --- a/src/routes/dashboard/devices/+page.server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { getUsersDevices } from '$lib/server/db'; -import type { ServerLoad } from '@sveltejs/kit'; - -export const load: ServerLoad = async ({ locals: { guard } }) => { - const user = guard.requiresAuth().orRedirects().getUser(); - return { - devices: getUsersDevices(user.id), - }; -}; diff --git a/src/routes/dashboard/devices/+page.svelte b/src/routes/dashboard/devices/+page.svelte deleted file mode 100644 index 4ffea14..0000000 --- a/src/routes/dashboard/devices/+page.svelte +++ /dev/null @@ -1,40 +0,0 @@ - - - - {#snippet actionSnippet()} - {#if data.user.admin} - - {/if} - {/snippet} - - {#snippet contentSnippet()} - {#if data.devices.length === 0} -

No devices found

- {:else} -
- {#each data.devices as device} - - {#snippet actionsSnippet()} - {#if data.user.admin} - - - {/snippet} - - {/each} -
- {/if} - {/snippet} -
\ No newline at end of file diff --git a/src/routes/dashboard/devices/[slug]/+page.server.ts b/src/routes/dashboard/devices/[slug]/+page.server.ts deleted file mode 100644 index 2b7edab..0000000 --- a/src/routes/dashboard/devices/[slug]/+page.server.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { db, getUsersDevices } from '$lib/server/db/index.js'; -import { fail, redirect, type ServerLoad } from '@sveltejs/kit'; -import { nanoid } from 'nanoid'; -import validator from 'validator'; -import { wake } from 'wake_on_lan'; -import { z } from 'zod'; - -export const load: ServerLoad = async ({ locals: { guard }, params }) => { - guard.requiresAdmin().orRedirects(); - - const device = db.data.devices.find((d) => d.id === params.slug); - - if (!device && params.slug !== 'new') { - redirect(302, '/dashboard/devices'); - } - - return { - device, - }; -}; - -export const actions = { - update: async ({ request, cookies, params, locals: { guard } }) => { - if (guard.requiresAdmin().isFailed()) return fail(403); - - const form = await request.formData(); - - const schema = z.object({ - name: z - .string({ message: 'Name is required.' }) - .min(3, { message: 'Name must be at least 3 characters.' }) - .max(24, { message: 'Name must be at most 24 characters.' }), - mac: z - .string({ message: 'MAC address is required.' }) - .refine((v) => validator.isMACAddress(v), { message: 'Invalid MAC address.' }), - broadcast: z - .string() - .refine((v) => validator.isIP(v), { message: 'Invalid broadcast IP address.' }) - .optional(), - port: z.coerce - .number({ message: 'Port is invalid.' }) - .min(1, { message: 'Port must be at least 1.' }) - .max(65535, { message: 'Port must be at most 65535.' }) - .optional(), - packets: z.coerce - .number({ message: 'Packets quantity is invalid.' }) - .min(1, { message: 'Packets quantity must be at least 1.' }) - .max(50, { message: 'Packets quantity must be at most 50.' }) - .optional(), - }); - - const parsed = schema.safeParse({ - name: form.get('name')?.toString(), - mac: form.get('mac')?.toString(), - broadcast: form.get('broadcast')?.toString(), - port: form.get('port')?.toString(), - packets: form.get('packets')?.toString(), - }); - - if (!parsed.success) { - return fail(400, { error: parsed.error.errors[0].message }); - } - - if (params.slug === 'new') { - await db.update(({ devices }) => { - devices.push({ - id: nanoid(), - name: parsed.data.name, - mac: parsed.data.mac, - broadcast: parsed.data.broadcast ?? '255.255.255.255', - port: parsed.data.port ?? 9, - packets: parsed.data.packets ?? 3, - }); - }); - - redirect(302, '/dashboard/devices'); - } - - await db.update(({ devices }) => { - let dev = devices.find((d) => d.id === params.slug); - if (!dev) return; - - dev.name = parsed.data.name; - dev.mac = parsed.data.mac; - dev.broadcast = parsed.data.broadcast ?? dev.broadcast; - dev.port = parsed.data.port ?? dev.port; - dev.packets = parsed.data.packets ?? dev.packets; - }); - - redirect(302, '/dashboard/devices'); - }, - delete: async ({ locals: { guard }, params }) => { - if (guard.requiresAdmin().isFailed()) { - return fail(403); - } - - db.data.devices = db.data.devices.filter((d) => d.id !== params.slug); - db.data.users.forEach((u) => { - u.devices = u.devices.filter((d) => d !== params.slug); - }); - db.data.groups.forEach((g) => { - g.devices = g.devices.filter((d) => d !== params.slug); - }); - db.write(); - - redirect(302, '/dashboard/devices'); - }, - wake: async ({ params, locals: { guard } }) => { - console.log('Trying to wake ' + params.slug); - - guard = guard.requiresAuth(); - - if (guard.isFailed()) { - console.log('Failed guard'); - return fail(403); - } - - const device = getUsersDevices(guard.getUser().id).find((d) => d.id === params.slug); - - if (!device) { - return fail(404); - } - - console.log('Trying to wake ' + device.name); - - wake(device.mac, { - address: device.broadcast, - port: device.port, - num_packets: device.packets, - }); - }, -}; diff --git a/src/routes/dashboard/devices/[slug]/+page.svelte b/src/routes/dashboard/devices/[slug]/+page.svelte deleted file mode 100644 index fcfd30e..0000000 --- a/src/routes/dashboard/devices/[slug]/+page.svelte +++ /dev/null @@ -1,51 +0,0 @@ - - - -
- - - - - - - - - - - - -
- - {#if data.device} - - {/if} -
- -
\ No newline at end of file diff --git a/src/routes/dashboard/groups/+page.server.ts b/src/routes/dashboard/groups/+page.server.ts deleted file mode 100644 index 7d6cd03..0000000 --- a/src/routes/dashboard/groups/+page.server.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { db } from '$lib/server/db'; -import { type ServerLoad } from '@sveltejs/kit'; - -export const load: ServerLoad = async ({ locals: { guard } }) => { - guard.requiresAdmin().orRedirects(); - return { - groups: db.data.groups, - userCounts: db.data.groups.reduce( - (acc, group) => { - acc[group.id] = db.data.users.filter((u) => u.groups.includes(group.id)).length; - return acc; - }, - {} as Record, - ), - }; -}; diff --git a/src/routes/dashboard/groups/+page.svelte b/src/routes/dashboard/groups/+page.svelte deleted file mode 100644 index a0fe243..0000000 --- a/src/routes/dashboard/groups/+page.svelte +++ /dev/null @@ -1,33 +0,0 @@ - - - - {#snippet actionSnippet()} - - {/snippet} - - {#snippet contentSnippet()} - {#if data.groups.length === 0} -

No groups found

- {:else} -
- {#each data.groups as group} - - {#snippet actionsSnippet()} - {#if data.user.admin} -
- {/if} - {/snippet} -
\ No newline at end of file diff --git a/src/routes/dashboard/groups/[slug]/+page.server.ts b/src/routes/dashboard/groups/[slug]/+page.server.ts deleted file mode 100644 index 1fdc1a1..0000000 --- a/src/routes/dashboard/groups/[slug]/+page.server.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { db } from '$lib/server/db'; -import { fail, redirect, type Actions, type ServerLoad } from '@sveltejs/kit'; -import { nanoid } from 'nanoid'; -import { z } from 'zod'; - -export const load: ServerLoad = async ({ locals: { guard }, params }) => { - guard.requiresAdmin().orRedirects(); - - const group = db.data.groups.find((g) => g.id === params.slug); - - if (!group && params.slug !== 'new') { - redirect(302, '/dashboard/groups'); - } - - return { - devices: db.data.devices, - group, - }; -}; - -export const actions: Actions = { - update: async ({ request, locals: { guard }, params }) => { - if (guard.requiresAdmin().isFailed()) return fail(403); - - const form = await request.formData(); - - const schema = z.object({ - name: z - .string({ message: 'Name is required.' }) - .min(3, { message: 'Name must be at least 3 characters.' }) - .max(24, { message: 'Name must be at most 24 characters.' }), - - devices: z.array( - z.string().refine((v) => db.data.devices.find((d) => d.id === v), { - message: 'Invalid device ID.', - }), - ), - }); - - const parsed = schema.safeParse({ - name: form.get('name'), - devices: form.getAll('devices'), - }); - - if (!parsed.success) { - return fail(400, { error: parsed.error.errors[0].message }); - } - - if (params.slug === 'new') { - await db.update(({ groups }) => { - groups.push({ - id: nanoid(), - name: parsed.data.name, - devices: parsed.data.devices, - }); - }); - - redirect(302, '/dashboard/groups'); - } - - await db.update(({ groups }) => { - let group = groups.find((g) => g.id === params.slug); - if (!group) return; - - group.name = parsed.data.name; - group.devices = parsed.data.devices; - }); - - redirect(302, '/dashboard/groups'); - }, - - delete: async ({ locals: { guard }, params }) => { - if (guard.requiresAdmin().isFailed()) { - return fail(403); - } - - db.data.groups = db.data.groups.filter((g) => g.id !== params.slug); - db.data.users.forEach((u) => { - u.groups = u.groups.filter((g) => g !== params.slug); - }); - db.write(); - - redirect(302, '/dashboard/groups'); - }, -}; diff --git a/src/routes/dashboard/groups/[slug]/+page.svelte b/src/routes/dashboard/groups/[slug]/+page.svelte deleted file mode 100644 index 833e75d..0000000 --- a/src/routes/dashboard/groups/[slug]/+page.svelte +++ /dev/null @@ -1,37 +0,0 @@ - - - -
- - - ({ - value: d.id.toString(), - name: d.name, - selected: data.group?.devices.find(gd => gd === d.id) ? true : false }))}/> - -
- - {#if data.group} - - {/if} -
- -
\ No newline at end of file diff --git a/src/routes/dashboard/users/+page.server.ts b/src/routes/dashboard/users/+page.server.ts deleted file mode 100644 index 661cd2d..0000000 --- a/src/routes/dashboard/users/+page.server.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { db } from '$lib/server/db'; -import type { User } from '$lib/server/db/types/user'; -import type { ServerLoad } from '@sveltejs/kit'; - -export const load: ServerLoad = async ({ locals: { guard } }) => { - guard.requiresAdmin().orRedirects(); - - return { - users: db.data.users.map((u) => { - let safeUser = structuredClone(u) as Partial; - delete safeUser['password']; - - return safeUser; - }), - }; -}; diff --git a/src/routes/dashboard/users/+page.svelte b/src/routes/dashboard/users/+page.svelte deleted file mode 100644 index 3e56ab1..0000000 --- a/src/routes/dashboard/users/+page.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - - {#snippet actionSnippet()} - - {/snippet} - - {#snippet contentSnippet()} -
- {#each data.users as user} - - {#snippet actionsSnippet()} -
- {/snippet} -
\ No newline at end of file diff --git a/src/routes/dashboard/users/[slug]/+page.server.ts b/src/routes/dashboard/users/[slug]/+page.server.ts deleted file mode 100644 index 91075a0..0000000 --- a/src/routes/dashboard/users/[slug]/+page.server.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { db } from '$lib/server/db'; -import type { User } from '$lib/server/db/types/user.js'; -import { fail, redirect, type Actions } from '@sveltejs/kit'; -import bcrypt from 'bcryptjs'; -import { nanoid } from 'nanoid'; -import { z } from 'zod'; - -export const load = async ({ locals: { guard }, params }) => { - guard.requiresAdmin().orRedirects(); - - let user = db.data.users.find((u) => u.id === params.slug) as Partial; - - if (!user && params.slug !== 'new') { - redirect(302, '/dashboard/users'); - } - - if (user) { - user = structuredClone(user); - delete user['password']; - } - - return { - user, - groups: db.data.groups, - devices: db.data.devices, - }; -}; - -export const actions: Actions = { - update: async ({ request, locals: { guard }, params }) => { - if (guard.requiresAdmin().isFailed()) return fail(403); - - const form = await request.formData(); - - const schema = z.object({ - name: z - .string({ message: 'Name is required.' }) - .min(3, { message: 'Name must be at least 3 characters.' }) - .max(24, { message: 'Name must be at most 24 characters.' }), - admin: z.boolean(), - password: z - .string() - .optional() - .refine((v) => (params.slug === 'new' ? v && v.length > 0 : true), { - message: 'Password is required at user creation.', - }) - .refine((v) => !v || v.length >= 8, { - message: 'Password must be at least 8 characters.', - }), - groups: z.array( - z.string().refine((v) => db.data.groups.find((g) => g.id === v), { - message: 'Invalid group ID.', - }), - ), - devices: z.array( - z.string().refine((v) => db.data.devices.find((d) => d.id === v), { - message: 'Invalid device ID.', - }), - ), - }); - - const parsed = schema.safeParse({ - name: form.get('name'), - admin: form.get('admin') === 'on', - password: form.get('password'), - groups: form.getAll('groups'), - devices: form.getAll('devices'), - }); - - if (!parsed.success) { - return fail(400, { error: parsed.error.errors[0].message }); - } - - if (params.slug === 'new') { - await db.update(({ users }) => { - users.push({ - id: nanoid(), - name: parsed.data.name, - admin: parsed.data.admin, - groups: parsed.data.groups, - devices: parsed.data.devices, - password: bcrypt.hashSync(parsed.data.password!, 10), - }); - }); - - redirect(302, '/dashboard/users'); - } - - await db.update(({ users }) => { - let user = users.find((u) => u.id === params.slug); - if (!user) return; - - user.name = parsed.data.name; - user.admin = parsed.data.admin; - user.groups = parsed.data.groups; - user.devices = parsed.data.devices; - - if (parsed.data.password && parsed.data.password.length > 0) { - user.password = bcrypt.hashSync(parsed.data.password, 10); - } - }); - - redirect(302, '/dashboard/users'); - }, - delete: async ({ locals: { guard }, params }) => { - if (guard.requiresAdmin().isFailed()) { - return fail(403); - } - - db.data.users = db.data.users.filter((u) => u.id !== params.slug); - db.write(); - }, -}; diff --git a/src/routes/dashboard/users/[slug]/+page.svelte b/src/routes/dashboard/users/[slug]/+page.svelte deleted file mode 100644 index 08c7db0..0000000 --- a/src/routes/dashboard/users/[slug]/+page.svelte +++ /dev/null @@ -1,60 +0,0 @@ - - - -
- - - - - - - ({ - value: g.id.toString(), - name: g.name, - selected: data.user?.groups?.find(ug => ug === g.id) ? true : false }))}/> - - ({ - value: d.id.toString(), - name: d.name, - selected: data.user?.devices?.find(ud => ud === d.id) ? true : false }))}/> - -
- - {#if data.user} - - {/if} -
- -
\ No newline at end of file diff --git a/src/routes/login/+page.server.ts b/src/routes/login/+page.server.ts index c5bda56..6e7a856 100644 --- a/src/routes/login/+page.server.ts +++ b/src/routes/login/+page.server.ts @@ -6,9 +6,9 @@ import type { Actions } from './$types'; import { dev } from '$app/environment'; export const actions = { - default: async ({ cookies, request }) => { - if (getUserFromSession(cookies.get('session'))) { - redirect(302, '/dashboard'); + default: async ({ cookies, request, locals: { guard } }) => { + if (!guard.requiresAuth().isFailed()) { + redirect(302, '/dash'); } const data = await request.formData();