Refactor: Update edge function for counts

This commit is contained in:
gpt-engineer-app[bot]
2025-10-02 16:40:37 +00:00
parent 3c7de96bcf
commit ae74fa5677
3 changed files with 117 additions and 0 deletions

View File

@@ -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

View File

@@ -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;
} }
} }

View File

@@ -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;