feat: Implement comprehensive audit logging

This commit is contained in:
gpt-engineer-app[bot]
2025-10-27 17:14:24 +00:00
parent 79277c744a
commit 2de13c12e4
4 changed files with 158 additions and 0 deletions

View File

@@ -235,6 +235,25 @@ export function useModerationActions(config: ModerationActionsConfig): Moderatio
if (error) throw error;
// Log audit trail for review moderation
if (table === 'reviews' && user) {
try {
await supabase.rpc('log_admin_action', {
_admin_user_id: user.id,
_target_user_id: item.user_id,
_action: `review_${action}`,
_details: {
review_id: item.id,
entity_type: item.entity_type,
entity_id: item.entity_id,
moderator_notes: moderatorNotes
}
});
} catch (auditError) {
logger.error('Failed to log review moderation audit', { error: auditError });
}
}
toast({
title: `Content ${action}`,
description: `The ${item.type} has been ${action}`,
@@ -266,10 +285,35 @@ export function useModerationActions(config: ModerationActionsConfig): Moderatio
onActionStart(item.id);
try {
// Fetch submission details for audit log
const { data: submission } = await supabase
.from('content_submissions')
.select('user_id, submission_type, status')
.eq('id', item.id)
.single();
const { error } = await supabase.from('content_submissions').delete().eq('id', item.id);
if (error) throw error;
// Log audit trail for deletion
if (user && submission) {
try {
await supabase.rpc('log_admin_action', {
_admin_user_id: user.id,
_target_user_id: submission.user_id,
_action: 'submission_deleted',
_details: {
submission_id: item.id,
submission_type: submission.submission_type,
status_when_deleted: submission.status
}
});
} catch (auditError) {
logger.error('Failed to log submission deletion audit', { error: auditError });
}
}
toast({
title: 'Submission deleted',
description: 'The submission has been permanently deleted',
@@ -302,6 +346,23 @@ export function useModerationActions(config: ModerationActionsConfig): Moderatio
const { resetRejectedItemsToPending } = await import('@/lib/submissionItemsService');
await resetRejectedItemsToPending(item.id);
// Log audit trail for reset
if (user) {
try {
await supabase.rpc('log_admin_action', {
_admin_user_id: user.id,
_target_user_id: item.user_id,
_action: 'submission_reset',
_details: {
submission_id: item.id,
submission_type: item.submission_type
}
});
} catch (auditError) {
logger.error('Failed to log submission reset audit', { error: auditError });
}
}
toast({
title: 'Reset Complete',
description: 'Submission and all items have been reset to pending status',
@@ -355,6 +416,25 @@ export function useModerationActions(config: ModerationActionsConfig): Moderatio
if (error) throw error;
// Log audit trail for retry
if (user) {
try {
await supabase.rpc('log_admin_action', {
_admin_user_id: user.id,
_target_user_id: item.user_id,
_action: 'submission_retried',
_details: {
submission_id: item.id,
submission_type: item.submission_type,
items_retried: failedItems.length,
request_id: requestId
}
});
} catch (auditError) {
logger.error('Failed to log submission retry audit', { error: auditError });
}
}
toast({
title: 'Items Retried',
description: `Successfully retried ${failedItems.length} failed item(s)${requestId ? ` (Request: ${requestId.substring(0, 8)})` : ''}`,