"""Phase 7: replace musehub_snapshots.manifest blob with normalized musehub_snapshot_entries table. Revision ID: 0013 Revises: 0012 """ from alembic import op import sqlalchemy as sa revision = "0013" down_revision = "0012" branch_labels = None depends_on = None def upgrade() -> None: # ── musehub_snapshot_entries ────────────────────────────────────────────── op.create_table( "musehub_snapshot_entries", sa.Column("snapshot_id", sa.String(128), primary_key=True), sa.Column("path", sa.String(1024), primary_key=True), sa.Column("object_id", sa.String(128), nullable=False), sa.Column("size_bytes", sa.Integer(), nullable=False, server_default="0"), sa.ForeignKeyConstraint( ["snapshot_id"], ["musehub_snapshots.snapshot_id"], ondelete="CASCADE", ), ) op.create_index( "ix_musehub_snapshot_entries_snapshot_id", "musehub_snapshot_entries", ["snapshot_id"], ) op.create_index( "ix_musehub_snapshot_entries_object_id", "musehub_snapshot_entries", ["object_id"], ) # ── drop the manifest JSON blob ─────────────────────────────────────────── # All existing manifests are {} (empty) — the wire_push bug meant they were # never populated — so there is no data to migrate. op.drop_column("musehub_snapshots", "manifest") def downgrade() -> None: op.add_column( "musehub_snapshots", sa.Column("manifest", sa.JSON(), nullable=False, server_default="{}"), ) op.drop_index( "ix_musehub_snapshot_entries_object_id", table_name="musehub_snapshot_entries", ) op.drop_index( "ix_musehub_snapshot_entries_snapshot_id", table_name="musehub_snapshot_entries", ) op.drop_table("musehub_snapshot_entries")