Files
acmcc/supabase/migrations/20260429015712_a4604abc-f56e-4363-a6cc-0b22ea31adff.sql
T
2026-06-01 20:19:26 -04:00

64 lines
2.1 KiB
PL/PgSQL

-- Public-safe RPCs for amenity calendar visibility and booking lookup
-- 1) Return confirmed/blocked bookings for an amenity, exposing only safe fields
CREATE OR REPLACE FUNCTION public.get_public_amenity_booked_dates(p_amenity_id uuid)
RETURNS TABLE(booking_date date, start_time text, end_time text, status text)
LANGUAGE sql
STABLE SECURITY DEFINER
SET search_path = public
AS $$
SELECT ab.booking_date, ab.start_time, ab.end_time, ab.status
FROM public.amenity_bookings ab
JOIN public.amenities a ON a.id = ab.amenity_id
JOIN public.association_public_pages app ON app.association_id = a.association_id
WHERE ab.amenity_id = p_amenity_id
AND a.is_active = true
AND app.is_published = true
AND ab.status IN ('confirmed', 'approved', 'blocked')
AND ab.booking_date >= (CURRENT_DATE - INTERVAL '7 days')
$$;
GRANT EXECUTE ON FUNCTION public.get_public_amenity_booked_dates(uuid) TO anon, authenticated;
-- 2) Look up a single booking for the public confirmation page
CREATE OR REPLACE FUNCTION public.get_public_booking_confirmation(p_booking_id uuid)
RETURNS TABLE(
id uuid,
guest_name text,
guest_email text,
booking_date date,
start_time text,
end_time text,
status text,
title text,
amenity_name text,
association_name text,
association_slug text
)
LANGUAGE sql
STABLE SECURITY DEFINER
SET search_path = public
AS $$
SELECT
ab.id,
ab.guest_name,
ab.guest_email,
ab.booking_date,
ab.start_time,
ab.end_time,
ab.status,
ab.title,
a.name AS amenity_name,
assoc.name AS association_name,
app.slug AS association_slug
FROM public.amenity_bookings ab
JOIN public.amenities a ON a.id = ab.amenity_id
JOIN public.associations assoc ON assoc.id = ab.association_id
LEFT JOIN public.association_public_pages app ON app.association_id = ab.association_id
WHERE ab.id = p_booking_id
$$;
GRANT EXECUTE ON FUNCTION public.get_public_booking_confirmation(uuid) TO anon, authenticated;
-- 3) Allow status='blocked' as a valid booking_type-independent status used by admin manual blocks
-- (no constraint exists on status, so nothing to change)