"""Add history management fields to summaries Revision ID: add_history_fields_001 Revises: Create Date: 2025-08-26 21:50:00.000000 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import sqlite # revision identifiers, used by Alembic. revision = 'add_history_fields_001' down_revision = None branch_labels = None depends_on = None def upgrade() -> None: # Add new columns to summaries table with op.batch_alter_table('summaries', schema=None) as batch_op: batch_op.add_column(sa.Column('is_starred', sa.Boolean(), nullable=True)) batch_op.add_column(sa.Column('notes', sa.Text(), nullable=True)) batch_op.add_column(sa.Column('tags', sa.JSON(), nullable=True)) batch_op.add_column(sa.Column('shared_token', sa.String(64), nullable=True)) batch_op.add_column(sa.Column('is_public', sa.Boolean(), nullable=True)) batch_op.add_column(sa.Column('view_count', sa.Integer(), nullable=True)) # Add indexes batch_op.create_index('idx_is_starred', ['is_starred']) batch_op.create_index('idx_shared_token', ['shared_token'], unique=True) # Create composite indexes op.create_index('idx_user_starred', 'summaries', ['user_id', 'is_starred']) op.create_index('idx_user_created', 'summaries', ['user_id', 'created_at']) # Set default values for existing rows op.execute(""" UPDATE summaries SET is_starred = 0, is_public = 0, view_count = 0 WHERE is_starred IS NULL """) def downgrade() -> None: # Remove composite indexes first op.drop_index('idx_user_created', table_name='summaries') op.drop_index('idx_user_starred', table_name='summaries') # Remove columns and indexes with op.batch_alter_table('summaries', schema=None) as batch_op: batch_op.drop_index('idx_shared_token') batch_op.drop_index('idx_is_starred') batch_op.drop_column('view_count') batch_op.drop_column('is_public') batch_op.drop_column('shared_token') batch_op.drop_column('tags') batch_op.drop_column('notes') batch_op.drop_column('is_starred')