2025-04-12 00:25:32 +02:00

75 lines
1.6 KiB
TypeScript

import { db } from '$lib/server/db';
import { fail, redirect, type Actions, type ServerLoad } from '@sveltejs/kit';
import { nanoid } from 'nanoid';
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 name = form.get('name')?.toString();
const devices = form.getAll('devices').map((d) => d.toString());
if (!name) {
// TODO better validation
return {
error: 'MISSING_FIELDS',
};
}
if (params.slug === 'new') {
await db.update(({ groups }) => {
groups.push({
id: nanoid(),
name,
devices,
});
});
} else {
await db.update(({ groups }) => {
let group = groups.find((g) => g.id === params.slug);
if (!group) {
return;
}
group.name = name;
group.devices = 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');
},
};