From 1478bcf27800694a5d2635fb7b784cdd8479a17a Mon Sep 17 00:00:00 2001 From: Marc-Antoine Parent Date: Mon, 25 May 2026 11:52:32 -0400 Subject: [PATCH 1/2] Add error information to createGroup --- apps/website/app/utils/supabase/account.ts | 20 +++++++++++++++++-- .../test/integration/groupInvitation.test.ts | 6 +++++- .../test/integration/leaveGroup.test.ts | 6 +++++- .../test/integration/listGroupMembers.test.ts | 6 +++++- .../test/integration/listMyGroups.test.ts | 6 +++++- 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/apps/website/app/utils/supabase/account.ts b/apps/website/app/utils/supabase/account.ts index b6f0fbc56..8a683ad86 100644 --- a/apps/website/app/utils/supabase/account.ts +++ b/apps/website/app/utils/supabase/account.ts @@ -114,12 +114,28 @@ export const acceptGroupInvitation = async ( export const createGroup = async ( client: DGSupabaseClient, name: string, -): Promise => { +): Promise<{ groupId: string | null; error: string | null }> => { + // eslint-disable-next-line @typescript-eslint/naming-convention const result = await client.functions.invoke<{ group_id: string }>( "create-group", { body: { name } }, ); - return result.data?.group_id || null; + if (result.error) { + let message = + typeof result.error === "string" + ? result.error + : (result.error as { message: string }).message; + try { + const body = (await ( + result.error as { context?: Response } + ).context?.json()) as { msg?: string } | undefined; + if (body?.msg) message = body.msg; + } catch { + // ignore parse errors + } + return { groupId: null, error: message }; + } + return { groupId: result.data?.group_id ?? null, error: null }; }; export const removeFromGroup = async ({ diff --git a/apps/website/test/integration/groupInvitation.test.ts b/apps/website/test/integration/groupInvitation.test.ts index 669942087..97c7dd773 100644 --- a/apps/website/test/integration/groupInvitation.test.ts +++ b/apps/website/test/integration/groupInvitation.test.ts @@ -93,7 +93,11 @@ describe( it("executes the full invitation flow", async () => { // Step 1: user1 creates a group - const groupId = await createGroup(client1, "vitest-invite-group"); + const { groupId, error: createError } = await createGroup( + client1, + "vitest-invite-group", + ); + expect(createError, "createGroup should not error").toBeNull(); expect(groupId, "createGroup should return a group ID").toBeTruthy(); createdGroupId = groupId; diff --git a/apps/website/test/integration/leaveGroup.test.ts b/apps/website/test/integration/leaveGroup.test.ts index bb7880ee8..109e02dd0 100644 --- a/apps/website/test/integration/leaveGroup.test.ts +++ b/apps/website/test/integration/leaveGroup.test.ts @@ -103,7 +103,11 @@ describe("leave group flow", { tags: ["database"] }, () => { it("lists group members", async () => { // Step 1: user1 creates a group - const groupId = await createGroup(client1, "vitest-invite-group"); + const { groupId, error: createError } = await createGroup( + client1, + "vitest-invite-group", + ); + assert(createError === null, createError!); assert(groupId !== null, "createGroup should return a group ID"); createdGroupId = groupId; diff --git a/apps/website/test/integration/listGroupMembers.test.ts b/apps/website/test/integration/listGroupMembers.test.ts index e16717d6d..4576422a7 100644 --- a/apps/website/test/integration/listGroupMembers.test.ts +++ b/apps/website/test/integration/listGroupMembers.test.ts @@ -105,7 +105,11 @@ describe("list group members flow", { tags: ["database"] }, () => { it("lists group members", async () => { // Step 1: user1 creates a group - const groupId = await createGroup(client1, "vitest-invite-group"); + const { groupId, error: createError } = await createGroup( + client1, + "vitest-invite-group", + ); + assert(createError === null, createError!); assert(groupId !== null, "createGroup should return a group ID"); createdGroupId = groupId; diff --git a/apps/website/test/integration/listMyGroups.test.ts b/apps/website/test/integration/listMyGroups.test.ts index 8f4dbd33c..6149da568 100644 --- a/apps/website/test/integration/listMyGroups.test.ts +++ b/apps/website/test/integration/listMyGroups.test.ts @@ -103,7 +103,11 @@ describe("list group members flow", { tags: ["database"] }, () => { it("lists group members", async () => { // Step 1: user1 creates a group - const groupId = await createGroup(client1, "vitest-invite-group"); + const { groupId, error: createError } = await createGroup( + client1, + "vitest-invite-group", + ); + assert(createError === null, createError!); assert(groupId !== null, "createGroup should return a group ID"); createdGroupId = groupId; From 974c666092ac872de2b0e89193bb5a59fc9d12e8 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Parent Date: Tue, 26 May 2026 09:22:29 -0400 Subject: [PATCH 2/2] remove spurious eslint --- apps/website/app/utils/supabase/account.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/website/app/utils/supabase/account.ts b/apps/website/app/utils/supabase/account.ts index 8a683ad86..e7305f4c9 100644 --- a/apps/website/app/utils/supabase/account.ts +++ b/apps/website/app/utils/supabase/account.ts @@ -85,14 +85,10 @@ export const createGroupInvitation = async ({ .eq("member_id", userData.id) .maybeSingle(); if (membershipReq.data?.admin !== true) return null; - /* eslint-disable @typescript-eslint/naming-convention */ const { data, error } = await client.rpc("create_secret_token", { - /* eslint-disable @typescript-eslint/naming-convention */ v_payload: { groupId, type: "groupInvitation", admin }, expiry_interval: "60d", - /* eslint-enable @typescript-eslint/naming-convention */ }); - /* eslint-enable @typescript-eslint/naming-convention */ if (error || !data) return null; return data; }; @@ -115,7 +111,6 @@ export const createGroup = async ( client: DGSupabaseClient, name: string, ): Promise<{ groupId: string | null; error: string | null }> => { - // eslint-disable-next-line @typescript-eslint/naming-convention const result = await client.functions.invoke<{ group_id: string }>( "create-group", { body: { name } },