mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 05:31:14 -05:00
Fix: Add validation blocking to main queue approval
This commit is contained in:
@@ -3,6 +3,7 @@ import { supabase } from '@/integrations/supabase/client';
|
|||||||
import { useToast } from '@/hooks/use-toast';
|
import { useToast } from '@/hooks/use-toast';
|
||||||
import { logger } from '@/lib/logger';
|
import { logger } from '@/lib/logger';
|
||||||
import { getErrorMessage } from '@/lib/errorHandler';
|
import { getErrorMessage } from '@/lib/errorHandler';
|
||||||
|
import { validateMultipleItems } from '@/lib/entityValidationSchemas';
|
||||||
import type { User } from '@supabase/supabase-js';
|
import type { User } from '@supabase/supabase-js';
|
||||||
import type { ModerationItem } from '@/types/moderation';
|
import type { ModerationItem } from '@/types/moderation';
|
||||||
|
|
||||||
@@ -123,6 +124,64 @@ export function useModerationActions(config: ModerationActionsConfig): Moderatio
|
|||||||
|
|
||||||
if (submissionItems && submissionItems.length > 0) {
|
if (submissionItems && submissionItems.length > 0) {
|
||||||
if (action === 'approved') {
|
if (action === 'approved') {
|
||||||
|
// Fetch full item data for validation
|
||||||
|
const { data: fullItems, error: itemError } = await supabase
|
||||||
|
.from('submission_items')
|
||||||
|
.select('id, item_type, item_data')
|
||||||
|
.eq('submission_id', item.id)
|
||||||
|
.in('status', ['pending', 'rejected']);
|
||||||
|
|
||||||
|
if (itemError) {
|
||||||
|
throw new Error(`Failed to fetch submission items: ${itemError.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fullItems && fullItems.length > 0) {
|
||||||
|
// Run validation on all items
|
||||||
|
const validationResults = await validateMultipleItems(
|
||||||
|
fullItems.map(item => ({
|
||||||
|
item_type: item.item_type,
|
||||||
|
item_data: item.item_data,
|
||||||
|
id: item.id
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
|
||||||
|
// Check for blocking errors
|
||||||
|
const itemsWithBlockingErrors = fullItems.filter(item => {
|
||||||
|
const result = validationResults.get(item.id);
|
||||||
|
return result && result.blockingErrors.length > 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
// CRITICAL: Block approval if any item has blocking errors
|
||||||
|
if (itemsWithBlockingErrors.length > 0) {
|
||||||
|
const errorDetails = itemsWithBlockingErrors.map(item => {
|
||||||
|
const result = validationResults.get(item.id);
|
||||||
|
return `${item.item_type}: ${result?.blockingErrors[0]?.message || 'Unknown error'}`;
|
||||||
|
}).join(', ');
|
||||||
|
|
||||||
|
toast({
|
||||||
|
title: 'Cannot Approve - Validation Errors',
|
||||||
|
description: `${itemsWithBlockingErrors.length} item(s) have blocking errors that must be fixed first. ${errorDetails}`,
|
||||||
|
variant: 'destructive',
|
||||||
|
});
|
||||||
|
|
||||||
|
// Return early - do NOT proceed with approval
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for warnings (optional - can proceed but inform user)
|
||||||
|
const itemsWithWarnings = fullItems.filter(item => {
|
||||||
|
const result = validationResults.get(item.id);
|
||||||
|
return result && result.warnings.length > 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (itemsWithWarnings.length > 0) {
|
||||||
|
logger.info('Approval proceeding with warnings', {
|
||||||
|
submissionId: item.id,
|
||||||
|
warningCount: itemsWithWarnings.length
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await supabase.functions.invoke('process-selective-approval', {
|
await supabase.functions.invoke('process-selective-approval', {
|
||||||
body: {
|
body: {
|
||||||
itemIds: submissionItems.map((i) => i.id),
|
itemIds: submissionItems.map((i) => i.id),
|
||||||
|
|||||||
Reference in New Issue
Block a user