From 872d7fdf43b972ad367f341302530a3ceabb44ac Mon Sep 17 00:00:00 2001 From: core Date: Thu, 21 Mar 2024 13:34:32 -0400 Subject: [PATCH] allow editing existing roles --- src/routes/[id]/manage/+page.svelte | 10 +- .../manage/editrole/[roleId]/+page.server.ts | 94 +++++++++++++++++++ .../manage/editrole/[roleId]/+page.svelte | 77 +++++++++++++++ .../[id]/manage/editrole/[roleId]/schema.ts | 16 ++++ 4 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 src/routes/[id]/manage/editrole/[roleId]/+page.server.ts create mode 100644 src/routes/[id]/manage/editrole/[roleId]/+page.svelte create mode 100644 src/routes/[id]/manage/editrole/[roleId]/schema.ts diff --git a/src/routes/[id]/manage/+page.svelte b/src/routes/[id]/manage/+page.svelte index 0e00fdd..de13aeb 100644 --- a/src/routes/[id]/manage/+page.svelte +++ b/src/routes/[id]/manage/+page.svelte @@ -11,10 +11,6 @@

Manage Facility

-
@@ -22,10 +18,14 @@ Roles + {#each data.facility.roles as role} - + {role.name} {/each} diff --git a/src/routes/[id]/manage/editrole/[roleId]/+page.server.ts b/src/routes/[id]/manage/editrole/[roleId]/+page.server.ts new file mode 100644 index 0000000..0950aa9 --- /dev/null +++ b/src/routes/[id]/manage/editrole/[roleId]/+page.server.ts @@ -0,0 +1,94 @@ +import type { PageServerLoad, Actions } from "./$types"; +import { can } from "$lib/perms/can"; +import { EDIT_DETAILS, PERMISSIONS } from "$lib/perms/permissions"; +import { redirect } from "sveltekit-flash-message/server"; +import { superValidate } from "sveltekit-superforms/server"; +import { formSchema } from "./schema"; +import { fail } from "@sveltejs/kit"; +import { loadUserData } from "$lib/auth"; +import prisma from "$lib/prisma"; +import { ulid } from "ulid"; + +export const load: PageServerLoad = async ({ params, cookies }) => { + if (!can(EDIT_DETAILS)) { + redirect( + 307, + `/${params.id}`, + { type: "error", message: "You don't have permission for that." }, + cookies, + ); + } + + let role = await prisma.role.findUnique({ + where: { + id: params.roleId, + facilityId: params.id + } + }); + + if (!role) { + return redirect(307, `/${params.id}/manage`, {type: 'error', message: 'Could not find that role.'}, cookies); + } + + let form = await superValidate(formSchema); + + form.data.color = role.color; + form.data.name = role.name; + + for (let permission of role.permissions) { + // @ts-ignore + form.data[permission] = true; + } + + console.log(form.data); + + return { + form, + }; +}; + +export const actions: Actions = { + default: async (event) => { + const form = await superValidate(event, formSchema); + if (!form.valid) { + return fail(400, { + form, + }); + } + + await loadUserData(event.cookies, event.params.id); + + if (!can(EDIT_DETAILS)) { + return fail(403, { + form, + }); + } + + let permissions = []; + + for (let permission of PERMISSIONS) { + if (Object.keys(form.data).includes(permission.id)) { + // @ts-ignore + if (form.data[permission.id] && can(permission)) { + permissions.push(permission.id); + } + } + } + + await prisma.role.update({ + where: { + id: event.params.roleId, + facilityId: event.params.id + }, + data: { + name: form.data.name, + permissions, + color: form.data.color, + }, + }); + + return { + form, + }; + }, +}; diff --git a/src/routes/[id]/manage/editrole/[roleId]/+page.svelte b/src/routes/[id]/manage/editrole/[roleId]/+page.svelte new file mode 100644 index 0000000..236267d --- /dev/null +++ b/src/routes/[id]/manage/editrole/[roleId]/+page.svelte @@ -0,0 +1,77 @@ + + +
+

Edit Role

+
+ + + + + Role Name + + + + + + + Role Color + + + + A + Tailwind color + + , e.g. sky-500 + + + + {#each PERMISSIONS as permission} + {#if can(permission)} + + +
+ {permission.id} + + {permission.description} + +
+ +
+
+ {/if} + {/each} + Save +
\ No newline at end of file diff --git a/src/routes/[id]/manage/editrole/[roleId]/schema.ts b/src/routes/[id]/manage/editrole/[roleId]/schema.ts new file mode 100644 index 0000000..6f59ddc --- /dev/null +++ b/src/routes/[id]/manage/editrole/[roleId]/schema.ts @@ -0,0 +1,16 @@ +import { z } from "zod"; +import { PERMISSIONS } from "$lib/perms/permissions"; + +let baseSchema = { + name: z.string(), + color: z.string(), +}; + +for (let permission of PERMISSIONS) { + // @ts-ignore + baseSchema[permission.id] = z.preprocess((x) => String(x) === 'on', z.any()); +} + +export const formSchema = z.object(baseSchema); + +export type FormSchema = typeof formSchema;