From 937f3e4a71d9140e29550f6a04d1bad3b526f0b9 Mon Sep 17 00:00:00 2001 From: Danel Kungla Date: Mon, 18 Aug 2025 15:59:59 +0300 Subject: [PATCH] feat(account): refactor team account retrieval and update SQL function for workspace --- app/home/[account]/page.tsx | 2 +- lib/services/account.service.ts | 10 ++-- packages/supabase/src/database.types.ts | 4 +- ...00_mismatch_team_account_workspace_fix.sql | 50 +++++++++++++++++++ 4 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 supabase/migrations/20250818155200_mismatch_team_account_workspace_fix.sql diff --git a/app/home/[account]/page.tsx b/app/home/[account]/page.tsx index e76b6f7..96bb79c 100644 --- a/app/home/[account]/page.tsx +++ b/app/home/[account]/page.tsx @@ -33,7 +33,7 @@ function TeamAccountHomePage({ params }: TeamAccountHomePageProps) { const client = getSupabaseServerClient(); const api = createTeamAccountsApi(client); const teamAccount = use(api.getTeamAccount(account)); - console.log('teamAccount', teamAccount); + return ( <> ; type Membership = Tables<{ schema: 'medreport' }, 'accounts_memberships'>; -export type AccountWithMemberships = Account & { memberships: Membership[] } +export type AccountWithMemberships = Account & { memberships: Membership[] }; export async function getAccount(id: string): Promise { const { data } = await getSupabaseServerClient() @@ -28,6 +29,7 @@ export async function getAccountAdmin({ .schema('medreport') .from('accounts') .select('*, memberships: accounts_memberships (*)') + .eq('is_personal_account', true); if (primaryOwnerUserId) { query.eq('primary_owner_user_id', primaryOwnerUserId); diff --git a/packages/supabase/src/database.types.ts b/packages/supabase/src/database.types.ts index 9c0ec2f..8142777 100644 --- a/packages/supabase/src/database.types.ts +++ b/packages/supabase/src/database.types.ts @@ -1640,9 +1640,7 @@ export type Database = { Returns: Json } create_team_account: { - Args: - | { account_name: string } - | { account_name: string; new_personal_code: string } + Args: { account_name: string; new_personal_code: string } Returns: { application_role: Database["medreport"]["Enums"]["application_role"] city: string | null diff --git a/supabase/migrations/20250818155200_mismatch_team_account_workspace_fix.sql b/supabase/migrations/20250818155200_mismatch_team_account_workspace_fix.sql new file mode 100644 index 0000000..ffc25e4 --- /dev/null +++ b/supabase/migrations/20250818155200_mismatch_team_account_workspace_fix.sql @@ -0,0 +1,50 @@ +DROP FUNCTION IF EXISTS medreport.team_account_workspace(text); + +CREATE FUNCTION medreport.team_account_workspace(account_slug text) + RETURNS TABLE( + id uuid, + name character varying, + picture_url character varying, + slug text, + role character varying, + role_hierarchy_level integer, + primary_owner_user_id uuid, + subscription_status medreport.subscription_status, + permissions medreport.app_permissions[], + account_role varchar, + application_role medreport.application_role + ) + LANGUAGE plpgsql + SET search_path TO '' +AS $function$begin + return QUERY + select + accounts.id, + accounts.name, + accounts.picture_url, + accounts.slug, + roles.name, + roles.hierarchy_level, + accounts.primary_owner_user_id, + subscriptions.status, + array_agg(role_permissions.permission), + accounts_memberships.account_role, + accounts.application_role + from + medreport.accounts + join medreport.accounts_memberships on accounts.id = accounts_memberships.account_id + left join medreport.subscriptions on accounts.id = subscriptions.account_id + join medreport.roles on accounts_memberships.account_role = roles.name + left join medreport.role_permissions on accounts_memberships.account_role = role_permissions.role + where + accounts.slug = account_slug + and medreport.accounts_memberships.user_id = (select auth.uid()) + group by + accounts.id, + accounts_memberships.account_role, + subscriptions.status, + roles.hierarchy_level, + roles.name; +end;$function$; + +GRANT EXECUTE ON FUNCTION medreport.team_account_workspace(text) TO authenticated, service_role; \ No newline at end of file