"""project collab prep: indexes, task version, comment user_id Revision ID: 057 Revises: 056 Create Date: 2025-01-01 00:00:00.000000 """ from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision = "057" down_revision = "056" branch_labels = None depends_on = None def upgrade() -> None: # 1a. Performance indexes for project_tasks # Use IF NOT EXISTS to handle indexes that may already exist on the DB op.execute("CREATE INDEX IF NOT EXISTS ix_project_tasks_project_id ON project_tasks (project_id)") op.execute("CREATE INDEX IF NOT EXISTS ix_project_tasks_parent_task_id ON project_tasks (parent_task_id) WHERE parent_task_id IS NOT NULL") op.execute("CREATE INDEX IF NOT EXISTS ix_project_tasks_project_updated ON project_tasks (project_id, updated_at DESC)") op.execute("CREATE INDEX IF NOT EXISTS ix_projects_user_updated ON projects (user_id, updated_at DESC)") # 1b. Add user_id to task_comments for multi-user attribution op.add_column( "task_comments", sa.Column("user_id", sa.Integer(), sa.ForeignKey("users.id", ondelete="SET NULL"), nullable=True), ) # 1c. Add version column to project_tasks for optimistic locking op.add_column( "project_tasks", sa.Column("version", sa.Integer(), server_default="1", nullable=False), ) # Calendar delta polling index (Phase 4 prep) op.execute("CREATE INDEX IF NOT EXISTS ix_events_calendar_updated ON calendar_events (calendar_id, updated_at DESC)") def downgrade() -> None: op.drop_index("ix_events_calendar_updated", table_name="calendar_events") op.drop_column("project_tasks", "version") op.drop_column("task_comments", "user_id") op.drop_index("ix_projects_user_updated", table_name="projects") op.drop_index("ix_project_tasks_project_updated", table_name="project_tasks") op.drop_index("ix_project_tasks_parent_task_id", table_name="project_tasks") op.drop_index("ix_project_tasks_project_id", table_name="project_tasks")