diff --git a/supabase/migrations/20251012184352_7f785b53-5a80-4ba5-b9d9-863b8f2ea311.sql b/supabase/migrations/20251012184352_7f785b53-5a80-4ba5-b9d9-863b8f2ea311.sql new file mode 100644 index 00000000..09d67258 --- /dev/null +++ b/supabase/migrations/20251012184352_7f785b53-5a80-4ba5-b9d9-863b8f2ea311.sql @@ -0,0 +1,112 @@ +-- Setup report notification system +-- Add notification template for report alerts +INSERT INTO notification_templates ( + workflow_id, + name, + description, + category, + is_active +) VALUES ( + 'report-alert', + 'Report Alert', + 'Notification sent to moderators when a new report is submitted', + 'moderation', + true +) +ON CONFLICT (workflow_id) DO UPDATE SET + name = EXCLUDED.name, + description = EXCLUDED.description, + is_active = EXCLUDED.is_active; + +-- Create trigger function to notify moderators on new reports +CREATE OR REPLACE FUNCTION public.notify_moderators_on_new_report() + RETURNS trigger + LANGUAGE plpgsql + SECURITY DEFINER + SET search_path TO 'public' +AS $function$ +DECLARE + reporter_profile record; + function_url text; + anon_key text; + entity_preview text; +BEGIN + -- Get reporter's username or display name + SELECT username, display_name INTO reporter_profile + FROM public.profiles + WHERE user_id = NEW.reporter_id; + + -- Build entity preview based on reported entity type + entity_preview := CASE NEW.reported_entity_type + WHEN 'review' THEN + (SELECT + COALESCE(LEFT(review_text, 150), '') || + ' (Rating: ' || rating::text || '/5)' + FROM public.reviews + WHERE id = NEW.reported_entity_id + LIMIT 1) + + WHEN 'profile' THEN + (SELECT + 'User: ' || COALESCE(display_name, username, 'Unknown') + FROM public.profiles + WHERE user_id = NEW.reported_entity_id + LIMIT 1) + + WHEN 'content_submission' THEN + (SELECT + submission_type || ' submission: ' || + COALESCE(content->>'name', 'Unnamed') + FROM public.content_submissions + WHERE id = NEW.reported_entity_id + LIMIT 1) + + ELSE + 'Unknown entity' + END; + + -- Truncate preview to 200 characters and ensure it's not null + entity_preview := COALESCE(LEFT(entity_preview, 200), 'Entity preview unavailable'); + + -- Build the function URL + function_url := 'https://ydvtmnrszybqnbcqbdcy.supabase.co/functions/v1/notify-moderators-report'; + + -- Use the public anon key + anon_key := 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InlkdnRtbnJzenlicW5iY3FiZGN5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTgzMjYzNTYsImV4cCI6MjA3MzkwMjM1Nn0.DM3oyapd_omP5ZzIlrT0H9qBsiQBxBRgw2tYuqgXKX4'; + + -- Call edge function asynchronously with enhanced data + PERFORM net.http_post( + url := function_url, + headers := jsonb_build_object( + 'Content-Type', 'application/json', + 'Authorization', 'Bearer ' || anon_key, + 'apikey', anon_key + ), + body := jsonb_build_object( + 'reportId', NEW.id::text, + 'reportType', NEW.report_type, + 'reportedEntityType', NEW.reported_entity_type, + 'reportedEntityId', NEW.reported_entity_id::text, + 'reporterName', COALESCE(reporter_profile.display_name, reporter_profile.username, 'Anonymous'), + 'reason', COALESCE(NEW.reason, 'No reason provided'), + 'entityPreview', entity_preview, + 'reportedAt', to_char(NEW.created_at AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') + ) + ); + + RETURN NEW; +EXCEPTION + WHEN OTHERS THEN + -- Log error but don't fail the report submission + RAISE WARNING 'Failed to notify moderators about report: %', SQLERRM; + RETURN NEW; +END; +$function$; + +-- Create trigger on reports table +DROP TRIGGER IF EXISTS notify_moderators_on_report_insert ON public.reports; + +CREATE TRIGGER notify_moderators_on_report_insert + AFTER INSERT ON public.reports + FOR EACH ROW + EXECUTE FUNCTION public.notify_moderators_on_new_report(); \ No newline at end of file