mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 23:11:13 -05:00
Apply all API enhancements
This commit is contained in:
@@ -7,6 +7,7 @@ import { validateMultipleItems } from '@/lib/entityValidationSchemas';
|
||||
import { invokeWithTracking } from '@/lib/edgeFunctionTracking';
|
||||
import type { User } from '@supabase/supabase-js';
|
||||
import type { ModerationItem } from '@/types/moderation';
|
||||
import { useQueryInvalidation } from '@/lib/queryInvalidation';
|
||||
|
||||
/**
|
||||
* Configuration for moderation actions
|
||||
@@ -29,15 +30,42 @@ export interface ModerationActions {
|
||||
}
|
||||
|
||||
/**
|
||||
* Hook for moderation action handlers
|
||||
* Extracted from useModerationQueueManager for better separation of concerns
|
||||
* Moderation Actions Hook
|
||||
*
|
||||
* @param config - Configuration object with user, callbacks, and dependencies
|
||||
* Provides functions for performing moderation actions on content submissions.
|
||||
* Handles approval, rejection, deletion, and retry operations with proper
|
||||
* cache invalidation and audit logging.
|
||||
*
|
||||
* Features:
|
||||
* - Photo submission processing
|
||||
* - Submission item validation
|
||||
* - Selective approval via edge function
|
||||
* - Comprehensive error handling
|
||||
* - Cache invalidation for affected entities
|
||||
* - Audit trail logging
|
||||
* - Performance monitoring
|
||||
*
|
||||
* @param config - Configuration with user, callbacks, and lock state
|
||||
* @returns Object with action handler functions
|
||||
*
|
||||
* @example
|
||||
* ```tsx
|
||||
* const actions = useModerationActions({
|
||||
* user,
|
||||
* onActionStart: (id) => console.log('Starting:', id),
|
||||
* onActionComplete: () => refetch(),
|
||||
* currentLockSubmissionId: lockedId
|
||||
* });
|
||||
*
|
||||
* await actions.performAction(item, 'approved', 'Looks good!');
|
||||
* ```
|
||||
*/
|
||||
export function useModerationActions(config: ModerationActionsConfig): ModerationActions {
|
||||
const { user, onActionStart, onActionComplete } = config;
|
||||
const { toast } = useToast();
|
||||
|
||||
// Cache invalidation for moderation and affected entities
|
||||
const invalidation = useQueryInvalidation();
|
||||
|
||||
/**
|
||||
* Perform moderation action (approve/reject)
|
||||
@@ -263,6 +291,30 @@ export function useModerationActions(config: ModerationActionsConfig): Moderatio
|
||||
description: `The ${item.type} has been ${action}`,
|
||||
});
|
||||
|
||||
// Invalidate specific entity caches based on submission type
|
||||
if (action === 'approved') {
|
||||
if (item.submission_type === 'photo' && item.content) {
|
||||
const entityType = item.content.entity_type as string;
|
||||
const entityId = item.content.entity_id as string;
|
||||
if (entityType && entityId) {
|
||||
invalidation.invalidateEntityPhotos(entityType, entityId);
|
||||
invalidation.invalidatePhotoCount(entityType, entityId);
|
||||
}
|
||||
} else if (item.submission_type === 'park') {
|
||||
invalidation.invalidateParks();
|
||||
invalidation.invalidateHomepageData('parks');
|
||||
} else if (item.submission_type === 'ride') {
|
||||
invalidation.invalidateRides();
|
||||
invalidation.invalidateHomepageData('rides');
|
||||
} else if (item.submission_type === 'company') {
|
||||
invalidation.invalidateHomepageData('all');
|
||||
}
|
||||
}
|
||||
|
||||
// Always invalidate moderation queue
|
||||
invalidation.invalidateModerationQueue();
|
||||
invalidation.invalidateModerationStats();
|
||||
|
||||
logger.log(`✅ Action ${action} completed for ${item.id}`);
|
||||
} catch (error: unknown) {
|
||||
logger.error('❌ Error performing action:', { error: getErrorMessage(error) });
|
||||
|
||||
Reference in New Issue
Block a user