| |
|
|
| CREATE TABLE IF NOT EXISTS public.task_dependencies ( |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| project_id UUID NOT NULL REFERENCES public.projects ON DELETE CASCADE, |
| task_id UUID NOT NULL REFERENCES public.tasks ON DELETE CASCADE, |
| depends_on_task_id UUID NOT NULL REFERENCES public.tasks ON DELETE CASCADE, |
| created_at TIMESTAMPTZ DEFAULT NOW(), |
| CONSTRAINT task_dependencies_unique UNIQUE (project_id, task_id, depends_on_task_id), |
| CONSTRAINT task_dependencies_not_self CHECK (task_id <> depends_on_task_id) |
| ); |
|
|
| CREATE INDEX IF NOT EXISTS idx_task_dependencies_project_id ON public.task_dependencies(project_id); |
| CREATE INDEX IF NOT EXISTS idx_task_dependencies_task_id ON public.task_dependencies(task_id); |
| CREATE INDEX IF NOT EXISTS idx_task_dependencies_depends_on_task_id ON public.task_dependencies(depends_on_task_id); |
|
|
| ALTER TABLE public.task_dependencies ENABLE ROW LEVEL SECURITY; |
|
|
| DO $$ |
| BEGIN |
| IF NOT EXISTS ( |
| SELECT 1 |
| FROM pg_policies |
| WHERE schemaname = 'public' |
| AND tablename = 'task_dependencies' |
| AND policyname = 'Task dependencies visibility' |
| ) THEN |
| CREATE POLICY "Task dependencies visibility" ON public.task_dependencies |
| FOR SELECT |
| USING ( |
| EXISTS ( |
| SELECT 1 |
| FROM public.projects |
| WHERE projects.id = task_dependencies.project_id |
| AND (projects.owner_id = auth.uid() OR projects.is_public = true) |
| ) |
| ); |
| END IF; |
|
|
| IF NOT EXISTS ( |
| SELECT 1 |
| FROM pg_policies |
| WHERE schemaname = 'public' |
| AND tablename = 'task_dependencies' |
| AND policyname = 'Project owners can create task dependencies' |
| ) THEN |
| CREATE POLICY "Project owners can create task dependencies" ON public.task_dependencies |
| FOR INSERT TO authenticated |
| WITH CHECK ( |
| EXISTS ( |
| SELECT 1 |
| FROM public.projects |
| WHERE projects.id = task_dependencies.project_id |
| AND projects.owner_id = auth.uid() |
| ) |
| ); |
| END IF; |
|
|
| IF NOT EXISTS ( |
| SELECT 1 |
| FROM pg_policies |
| WHERE schemaname = 'public' |
| AND tablename = 'task_dependencies' |
| AND policyname = 'Project owners can update task dependencies' |
| ) THEN |
| CREATE POLICY "Project owners can update task dependencies" ON public.task_dependencies |
| FOR UPDATE TO authenticated |
| USING ( |
| EXISTS ( |
| SELECT 1 |
| FROM public.projects |
| WHERE projects.id = task_dependencies.project_id |
| AND projects.owner_id = auth.uid() |
| ) |
| ) |
| WITH CHECK ( |
| EXISTS ( |
| SELECT 1 |
| FROM public.projects |
| WHERE projects.id = task_dependencies.project_id |
| AND projects.owner_id = auth.uid() |
| ) |
| ); |
| END IF; |
|
|
| IF NOT EXISTS ( |
| SELECT 1 |
| FROM pg_policies |
| WHERE schemaname = 'public' |
| AND tablename = 'task_dependencies' |
| AND policyname = 'Project owners can delete task dependencies' |
| ) THEN |
| CREATE POLICY "Project owners can delete task dependencies" ON public.task_dependencies |
| FOR DELETE TO authenticated |
| USING ( |
| EXISTS ( |
| SELECT 1 |
| FROM public.projects |
| WHERE projects.id = task_dependencies.project_id |
| AND projects.owner_id = auth.uid() |
| ) |
| ); |
| END IF; |
| END $$; |
|
|