From c93fea9658d9055ee516619ce91cc98ee2758a49 Mon Sep 17 00:00:00 2001 From: gbuomprisco Date: Fri, 5 Jul 2024 12:31:43 +0800 Subject: [PATCH] Add logging to admin actions and dashboard service The new logging will enhance the visibility of important actions by the admin, including banning and unbanning users, deleting users and accounts. The features/admin logging dependency has been added. In the admin dashboard service, specific logging has been implemented to track errors in fetching data. --- packages/features/admin/package.json | 1 + .../src/lib/server/admin-server-actions.ts | 27 +++++++++++++++ .../services/admin-dashboard.service.ts | 34 ++++++++++++++++--- pnpm-lock.yaml | 7 ++-- 4 files changed, 63 insertions(+), 6 deletions(-) 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)