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 }
|
Args: { target_park_id: string }
|
||||||
Returns: undefined
|
Returns: undefined
|
||||||
}
|
}
|
||||||
|
update_park_ride_counts: {
|
||||||
|
Args: { target_park_id: string }
|
||||||
|
Returns: undefined
|
||||||
|
}
|
||||||
update_ride_ratings: {
|
update_ride_ratings: {
|
||||||
Args: { target_ride_id: string }
|
Args: { target_ride_id: string }
|
||||||
Returns: undefined
|
Returns: undefined
|
||||||
|
|||||||
@@ -296,6 +296,19 @@ async function createRide(supabase: any, data: any): Promise<string> {
|
|||||||
.eq('id', rideId);
|
.eq('id', rideId);
|
||||||
|
|
||||||
if (error) throw new Error(`Failed to update ride: ${error.message}`);
|
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;
|
return rideId;
|
||||||
} else {
|
} else {
|
||||||
console.log('Creating new ride');
|
console.log('Creating new ride');
|
||||||
@@ -307,6 +320,19 @@ async function createRide(supabase: any, data: any): Promise<string> {
|
|||||||
.single();
|
.single();
|
||||||
|
|
||||||
if (error) throw new Error(`Failed to create ride: ${error.message}`);
|
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;
|
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