diff --git a/src/integrations/supabase/types.ts b/src/integrations/supabase/types.ts index 0a73d32b..835dc856 100644 --- a/src/integrations/supabase/types.ts +++ b/src/integrations/supabase/types.ts @@ -2239,6 +2239,10 @@ export type Database = { Args: { target_park_id: string } Returns: undefined } + update_park_ride_counts: { + Args: { target_park_id: string } + Returns: undefined + } update_ride_ratings: { Args: { target_ride_id: string } Returns: undefined diff --git a/supabase/functions/process-selective-approval/index.ts b/supabase/functions/process-selective-approval/index.ts index 1e0d7a0f..3c809e4a 100644 --- a/supabase/functions/process-selective-approval/index.ts +++ b/supabase/functions/process-selective-approval/index.ts @@ -296,6 +296,19 @@ async function createRide(supabase: any, data: any): Promise { .eq('id', rideId); if (error) throw new Error(`Failed to update ride: ${error.message}`); + + // Update park ride counts after successful ride update + if (data.park_id) { + console.log(`Updating ride counts for park ${data.park_id}`); + const { error: countError } = await supabase.rpc('update_park_ride_counts', { + target_park_id: data.park_id + }); + + if (countError) { + console.error('Failed to update park counts:', countError); + } + } + return rideId; } else { console.log('Creating new ride'); @@ -307,6 +320,19 @@ async function createRide(supabase: any, data: any): Promise { .single(); if (error) throw new Error(`Failed to create ride: ${error.message}`); + + // Update park ride counts after successful ride creation + if (data.park_id) { + console.log(`Updating ride counts for park ${data.park_id}`); + const { error: countError } = await supabase.rpc('update_park_ride_counts', { + target_park_id: data.park_id + }); + + if (countError) { + console.error('Failed to update park counts:', countError); + } + } + return ride.id; } } diff --git a/supabase/migrations/20251002163959_f69b9728-a8da-476b-a2ed-aa809c67b3d4.sql b/supabase/migrations/20251002163959_f69b9728-a8da-476b-a2ed-aa809c67b3d4.sql new file mode 100644 index 00000000..51d889c0 --- /dev/null +++ b/supabase/migrations/20251002163959_f69b9728-a8da-476b-a2ed-aa809c67b3d4.sql @@ -0,0 +1,87 @@ +-- Function to update ride counts for a specific park +CREATE OR REPLACE FUNCTION public.update_park_ride_counts(target_park_id UUID) +RETURNS void AS $$ +DECLARE + total_rides INTEGER; + total_coasters INTEGER; +BEGIN + -- Count all operating rides + SELECT COUNT(*) INTO total_rides + FROM public.rides + WHERE park_id = target_park_id + AND status = 'operating'; + + -- Count all operating roller coasters + SELECT COUNT(*) INTO total_coasters + FROM public.rides + WHERE park_id = target_park_id + AND status = 'operating' + AND category = 'roller_coaster'; + + -- Update park counts + UPDATE public.parks + SET + ride_count = total_rides, + coaster_count = total_coasters, + updated_at = now() + WHERE id = target_park_id; + + RAISE NOTICE 'Updated park % - Rides: %, Coasters: %', target_park_id, total_rides, total_coasters; +END; +$$ LANGUAGE plpgsql SECURITY DEFINER SET search_path = public; + +-- Trigger function to update counts when rides change +CREATE OR REPLACE FUNCTION public.update_park_counts_for_ride() +RETURNS trigger AS $$ +BEGIN + IF TG_OP = 'DELETE' THEN + -- Update the old park when ride is deleted + IF OLD.park_id IS NOT NULL THEN + PERFORM public.update_park_ride_counts(OLD.park_id); + END IF; + RETURN OLD; + ELSIF TG_OP = 'UPDATE' THEN + -- If ride moved to different park, update both parks + IF OLD.park_id IS DISTINCT FROM NEW.park_id THEN + IF OLD.park_id IS NOT NULL THEN + PERFORM public.update_park_ride_counts(OLD.park_id); + END IF; + IF NEW.park_id IS NOT NULL THEN + PERFORM public.update_park_ride_counts(NEW.park_id); + END IF; + ELSE + -- Same park, but status or category might have changed + IF NEW.park_id IS NOT NULL THEN + PERFORM public.update_park_ride_counts(NEW.park_id); + END IF; + END IF; + RETURN NEW; + ELSE -- INSERT + IF NEW.park_id IS NOT NULL THEN + PERFORM public.update_park_ride_counts(NEW.park_id); + END IF; + RETURN NEW; + END IF; +END; +$$ LANGUAGE plpgsql SECURITY DEFINER SET search_path = public; + +-- Create trigger +DROP TRIGGER IF EXISTS rides_count_update_trigger ON public.rides; +CREATE TRIGGER rides_count_update_trigger + AFTER INSERT OR UPDATE OR DELETE ON public.rides + FOR EACH ROW + EXECUTE FUNCTION public.update_park_counts_for_ride(); + +-- Recalculate all existing park counts +DO $$ +DECLARE + park_record RECORD; +BEGIN + FOR park_record IN SELECT id FROM public.parks LOOP + PERFORM public.update_park_ride_counts(park_record.id); + END LOOP; +END $$; + +-- Grant permissions +GRANT EXECUTE ON FUNCTION public.update_park_ride_counts(UUID) TO authenticated; +GRANT EXECUTE ON FUNCTION public.update_park_counts_for_ride() TO authenticated; \ No newline at end of file