diff --git a/apps/website/test/integration/listGroupMembers.test.ts b/apps/website/test/integration/listGroupMembers.test.ts index 915f10596..9bacf35e7 100644 --- a/apps/website/test/integration/listGroupMembers.test.ts +++ b/apps/website/test/integration/listGroupMembers.test.ts @@ -1,7 +1,7 @@ import assert from "assert"; import { describe, it, beforeAll, afterAll } from "vitest"; import { createClient } from "@supabase/supabase-js"; -import type { Database } from "@repo/database/dbTypes"; +import type { Database, Tables } from "@repo/database/dbTypes"; import type { DGSupabaseClient } from "@repo/database/lib/client"; import { fetchOrCreateSpaceDirect, @@ -14,7 +14,7 @@ const ANON_KEY = process.env.SUPABASE_PUBLISHABLE_KEY!; const SERVICE_KEY = process.env.SUPABASE_SECRET_KEY!; const PASSWORD = "abcdefgh"; -type GroupSpaceInfo = Database["public"]["CompositeTypes"]["group_space_info"]; +type PseudoAccountInfo = Tables<"my_pseudo_accounts">; const freshClient = (): DGSupabaseClient => createClient(SUPABASE_URL, ANON_KEY); @@ -121,19 +121,18 @@ describe("list group members flow", { tags: ["database"] }, () => { const expectedSpaceIds = [spaceId1, spaceId2]; // Step 3: user1 lists group members - const { data: data1, error: error1 } = await client1.rpc( - "spaces_in_group", - { - p_group_id: createdGroupId, // eslint-disable-line @typescript-eslint/naming-convention - }, - ); + const { data: data1, error: error1 } = await client1 + .from("my_pseudo_accounts") + .select() + .eq("group_id", createdGroupId); assert(error1 === null, error1 ? error1.message : ""); assert(data1 !== null, "group spaces should not be empty"); assert(data1.length === 2, "There should be two spaces"); + console.log(data1); const spacesSeenBy1 = Object.fromEntries( - data1.filter((gm) => gm.id !== null).map((gm) => [gm.id, gm]), - ) as Record; + data1.filter((gm) => gm.space_id !== null).map((gm) => [gm.space_id, gm]), + ) as Record; assert( // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access expectedSpaceIds.every((id) => spacesSeenBy1[id] !== undefined), @@ -145,17 +144,15 @@ describe("list group members flow", { tags: ["database"] }, () => { ), ); // Step 4: user2 lists group members - const { data: data2, error: error2 } = await client2.rpc( - "spaces_in_group", - { - p_group_id: createdGroupId, // eslint-disable-line @typescript-eslint/naming-convention - }, - ); + const { data: data2, error: error2 } = await client2 + .from("my_pseudo_accounts") + .select() + .eq("group_id", createdGroupId); assert(error2 === null, error2 ? error2.message : ""); assert(data2 !== null, "group spaces should not be empty"); assert(data2.length === 2, "There should be two spaces"); const spacesSeenBy2 = new Set( - data2.map((gm) => gm.id).filter((id) => id !== null), + data2.map((gm) => gm.space_id).filter((id) => id !== null), ); assert( // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access @@ -173,19 +170,19 @@ describe("list group members flow", { tags: ["database"] }, () => { }); assert(!errorPublishSpace2); // Step 6: that space is now seen as published by 1. - const { data: data1b, error: error1b } = await client1.rpc( - "spaces_in_group", - { - p_group_id: createdGroupId, // eslint-disable-line @typescript-eslint/naming-convention - }, - ); + const { data: data1b, error: error1b } = await client1 + .from("my_pseudo_accounts") + .select() + .eq("group_id", createdGroupId); assert(error1b === null, error1b ? error1b.message : ""); assert(data1b !== null, "group spaces should not be empty"); assert(data1b.length === 2, "There should be two spaces"); const spacesSeenBy1b = Object.fromEntries( - data1b.filter((gm) => gm.id !== null).map((gm) => [gm.id, gm]), - ) as Record; + data1b + .filter((gm) => gm.space_id !== null) + .map((gm) => [gm.space_id, gm]), + ) as Record; assert( spacesSeenBy1b[spaceId2]?.sharing_permissions, "Second space should now be seen as shared", diff --git a/packages/database/src/dbTypes.ts b/packages/database/src/dbTypes.ts index c8b39d975..ef568af06 100644 --- a/packages/database/src/dbTypes.ts +++ b/packages/database/src/dbTypes.ts @@ -1322,7 +1322,9 @@ export type Database = { } my_pseudo_accounts: { Row: { + admin: boolean | null dg_account: string | null + group_id: string | null id: number | null name: string | null platform: Database["public"]["Enums"]["Platform"] | null @@ -1332,6 +1334,13 @@ export type Database = { space_id: number | null } Relationships: [ + { + foreignKeyName: "group_membership_group_id_fkey" + columns: ["group_id"] + isOneToOne: false + referencedRelation: "my_groups" + referencedColumns: ["id"] + }, { foreignKeyName: "PlatformAccount_dg_account_fkey" columns: ["dg_account"] @@ -1803,16 +1812,6 @@ export type Database = { isSetofReturn: true } } - spaces_in_group: { - Args: { p_group_id: string } - Returns: Database["public"]["CompositeTypes"]["group_space_info"][] - SetofOptions: { - from: "*" - to: "group_space_info" - isOneToOne: false - isSetofReturn: true - } - } unowned_account_in_shared_space: { Args: { p_account_id: number } Returns: boolean @@ -1983,15 +1982,6 @@ export type Database = { | Database["public"]["CompositeTypes"]["account_local_input"] | null } - group_space_info: { - id: number | null - name: string | null - platform: Database["public"]["Enums"]["Platform"] | null - sharing_permissions: - | Database["public"]["Enums"]["SpaceAccessPermissions"] - | null - admin: boolean | null - } inline_embedding_input: { model: string | null vector: number[] | null @@ -2178,3 +2168,4 @@ export const Constants = { }, }, } as const + diff --git a/packages/database/supabase/migrations/20260525003723_correct_pseudo_account.sql b/packages/database/supabase/migrations/20260525003723_correct_pseudo_account.sql new file mode 100644 index 000000000..f4b980832 --- /dev/null +++ b/packages/database/supabase/migrations/20260525003723_correct_pseudo_account.sql @@ -0,0 +1,22 @@ +DROP VIEW public.my_pseudo_accounts; + +CREATE VIEW public.my_pseudo_accounts AS +SELECT + pa.id, + pa.platform, + pa.dg_account, + gm.group_id, + gm.admin, + sa.space_id, + sp.name, + grpsa.permissions AS sharing_permissions +FROM public."PlatformAccount" AS pa + JOIN public.group_membership AS gm ON (member_id = pa.dg_account) + JOIN public.group_membership AS gm2 ON (gm2.member_id = auth.uid() AND gm2.group_id = gm.group_id) + JOIN public."SpaceAccess" AS sa ON (sa.account_uid = pa.dg_account) + JOIN public."Space" AS sp ON (sp.id = sa.space_id) + LEFT OUTER JOIN public."SpaceAccess" AS grpsa ON (grpsa.account_uid = gm.group_id AND grpsa.space_id = sp.id); + +DROP FUNCTION public.spaces_in_group; + +DROP TYPE public.group_space_info; diff --git a/packages/database/supabase/schemas/account.sql b/packages/database/supabase/schemas/account.sql index bd751b161..1c6e7a836 100644 --- a/packages/database/supabase/schemas/account.sql +++ b/packages/database/supabase/schemas/account.sql @@ -463,16 +463,18 @@ SELECT pa.id, pa.platform, pa.dg_account, + gm.group_id, + gm.admin, sa.space_id, sp.name, - mysa.permissions AS sharing_permissions + grpsa.permissions AS sharing_permissions FROM public."PlatformAccount" AS pa - JOIN public.group_membership AS gm ON (member_id = dg_account) + JOIN public.group_membership AS gm ON (member_id = pa.dg_account) JOIN public.group_membership AS gm2 ON (gm2.member_id = auth.uid() AND gm2.group_id = gm.group_id) - JOIN public."SpaceAccess" AS sa ON (sa.account_uid = dg_account) + JOIN public."SpaceAccess" AS sa ON (sa.account_uid = pa.dg_account) JOIN public."Space" AS sp ON (sp.id = sa.space_id) - LEFT OUTER JOIN public."SpaceAccess" AS mysa ON (mysa.account_uid = gm.group_id AND mysa.space_id = sp.id) -WHERE pa.agent_type = 'anonymous' AND sa.permissions = 'editor'; + LEFT OUTER JOIN public."SpaceAccess" AS grpsa ON (grpsa.account_uid = gm.group_id AND grpsa.space_id = sp.id); + CREATE TYPE public.group_space_info AS ( id BIGINT, @@ -486,10 +488,9 @@ CREATE OR REPLACE FUNCTION public.spaces_in_group(p_group_id UUID) RETURNS SETOF STABLE SET search_path = '' LANGUAGE sql AS $$ - SELECT pa.space_id as id, pa.name, pa.platform, pa.sharing_permissions, gm.admin - FROM public.my_pseudo_accounts AS pa - JOIN public.group_membership AS gm ON (gm.member_id = pa.dg_account) - WHERE gm.group_id = p_group_id; + SELECT space_id as id, name, platform, sharing_permissions, admin + FROM public.my_pseudo_accounts + WHERE group_id = p_group_id; $$; CREATE OR REPLACE FUNCTION public.accept_group_invitation(token varchar) RETURNS boolean