From 48f55ff16428f5bd7578524a1fcd77f63fe8d7cd Mon Sep 17 00:00:00 2001 From: fucksophie Date: Sun, 11 Jan 2026 15:05:49 +0200 Subject: [PATCH] deleting groups --- src/lib/components/member-sidebar.svelte | 14 +++++++++ src/routes/app/+page.server.ts | 36 ++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/lib/components/member-sidebar.svelte b/src/lib/components/member-sidebar.svelte index 366055a..e3a371d 100644 --- a/src/lib/components/member-sidebar.svelte +++ b/src/lib/components/member-sidebar.svelte @@ -105,6 +105,20 @@ + + {#if (currentEntity as OverviewGroup).members === 1} +
+ + + +
+ {/if} {/if} diff --git a/src/routes/app/+page.server.ts b/src/routes/app/+page.server.ts index ed2af2d..496f589 100644 --- a/src/routes/app/+page.server.ts +++ b/src/routes/app/+page.server.ts @@ -452,6 +452,42 @@ export const actions = { return { success: true }; }, + deleteGroup: async ({ request, locals }) => { + const data = await request.formData(); + const groupId = data.get('groupId'); + + if (typeof groupId !== 'string') { + return fail(400, { error: 'Invalid group ID' }); + } + + const group = await db.select().from(table.group).where(eq(table.group.id, groupId)).limit(1); + + if (!group.length) { + return fail(404, { error: 'Group not found' }); + } + + const g = group[0]; + + if (g.owner !== locals.user!.id) { + return fail(403, { error: 'Not allowed' }); + } + + if ((g.members as string[]).length !== 1 || (g.members as string[])[0] !== locals.user!.id) { + return fail(400, { error: 'Group still has members' }); + } + + await db.transaction(async (tx) => { + await tx + .update(table.user) + .set({ + groups: locals.user!.groups.map((z) => z.id).filter((id) => id !== groupId) + }) + .where(eq(table.user.id, locals.user!.id)); + + await tx.delete(table.group).where(eq(table.group.id, groupId)); + }); + _sendToUser(locals.user!.id, { type: 'group', status: 'removed-from-group' }); + }, createServer: async ({ request, locals }) => { const data = await request.formData();