mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 10:11:13 -05:00
Refactor: Update edge function for counts
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -296,6 +296,19 @@ async function createRide(supabase: any, data: any): Promise<string> {
|
||||
.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<string> {
|
||||
.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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user