From 57368eb3095b596deb4c463e6523884d52d46d4e Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 13:43:23 +0000 Subject: [PATCH] Fix: Correctly drop and recreate claim_next_submission function --- src/components/moderation/ModerationQueue.tsx | 9 +--- .../moderation/QueueStatsDashboard.tsx | 19 +------ src/hooks/useModerationQueue.ts | 9 +--- src/integrations/supabase/types.ts | 8 --- ...3_c39492e2-9b49-40b8-9c74-6031fc0c7b81.sql | 50 +++++++++++++++++++ 5 files changed, 56 insertions(+), 39 deletions(-) create mode 100644 supabase/migrations/20251009134203_c39492e2-9b49-40b8-9c74-6031fc0c7b81.sql diff --git a/src/components/moderation/ModerationQueue.tsx b/src/components/moderation/ModerationQueue.tsx index 4715c40e..e372ae2e 100644 --- a/src/components/moderation/ModerationQueue.tsx +++ b/src/components/moderation/ModerationQueue.tsx @@ -173,11 +173,10 @@ export const ModerationQueue = forwardRef((props, ref) => { reviewer_id, reviewer_notes, escalated, - priority, assigned_to, locked_until `) - .order('priority', { ascending: false }) + .order('escalated', { ascending: false }) .order('created_at', { ascending: true }); // Apply tab-based status filtering @@ -2025,15 +2024,11 @@ export const ModerationQueue = forwardRef((props, ref) => {
{/* Stats Grid */} -
+
{queue.queueStats.pendingCount}
Pending
-
-
{queue.queueStats.highPriorityCount}
-
High Priority
-
{queue.queueStats.assignedToMe}
Assigned to Me
diff --git a/src/components/moderation/QueueStatsDashboard.tsx b/src/components/moderation/QueueStatsDashboard.tsx index 465eab95..f11dde1b 100644 --- a/src/components/moderation/QueueStatsDashboard.tsx +++ b/src/components/moderation/QueueStatsDashboard.tsx @@ -1,6 +1,6 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; -import { Clock, AlertTriangle, CheckCircle, Users } from 'lucide-react'; +import { Clock, CheckCircle, Users } from 'lucide-react'; import { useModerationQueue } from '@/hooks/useModerationQueue'; export function QueueStatsDashboard() { @@ -19,7 +19,7 @@ export function QueueStatsDashboard() { const slaStatus = getSLAStatus(queueStats.avgWaitHours); return ( -
+
Pending Queue @@ -70,21 +70,6 @@ export function QueueStatsDashboard() {

- - - - High Priority - - - -
- {queueStats.highPriorityCount} -
-

- Escalated submissions -

-
-
); } diff --git a/src/hooks/useModerationQueue.ts b/src/hooks/useModerationQueue.ts index a6c25e49..8abc81c7 100644 --- a/src/hooks/useModerationQueue.ts +++ b/src/hooks/useModerationQueue.ts @@ -6,7 +6,6 @@ import { useToast } from './use-toast'; interface QueuedSubmission { submission_id: string; submission_type: string; - priority: number; waiting_time: string; // PostgreSQL interval format } @@ -20,7 +19,6 @@ interface QueueStats { pendingCount: number; assignedToMe: number; avgWaitHours: number; - highPriorityCount: number; } export const useModerationQueue = () => { @@ -67,16 +65,14 @@ export const useModerationQueue = () => { (acc, row) => ({ pendingCount: acc.pendingCount + (row.pending_count || 0), avgWaitHours: acc.avgWaitHours + (row.avg_wait_hours || 0), - highPriorityCount: acc.highPriorityCount + (row.escalated_count || 0), }), - { pendingCount: 0, avgWaitHours: 0, highPriorityCount: 0 } + { pendingCount: 0, avgWaitHours: 0 } ); setQueueStats({ pendingCount: totals.pendingCount, assignedToMe: assignedCount || 0, avgWaitHours: slaData.length > 0 ? totals.avgWaitHours / slaData.length : 0, - highPriorityCount: totals.highPriorityCount, }); } } catch (error) { @@ -166,7 +162,7 @@ export const useModerationQueue = () => { toast({ title: 'Submission Claimed', - description: `Priority ${claimed.priority} ${claimed.submission_type} (waiting ${formatInterval(claimed.waiting_time)})`, + description: `${claimed.submission_type} submission (waiting ${formatInterval(claimed.waiting_time)})`, }); return claimed.submission_id; @@ -279,7 +275,6 @@ export const useModerationQueue = () => { escalated_at: new Date().toISOString(), escalated_by: user.id, escalation_reason: reason, - priority: 10, // Max priority }) .eq('id', submissionId); diff --git a/src/integrations/supabase/types.ts b/src/integrations/supabase/types.ts index df89e3ee..d127ad78 100644 --- a/src/integrations/supabase/types.ts +++ b/src/integrations/supabase/types.ts @@ -220,7 +220,6 @@ export type Database = { id: string locked_until: string | null original_submission_id: string | null - priority: number resolved_at: string | null review_count: number | null reviewed_at: string | null @@ -246,7 +245,6 @@ export type Database = { id?: string locked_until?: string | null original_submission_id?: string | null - priority?: number resolved_at?: string | null review_count?: number | null reviewed_at?: string | null @@ -272,7 +270,6 @@ export type Database = { id?: string locked_until?: string | null original_submission_id?: string | null - priority?: number resolved_at?: string | null review_count?: number | null reviewed_at?: string | null @@ -2640,10 +2637,6 @@ export type Database = { } } Functions: { - calculate_submission_priority: { - Args: { submission_id: string } - Returns: number - } can_approve_submission_item: { Args: { item_id: string } Returns: boolean @@ -2675,7 +2668,6 @@ export type Database = { claim_next_submission: { Args: { lock_duration?: unknown; moderator_id: string } Returns: { - priority: number submission_id: string submission_type: string waiting_time: unknown diff --git a/supabase/migrations/20251009134203_c39492e2-9b49-40b8-9c74-6031fc0c7b81.sql b/supabase/migrations/20251009134203_c39492e2-9b49-40b8-9c74-6031fc0c7b81.sql new file mode 100644 index 00000000..c7b246b6 --- /dev/null +++ b/supabase/migrations/20251009134203_c39492e2-9b49-40b8-9c74-6031fc0c7b81.sql @@ -0,0 +1,50 @@ +-- Remove priority system entirely + +-- Drop the priority calculation function +DROP FUNCTION IF EXISTS public.calculate_submission_priority(UUID); + +-- Drop the existing claim_next_submission function completely +DROP FUNCTION IF EXISTS public.claim_next_submission(UUID, INTERVAL); + +-- Recreate claim_next_submission without priority logic +CREATE OR REPLACE FUNCTION public.claim_next_submission( + moderator_id UUID, + lock_duration INTERVAL DEFAULT '15 minutes' +) +RETURNS TABLE ( + submission_id UUID, + submission_type TEXT, + waiting_time INTERVAL +) +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path = public +AS $$ +BEGIN + -- Simple FIFO with escalation priority + RETURN QUERY + UPDATE content_submissions + SET + assigned_to = moderator_id, + assigned_at = NOW(), + locked_until = NOW() + lock_duration, + first_reviewed_at = COALESCE(first_reviewed_at, NOW()) + WHERE id = ( + SELECT cs.id FROM content_submissions cs + WHERE cs.status IN ('pending', 'partially_approved') + AND (cs.assigned_to IS NULL OR cs.locked_until < NOW()) + ORDER BY + cs.escalated DESC, -- Escalated items first + cs.submitted_at ASC -- Then oldest first + LIMIT 1 + FOR UPDATE SKIP LOCKED + ) + RETURNING + content_submissions.id, + content_submissions.submission_type, + NOW() - content_submissions.submitted_at; +END; +$$; + +-- Drop the priority column from content_submissions +ALTER TABLE public.content_submissions DROP COLUMN IF EXISTS priority; \ No newline at end of file