diff --git a/apps/www/src/lib/components/cards/UserDetailModal.svelte b/apps/www/src/lib/components/cards/UserDetailModal.svelte index 85ae2848..9ad74e3b 100644 --- a/apps/www/src/lib/components/cards/UserDetailModal.svelte +++ b/apps/www/src/lib/components/cards/UserDetailModal.svelte @@ -19,6 +19,8 @@ let roleForm = $state(null); let unclaimedBeers = $state(null); let unclaimedBeersState = $state<'idle' | 'loading' | 'success' | 'error'>('idle'); + let showDeleteSection = $state(false); + let deleteText = $state(''); onMount(async () => { const response = await fetch(`/portal/admin/user/${selectedUser.id}`); @@ -130,5 +132,38 @@ +
+ + + {#if showDeleteSection} +
+
{ + return ({ result }) => { + if (result.type === 'success') { + onClose(); + } + }; + }} + > +
+

Skriv {selectedUser.name} for å bekrefte

+
+
+ +
+ +
+
+
+
+ {/if} +
diff --git a/apps/www/src/lib/services/user.service.ts b/apps/www/src/lib/services/user.service.ts index 3818a4c1..5c1f83aa 100644 --- a/apps/www/src/lib/services/user.service.ts +++ b/apps/www/src/lib/services/user.service.ts @@ -45,4 +45,11 @@ export class UserService { return user; } + async deleteUser(userId: string) { + return await this.#db + .delete(users) + .where(eq(users.id, userId)) + .returning() + .then((rows) => rows[0]); + } } diff --git a/apps/www/src/routes/portal/admin/user/[id]/+page.server.ts b/apps/www/src/routes/portal/admin/user/[id]/+page.server.ts index 2cee5a6b..edafe6c7 100644 --- a/apps/www/src/routes/portal/admin/user/[id]/+page.server.ts +++ b/apps/www/src/routes/portal/admin/user/[id]/+page.server.ts @@ -4,6 +4,26 @@ import type { Actions } from './$types'; export const actions: Actions = { addBeers: async ({ params, request, locals }) => { const userId = params.id; + if (!locals.user || locals.user.role !== 'board') { + return fail(401, { + success: false, + message: 'Unauthorized' + }); + } + const formData = await request.formData(); + const additionalBeers = +Number(formData.get('additionalBeers')); + const success = await locals.beerService.updateBeers(userId, additionalBeers); + if (!success) { + return fail(400, { + success: false, + message: 'Failed to update beers' + }); + } + return { success: true }; + }, + + deleteUser: async ({ params, request, locals }) => { + const userId = params.id; if (!locals.user || locals.user.role !== 'board') { return fail(401, { @@ -13,14 +33,27 @@ export const actions: Actions = { } const formData = await request.formData(); - const additionalBeers = +Number(formData.get('additionalBeers')); + const confirmDelete = formData.get('confirmDelete')?.toString(); - const success = await locals.beerService.updateBeers(userId, additionalBeers); + const user = await locals.userService.findById(userId); + if (confirmDelete !== user?.name) { + return fail(400, { + success: false, + message: "Names dosen't match" + }); + } + const success = await locals.userService.deleteUser(userId); + + const invId = await locals.invitationService.findByEmail(user.email); + + if (invId) { + await locals.invitationService.delete(invId.id); + } if (!success) { return fail(400, { success: false, - message: 'Failed to update beers' + message: 'Failed to delete user' }); }