diff --git a/supabase/functions/process-selective-approval/index.ts b/supabase/functions/process-selective-approval/index.ts index 6042f05f..f362735f 100644 --- a/supabase/functions/process-selective-approval/index.ts +++ b/supabase/functions/process-selective-approval/index.ts @@ -178,8 +178,7 @@ const handler = async (req: Request) => { p_item_ids: itemIds, p_moderator_id: user.id, p_submitter_id: submission.user_id, - p_request_id: requestId, - p_idempotency_key: idempotencyKey + p_request_id: requestId } ); diff --git a/supabase/migrations/20251108025615_15e575b0-4758-4498-ae64-27d2bad919fc.sql b/supabase/migrations/20251108025615_15e575b0-4758-4498-ae64-27d2bad919fc.sql new file mode 100644 index 00000000..a93b01dc --- /dev/null +++ b/supabase/migrations/20251108025615_15e575b0-4758-4498-ae64-27d2bad919fc.sql @@ -0,0 +1,146 @@ +-- ============================================================================ +-- Fix Timeline Event Updates and Deletes +-- Adds support for timeline_event and milestone entity types +-- ============================================================================ + +-- Update function to support timeline event updates +CREATE OR REPLACE FUNCTION update_entity_from_submission( + p_entity_type TEXT, + p_data JSONB, + p_entity_id UUID, + p_updated_by UUID +) +RETURNS UUID +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path = public +AS $$ +BEGIN + CASE p_entity_type + WHEN 'park' THEN + UPDATE parks SET + name = COALESCE(p_data->>'name', name), + slug = COALESCE(p_data->>'slug', slug), + description = COALESCE(p_data->>'description', description), + park_type = COALESCE(p_data->>'park_type', park_type), + status = COALESCE(p_data->>'status', status), + location_id = COALESCE((p_data->>'location_id')::UUID, location_id), + operator_id = COALESCE((p_data->>'operator_id')::UUID, operator_id), + property_owner_id = COALESCE((p_data->>'property_owner_id')::UUID, property_owner_id), + opening_date = COALESCE((p_data->>'opening_date')::DATE, opening_date), + closing_date = COALESCE((p_data->>'closing_date')::DATE, closing_date), + opening_date_precision = COALESCE(p_data->>'opening_date_precision', opening_date_precision), + closing_date_precision = COALESCE(p_data->>'closing_date_precision', closing_date_precision), + website_url = COALESCE(p_data->>'website_url', website_url), + phone = COALESCE(p_data->>'phone', phone), + email = COALESCE(p_data->>'email', email), + banner_image_url = COALESCE(p_data->>'banner_image_url', banner_image_url), + banner_image_id = COALESCE(p_data->>'banner_image_id', banner_image_id), + card_image_url = COALESCE(p_data->>'card_image_url', card_image_url), + card_image_id = COALESCE(p_data->>'card_image_id', card_image_id), + updated_at = NOW() + WHERE id = p_entity_id; + + WHEN 'ride' THEN + UPDATE rides SET + name = COALESCE(p_data->>'name', name), + slug = COALESCE(p_data->>'slug', slug), + park_id = COALESCE((p_data->>'park_id')::UUID, park_id), + ride_type = COALESCE(p_data->>'ride_type', ride_type), + status = COALESCE(p_data->>'status', status), + manufacturer_id = COALESCE((p_data->>'manufacturer_id')::UUID, manufacturer_id), + ride_model_id = COALESCE((p_data->>'ride_model_id')::UUID, ride_model_id), + opening_date = COALESCE((p_data->>'opening_date')::DATE, opening_date), + closing_date = COALESCE((p_data->>'closing_date')::DATE, closing_date), + opening_date_precision = COALESCE(p_data->>'opening_date_precision', opening_date_precision), + closing_date_precision = COALESCE(p_data->>'closing_date_precision', closing_date_precision), + description = COALESCE(p_data->>'description', description), + banner_image_url = COALESCE(p_data->>'banner_image_url', banner_image_url), + banner_image_id = COALESCE(p_data->>'banner_image_id', banner_image_id), + card_image_url = COALESCE(p_data->>'card_image_url', card_image_url), + card_image_id = COALESCE(p_data->>'card_image_id', card_image_id), + updated_at = NOW() + WHERE id = p_entity_id; + + WHEN 'manufacturer', 'operator', 'property_owner', 'designer' THEN + UPDATE companies SET + name = COALESCE(p_data->>'name', name), + slug = COALESCE(p_data->>'slug', slug), + description = COALESCE(p_data->>'description', description), + website_url = COALESCE(p_data->>'website_url', website_url), + founded_year = COALESCE((p_data->>'founded_year')::INTEGER, founded_year), + banner_image_url = COALESCE(p_data->>'banner_image_url', banner_image_url), + banner_image_id = COALESCE(p_data->>'banner_image_id', banner_image_id), + card_image_url = COALESCE(p_data->>'card_image_url', card_image_url), + card_image_id = COALESCE(p_data->>'card_image_id', card_image_id), + updated_at = NOW() + WHERE id = p_entity_id; + + WHEN 'ride_model' THEN + UPDATE ride_models SET + name = COALESCE(p_data->>'name', name), + slug = COALESCE(p_data->>'slug', slug), + manufacturer_id = COALESCE((p_data->>'manufacturer_id')::UUID, manufacturer_id), + ride_type = COALESCE(p_data->>'ride_type', ride_type), + description = COALESCE(p_data->>'description', description), + banner_image_url = COALESCE(p_data->>'banner_image_url', banner_image_url), + banner_image_id = COALESCE(p_data->>'banner_image_id', banner_image_id), + card_image_url = COALESCE(p_data->>'card_image_url', card_image_url), + card_image_id = COALESCE(p_data->>'card_image_id', card_image_id), + updated_at = NOW() + WHERE id = p_entity_id; + + WHEN 'timeline_event', 'milestone' THEN + UPDATE entity_timeline_events SET + event_type = COALESCE(p_data->>'event_type', event_type), + event_date = COALESCE((p_data->>'event_date')::DATE, event_date), + event_date_precision = COALESCE(p_data->>'event_date_precision', event_date_precision), + title = COALESCE(p_data->>'title', title), + description = COALESCE(p_data->>'description', description), + from_value = COALESCE(p_data->>'from_value', from_value), + to_value = COALESCE(p_data->>'to_value', to_value), + from_entity_id = COALESCE((p_data->>'from_entity_id')::UUID, from_entity_id), + to_entity_id = COALESCE((p_data->>'to_entity_id')::UUID, to_entity_id), + from_location_id = COALESCE((p_data->>'from_location_id')::UUID, from_location_id), + to_location_id = COALESCE((p_data->>'to_location_id')::UUID, to_location_id), + updated_at = NOW() + WHERE id = p_entity_id; + + ELSE + RAISE EXCEPTION 'Unsupported entity type for update: %', p_entity_type + USING ERRCODE = '22023'; + END CASE; + + RETURN p_entity_id; +END; +$$; + +-- Update function to support timeline event deletion +CREATE OR REPLACE FUNCTION delete_entity_from_submission( + p_entity_type TEXT, + p_entity_id UUID, + p_deleted_by UUID +) +RETURNS VOID +LANGUAGE plpgsql +SECURITY DEFINER +SET search_path = public +AS $$ +BEGIN + CASE p_entity_type + WHEN 'park' THEN + DELETE FROM parks WHERE id = p_entity_id; + WHEN 'ride' THEN + DELETE FROM rides WHERE id = p_entity_id; + WHEN 'manufacturer', 'operator', 'property_owner', 'designer' THEN + DELETE FROM companies WHERE id = p_entity_id; + WHEN 'ride_model' THEN + DELETE FROM ride_models WHERE id = p_entity_id; + WHEN 'timeline_event', 'milestone' THEN + DELETE FROM entity_timeline_events WHERE id = p_entity_id; + ELSE + RAISE EXCEPTION 'Unsupported entity type for deletion: %', p_entity_type + USING ERRCODE = '22023'; + END CASE; +END; +$$; \ No newline at end of file