From 4f36f9c037160d9526540bdb33607183c9e1074e Mon Sep 17 00:00:00 2001 From: Danel Kungla Date: Tue, 8 Jul 2025 18:34:21 +0300 Subject: [PATCH] refactor: clean up imports and enhance error logging in user workspace and team invitations actions --- app/home/(user)/(dashboard)/page.tsx | 5 ++- .../(user)/_lib/server/load-user-workspace.ts | 4 +- packages/features/accounts/src/server/api.ts | 24 ++++++------ .../multi-factor-challenge-container.tsx | 2 +- .../team-invitations-server-actions.ts | 39 +++++++++++-------- 5 files changed, 41 insertions(+), 33 deletions(-) diff --git a/app/home/(user)/(dashboard)/page.tsx b/app/home/(user)/(dashboard)/page.tsx index 71aba23..2aabc91 100644 --- a/app/home/(user)/(dashboard)/page.tsx +++ b/app/home/(user)/(dashboard)/page.tsx @@ -1,3 +1,6 @@ +import { use } from 'react'; + +import { PageBody } from '@kit/ui/page'; import { Trans } from '@kit/ui/trans'; import { createI18nServerInstance } from '~/lib/i18n/i18n.server'; @@ -6,9 +9,7 @@ import { withI18n } from '~/lib/i18n/with-i18n'; import Dashboard from '../_components/dashboard'; // local imports import { HomeLayoutPageHeader } from '../_components/home-page-header'; -import { use } from 'react'; import { loadUserWorkspace } from '../_lib/server/load-user-workspace'; -import { PageBody } from '@kit/ui/page'; export const generateMetadata = async () => { const i18n = await createI18nServerInstance(); diff --git a/app/home/(user)/_lib/server/load-user-workspace.ts b/app/home/(user)/_lib/server/load-user-workspace.ts index 2a9db62..30ae4ed 100644 --- a/app/home/(user)/_lib/server/load-user-workspace.ts +++ b/app/home/(user)/_lib/server/load-user-workspace.ts @@ -35,13 +35,13 @@ async function workspaceLoader() { accountsPromise(), workspacePromise, requireUserInServerComponent(), - tempAccountsPromise() + tempAccountsPromise(), ]); return { accounts, workspace, user, - tempVisibleAccounts + tempVisibleAccounts, }; } diff --git a/packages/features/accounts/src/server/api.ts b/packages/features/accounts/src/server/api.ts index 2ab78f5..5409f24 100644 --- a/packages/features/accounts/src/server/api.ts +++ b/packages/features/accounts/src/server/api.ts @@ -56,6 +56,7 @@ class AccountsApi { const { data, error: userError } = authUser; if (userError) { + console.error('Failed to get user', userError); throw userError; } @@ -65,25 +66,26 @@ class AccountsApi { .from('accounts_memberships') .select( ` - account_id, - user_accounts ( - name, - slug, - picture_url, - ) - `, + account_id, + accounts ( + name, + slug, + picture_url + ) + `, ) .eq('user_id', user.id) .eq('account_role', 'owner'); if (error) { + console.error('error', error); throw error; } - return accounts.map(({ user_accounts }) => ({ - label: user_accounts.name, - value: user_accounts.slug, - image: user_accounts.picture_url, + return accounts.map(({ accounts }) => ({ + label: accounts.name, + value: accounts.slug, + image: accounts.picture_url, })); } diff --git a/packages/features/auth/src/components/multi-factor-challenge-container.tsx b/packages/features/auth/src/components/multi-factor-challenge-container.tsx index 17f30f4..fb6f930 100644 --- a/packages/features/auth/src/components/multi-factor-challenge-container.tsx +++ b/packages/features/auth/src/components/multi-factor-challenge-container.tsx @@ -47,7 +47,7 @@ export function MultiFactorChallengeContainer({ const verifyMFAChallenge = useVerifyMFAChallenge({ onSuccess: () => { - router.replace(paths.redirectPath); + router.replace('/'); }, }); diff --git a/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts b/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts index 6ca6a6a..9a5bce9 100644 --- a/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts +++ b/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts @@ -6,6 +6,8 @@ import { redirect } from 'next/navigation'; import { z } from 'zod'; import { enhanceAction } from '@kit/next/actions'; +import { createNotificationsApi } from '@kit/notifications/api'; +import { getLogger } from '@kit/shared/logger'; import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { getSupabaseServerClient } from '@kit/supabase/server-client'; @@ -16,8 +18,6 @@ import { RenewInvitationSchema } from '../../schema/renew-invitation.schema'; import { UpdateInvitationSchema } from '../../schema/update-invitation.schema'; import { createAccountInvitationsService } from '../services/account-invitations.service'; import { createAccountPerSeatBillingService } from '../services/account-per-seat-billing.service'; -import { createNotificationsApi } from '@kit/notifications/api'; -import { getLogger } from '@kit/shared/logger'; /** * @name createInvitationsAction @@ -32,48 +32,53 @@ export const createInvitationsAction = enhanceAction( const service = createAccountInvitationsService(client); const api = createNotificationsApi(serviceClient); + //TODO: This does not send email. It only creates invitations in the database. await service.sendInvitations(params); const { invitations: invitationParams, accountSlug } = params; - const personalCodes = invitationParams.map(({ personal_code }) => personal_code); + const personalCodes = invitationParams.map( + ({ personal_code }) => personal_code, + ); const { data: company, error: companyError } = await client .from('accounts') .select('id') .eq('slug', accountSlug); - logger.debug({ company, companyError, personalCodes }) + logger.debug({ company, companyError, personalCodes }); if (companyError || !company?.length || !company[0]) { - throw new Error(`Failed to fetch company id: ${companyError?.message || 'not found'}`); + throw new Error( + `Failed to fetch company id: ${companyError?.message || 'not found'}`, + ); } - const { data: invitations, error: invitationError } = await serviceClient.rpc( - 'get_invitations_with_account_ids', - { + const { data: invitations, error: invitationError } = + await serviceClient.rpc('get_invitations_with_account_ids', { company_id: company[0].id, personal_codes: personalCodes, - } - ); + }); - logger.debug({ invitations, invitationError }) + logger.debug({ invitations, invitationError }); if (invitationError) { - throw new Error(`Failed to fetch invitations with accounts: ${invitationError.message}`); + throw new Error( + `Failed to fetch invitations with accounts: ${invitationError.message}`, + ); } - const notificationPromises = invitations - .map(({ invite_token, account_id }) => + const notificationPromises = invitations.map( + ({ invite_token, account_id }) => api.createNotification({ account_id: account_id!, body: `You are invited to join the company: ${accountSlug}`, link: `/join?invite_token=${invite_token}`, - }) - ); + }), + ); await Promise.all(notificationPromises); - logger.info('All invitation notifications are sent') + logger.info('All invitation notifications are sent'); revalidateMemberPage(); return {