75 lines
1.6 KiB
TypeScript
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');
|
|
},
|
|
};
|