61 lines
2.1 KiB
Python
61 lines
2.1 KiB
Python
"""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') |