diff --git a/src/routes/app/+page.server.ts b/src/routes/app/+page.server.ts index f34758b..336af27 100644 --- a/src/routes/app/+page.server.ts +++ b/src/routes/app/+page.server.ts @@ -3,7 +3,7 @@ import { getRequestEvent } from '$app/server'; import type { Actions, PageServerLoad } from './$types'; import { db } from '$lib/server/db'; import * as table from '$lib/server/db/schema'; -import { DirectMessageID, FriendRequestID, ServerID } from '$lib'; +import { DirectMessageID, FriendRequestID, GroupID, ServerID } from '$lib'; import { eq } from 'drizzle-orm'; import { and } from 'drizzle-orm'; import { type User } from '$lib/server/db/schema'; @@ -146,13 +146,62 @@ export const actions = { }, createGroup: async ({ request, locals }) => { const data = await request.formData(); - const members = data.getAll('member'); + const members = data.getAll('member').map((z) => z.toString()); if (!members.length) { return fail(400, { error: 'No members selected' }); } + if (members.includes(locals.user!.id)) { + return fail(403, { error: 'You cannot add yourself to a group.' }); + } - return { success: true }; + if (members.length > 9) { + return fail(400, { error: 'Too many members' }); + } + if (members.length < 2) { + return fail(400, { error: 'Not enough members' }); + } + for (const member of members) { + if (!locals.user!.friends.find((z) => z.id == member)) { + return fail(403, { error: 'A member is not your friend.' }); + } + } + const nameArray = []; + + for await (const member of members) { + const dbUser = await db.select().from(table.user).where(eq(table.user.id, member)).limit(1); + nameArray.push(dbUser[0].username); + + if (!dbUser.length) { + return fail(400, { error: 'Invalid member' }); + } + } + + members.push(locals.user!.id); + nameArray.push(locals.user!.username); + + const group = await db + .insert(table.group) + .values({ + id: GroupID.newV4(), + name: nameArray.join(', '), + owner: locals.user!.id, + members: members, + messages: [] + }) + .returning(); + + await db.transaction(async (tx) => { + for await (const member of members) { + const user = await tx.select().from(table.user).where(eq(table.user.id, member)).limit(1); + await tx + .update(table.user) + .set({ groups: (user[0].groups as string[]).concat(group[0].id) }) + .where(eq(table.user.id, member)); + } + }); + + return { success: true, group }; }, joinServer: async ({ request, locals }) => {