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.
This commit is contained in:
gbuomprisco
2024-07-05 12:31:43 +08:00
parent 8f097a4016
commit c93fea9658
4 changed files with 63 additions and 6 deletions

View File

@@ -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:*",

View File

@@ -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');

View File

@@ -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<Database>) {
@@ -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;

7
pnpm-lock.yaml generated
View File

@@ -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)