diff --git a/packages/features/admin/package.json b/packages/features/admin/package.json index 0ed904878..e6dbe9b4f 100644 --- a/packages/features/admin/package.json +++ b/packages/features/admin/package.json @@ -14,6 +14,7 @@ "@kit/eslint-config": "workspace:*", "@kit/next": "workspace:^", "@kit/prettier-config": "workspace:*", + "@kit/shared": "workspace:^", "@kit/supabase": "workspace:^", "@kit/tailwind-config": "workspace:*", "@kit/tsconfig": "workspace:*", diff --git a/packages/features/admin/src/lib/server/admin-server-actions.ts b/packages/features/admin/src/lib/server/admin-server-actions.ts index 348535c94..31444bf64 100644 --- a/packages/features/admin/src/lib/server/admin-server-actions.ts +++ b/packages/features/admin/src/lib/server/admin-server-actions.ts @@ -4,6 +4,7 @@ import { revalidatePath } from 'next/cache'; import { redirect } from 'next/navigation'; import { enhanceAction } from '@kit/next/actions'; +import { getLogger } from '@kit/shared/logger'; import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; import { @@ -25,9 +26,14 @@ export const banUserAction = adminAction( enhanceAction( async ({ userId }) => { const service = getAdminAuthService(); + const logger = await getLogger(); + + logger.info({ userId }, `Super Admin is banning user...`); await service.banUser(userId); + logger.info({ userId }, `Super Admin has successfully banned user`); + revalidateAdmin(); return { @@ -48,9 +54,14 @@ export const reactivateUserAction = adminAction( enhanceAction( async ({ userId }) => { const service = getAdminAuthService(); + const logger = await getLogger(); + + logger.info({ userId }, `Super Admin is reactivating user...`); await service.reactivateUser(userId); + logger.info({ userId }, `Super Admin has successfully reactivated user`); + revalidateAdmin(); return { @@ -71,6 +82,9 @@ export const impersonateUserAction = adminAction( enhanceAction( async ({ userId }) => { const service = getAdminAuthService(); + const logger = await getLogger(); + + logger.info({ userId }, `Super Admin is impersonating user...`); return await service.impersonateUser(userId); }, @@ -88,9 +102,14 @@ export const deleteUserAction = adminAction( enhanceAction( async ({ userId }) => { const service = getAdminAuthService(); + const logger = await getLogger(); + + logger.info({ userId }, `Super Admin is deleting user...`); await service.deleteUser(userId); + logger.info({ userId }, `Super Admin has successfully deleted user`); + revalidateAdmin(); return redirect('/admin/accounts'); @@ -109,9 +128,17 @@ export const deleteAccountAction = adminAction( enhanceAction( async ({ accountId }) => { const service = getAdminAccountsService(); + const logger = await getLogger(); + + logger.info({ accountId }, `Super Admin is deleting account...`); await service.deleteAccount(accountId); + logger.info( + { accountId }, + `Super Admin has successfully deleted account`, + ); + revalidateAdmin(); return redirect('/admin/accounts'); diff --git a/packages/features/admin/src/lib/server/services/admin-dashboard.service.ts b/packages/features/admin/src/lib/server/services/admin-dashboard.service.ts index 0531a17c6..d699e7693 100644 --- a/packages/features/admin/src/lib/server/services/admin-dashboard.service.ts +++ b/packages/features/admin/src/lib/server/services/admin-dashboard.service.ts @@ -1,5 +1,6 @@ import { SupabaseClient } from '@supabase/supabase-js'; +import { getLogger } from '@kit/shared/logger'; import { Database } from '@kit/supabase/database'; export function createAdminDashboardService(client: SupabaseClient) { @@ -18,6 +19,11 @@ export class AdminDashboardService { count: 'estimated', }, ) { + const logger = await getLogger(); + const ctx = { + name: `admin.dashboard`, + }; + const selectParams = { count, head: true, @@ -29,7 +35,12 @@ export class AdminDashboardService { .eq('status', 'active') .then((response) => { if (response.error) { - throw new Error(response.error.message); + logger.error( + { ...ctx, error: response.error.message }, + `Error fetching active subscriptions`, + ); + + throw new Error(); } return response.count; @@ -41,7 +52,12 @@ export class AdminDashboardService { .eq('status', 'trialing') .then((response) => { if (response.error) { - throw new Error(response.error.message); + logger.error( + { ...ctx, error: response.error.message }, + `Error fetching trialing subscriptions`, + ); + + throw new Error(); } return response.count; @@ -53,7 +69,12 @@ export class AdminDashboardService { .eq('is_personal_account', true) .then((response) => { if (response.error) { - throw new Error(response.error.message); + logger.error( + { ...ctx, error: response.error.message }, + `Error fetching personal accounts`, + ); + + throw new Error(); } return response.count; @@ -65,7 +86,12 @@ export class AdminDashboardService { .eq('is_personal_account', false) .then((response) => { if (response.error) { - throw new Error(response.error.message); + logger.error( + { ...ctx, error: response.error.message }, + `Error fetching team accounts`, + ); + + throw new Error(); } return response.count; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb678dac0..98735f225 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -642,6 +642,9 @@ importers: '@kit/prettier-config': specifier: workspace:* version: link:../../../tooling/prettier + '@kit/shared': + specifier: workspace:^ + version: link:../../shared '@kit/supabase': specifier: workspace:^ version: link:../../supabase @@ -1038,7 +1041,7 @@ importers: dependencies: '@sentry/nextjs': specifier: ^8.14.0 - version: 8.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.92.1) + version: 8.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.92.1) devDependencies: '@kit/eslint-config': specifier: workspace:* @@ -10856,7 +10859,7 @@ snapshots: '@sentry/types': 8.14.0 '@sentry/utils': 8.14.0 - '@sentry/nextjs@8.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(next@14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.92.1)': + '@sentry/nextjs@8.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)(next@14.2.4(@opentelemetry/api@1.9.0)(@playwright/test@1.45.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.92.1)': dependencies: '@opentelemetry/instrumentation-http': 0.52.1(@opentelemetry/api@1.9.0) '@rollup/plugin-commonjs': 26.0.1(rollup@3.29.4)