Files
root-org/supabase/migrations/028_schedule_and_contacts.sql
2026-02-07 21:47:47 +02:00

215 lines
7.3 KiB
SQL

-- Schedule/Timeline + Contacts/Vendor Directory for department dashboards
-- These are self-contained modules that can be added to any department dashboard
-- ============================================================
-- 1. Schedule Stages (rooms/areas where things happen)
-- ============================================================
CREATE TABLE schedule_stages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
department_id UUID NOT NULL REFERENCES event_departments(id) ON DELETE CASCADE,
name TEXT NOT NULL,
color TEXT DEFAULT '#6366f1',
sort_order INT NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- ============================================================
-- 2. Schedule Blocks (time blocks in the program)
-- ============================================================
CREATE TABLE schedule_blocks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
department_id UUID NOT NULL REFERENCES event_departments(id) ON DELETE CASCADE,
stage_id UUID REFERENCES schedule_stages(id) ON DELETE SET NULL,
title TEXT NOT NULL,
description TEXT,
start_time TIMESTAMPTZ NOT NULL,
end_time TIMESTAMPTZ NOT NULL,
color TEXT DEFAULT '#6366f1',
speaker TEXT,
sort_order INT NOT NULL DEFAULT 0,
created_by UUID REFERENCES auth.users(id) ON DELETE SET NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- ============================================================
-- 3. Contacts / Vendor Directory
-- ============================================================
CREATE TABLE department_contacts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
department_id UUID NOT NULL REFERENCES event_departments(id) ON DELETE CASCADE,
name TEXT NOT NULL,
role TEXT,
company TEXT,
email TEXT,
phone TEXT,
website TEXT,
notes TEXT,
category TEXT DEFAULT 'general',
color TEXT DEFAULT '#00A3E0',
created_by UUID REFERENCES auth.users(id) ON DELETE SET NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- ============================================================
-- 4. Indexes
-- ============================================================
CREATE INDEX idx_schedule_stages_dept ON schedule_stages(department_id);
CREATE INDEX idx_schedule_blocks_dept ON schedule_blocks(department_id);
CREATE INDEX idx_schedule_blocks_stage ON schedule_blocks(stage_id);
CREATE INDEX idx_schedule_blocks_time ON schedule_blocks(start_time, end_time);
CREATE INDEX idx_department_contacts_dept ON department_contacts(department_id);
CREATE INDEX idx_department_contacts_category ON department_contacts(category);
-- ============================================================
-- 5. RLS Policies
-- ============================================================
ALTER TABLE schedule_stages ENABLE ROW LEVEL SECURITY;
ALTER TABLE schedule_blocks ENABLE ROW LEVEL SECURITY;
ALTER TABLE department_contacts ENABLE ROW LEVEL SECURITY;
-- Schedule stages: org members can read, editors can write
CREATE POLICY "schedule_stages_select" ON schedule_stages FOR SELECT
USING (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = schedule_stages.department_id
AND om.user_id = auth.uid()
)
);
CREATE POLICY "schedule_stages_insert" ON schedule_stages FOR INSERT
WITH CHECK (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = schedule_stages.department_id
AND om.user_id = auth.uid()
AND om.role IN ('owner', 'admin', 'editor')
)
);
CREATE POLICY "schedule_stages_update" ON schedule_stages FOR UPDATE
USING (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = schedule_stages.department_id
AND om.user_id = auth.uid()
AND om.role IN ('owner', 'admin', 'editor')
)
);
CREATE POLICY "schedule_stages_delete" ON schedule_stages FOR DELETE
USING (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = schedule_stages.department_id
AND om.user_id = auth.uid()
AND om.role IN ('owner', 'admin', 'editor')
)
);
-- Schedule blocks: same pattern
CREATE POLICY "schedule_blocks_select" ON schedule_blocks FOR SELECT
USING (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = schedule_blocks.department_id
AND om.user_id = auth.uid()
)
);
CREATE POLICY "schedule_blocks_insert" ON schedule_blocks FOR INSERT
WITH CHECK (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = schedule_blocks.department_id
AND om.user_id = auth.uid()
AND om.role IN ('owner', 'admin', 'editor')
)
);
CREATE POLICY "schedule_blocks_update" ON schedule_blocks FOR UPDATE
USING (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = schedule_blocks.department_id
AND om.user_id = auth.uid()
AND om.role IN ('owner', 'admin', 'editor')
)
);
CREATE POLICY "schedule_blocks_delete" ON schedule_blocks FOR DELETE
USING (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = schedule_blocks.department_id
AND om.user_id = auth.uid()
AND om.role IN ('owner', 'admin', 'editor')
)
);
-- Contacts: same pattern
CREATE POLICY "department_contacts_select" ON department_contacts FOR SELECT
USING (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = department_contacts.department_id
AND om.user_id = auth.uid()
)
);
CREATE POLICY "department_contacts_insert" ON department_contacts FOR INSERT
WITH CHECK (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = department_contacts.department_id
AND om.user_id = auth.uid()
AND om.role IN ('owner', 'admin', 'editor')
)
);
CREATE POLICY "department_contacts_update" ON department_contacts FOR UPDATE
USING (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = department_contacts.department_id
AND om.user_id = auth.uid()
AND om.role IN ('owner', 'admin', 'editor')
)
);
CREATE POLICY "department_contacts_delete" ON department_contacts FOR DELETE
USING (
EXISTS (
SELECT 1 FROM event_departments ed
JOIN events e ON e.id = ed.event_id
JOIN org_members om ON om.org_id = e.org_id
WHERE ed.id = department_contacts.department_id
AND om.user_id = auth.uid()
AND om.role IN ('owner', 'admin', 'editor')
)
);