-- Create entity_timeline_events table for historical milestones CREATE TABLE public.entity_timeline_events ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), entity_id UUID NOT NULL, entity_type TEXT NOT NULL CHECK (entity_type IN ('park', 'ride', 'company')), event_type TEXT NOT NULL CHECK (event_type IN ( 'name_change', 'operator_change', 'owner_change', 'location_change', 'status_change', 'closure', 'reopening', 'renovation', 'expansion', 'acquisition', 'milestone', 'other' )), event_date DATE NOT NULL, event_date_precision TEXT DEFAULT 'day' CHECK (event_date_precision IN ('day', 'month', 'year')), title TEXT NOT NULL, description TEXT, -- Type-specific relational data (NO JSON!) from_value TEXT, to_value TEXT, from_entity_id UUID, to_entity_id UUID, from_location_id UUID REFERENCES public.locations(id), to_location_id UUID REFERENCES public.locations(id), -- Metadata is_public BOOLEAN NOT NULL DEFAULT true, display_order INTEGER DEFAULT 0, created_by UUID REFERENCES auth.users(id), approved_by UUID, submission_id UUID REFERENCES public.content_submissions(id), created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now() ); -- Create indexes for performance CREATE INDEX idx_timeline_events_entity ON public.entity_timeline_events(entity_type, entity_id); CREATE INDEX idx_timeline_events_date ON public.entity_timeline_events(event_date DESC); CREATE INDEX idx_timeline_events_submission ON public.entity_timeline_events(submission_id) WHERE submission_id IS NOT NULL; CREATE INDEX idx_timeline_events_created_by ON public.entity_timeline_events(created_by); -- Enable RLS ALTER TABLE public.entity_timeline_events ENABLE ROW LEVEL SECURITY; -- Public can view approved public events CREATE POLICY "Public can view public timeline events" ON public.entity_timeline_events FOR SELECT USING (is_public = true AND approved_by IS NOT NULL); -- Users can view their own pending submissions CREATE POLICY "Users can view their own timeline submissions" ON public.entity_timeline_events FOR SELECT USING (created_by = auth.uid() AND approved_by IS NULL); -- Service role can manage (for approval process) CREATE POLICY "Service role can manage timeline events" ON public.entity_timeline_events FOR ALL USING (auth.jwt() ->> 'role' = 'service_role');