-- CreateTable CREATE TABLE "tasks" ( "id" TEXT NOT NULL, "tenant_id" TEXT NOT NULL, "type" TEXT NOT NULL, "title" TEXT NOT NULL, "status" TEXT NOT NULL DEFAULT 'OPEN', "entity_type" TEXT, "entity_id" TEXT, "entity_ref" TEXT, "assignee_id" TEXT, "created_by_id" TEXT, "due_date" TIMESTAMP(3), "resolved_by_id" TEXT, "resolved_at" TIMESTAMP(3), "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, CONSTRAINT "tasks_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "task_comments" ( "id" TEXT NOT NULL, "tenant_id" TEXT NOT NULL, "task_id" TEXT NOT NULL, "author_id" TEXT, "kind" TEXT NOT NULL DEFAULT 'comment', "body" TEXT NOT NULL, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "task_comments_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE INDEX "tasks_tenant_id_status_idx" ON "tasks"("tenant_id", "status"); -- CreateIndex CREATE INDEX "tasks_tenant_id_assignee_id_status_idx" ON "tasks"("tenant_id", "assignee_id", "status"); -- CreateIndex CREATE INDEX "task_comments_tenant_id_task_id_idx" ON "task_comments"("tenant_id", "task_id"); -- AddForeignKey ALTER TABLE "task_comments" ADD CONSTRAINT "task_comments_task_id_fkey" FOREIGN KEY ("task_id") REFERENCES "tasks"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- RLS für die neuen mandantenbezogenen Tabellen (zweite Verteidigungslinie). DO $$ DECLARE t text; BEGIN FOREACH t IN ARRAY ARRAY['tasks','task_comments'] LOOP EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY', t); EXECUTE format('CREATE POLICY tenant_isolation ON %I USING (tenant_id = current_setting(''app.tenant_id'', true))', t); END LOOP; END $$;