"""simplify mqtt parse tracking Revision ID: b4c5d6e7f809 Revises: a1b2c3d4e5f6 Create Date: 2026-03-19 17:30:00.000000 """ from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision = "b4c5d6e7f809" down_revision = "a1b2c3d4e5f6" branch_labels = None depends_on = None def upgrade() -> None: op.add_column( "terminal_message_raw", sa.Column("parsed_at", sa.DateTime(timezone=True), nullable=True), ) op.create_index( op.f("ix_terminal_message_raw_parsed_at"), "terminal_message_raw", ["parsed_at"], unique=False, ) # Preserve historical parse outcomes before removing state-machine columns. op.execute( sa.text( """ UPDATE terminal_message_raw SET parsed_at = COALESCE(received_at, created_at) WHERE parse_status <> 'pending' """ ) ) op.drop_index( op.f("ix_terminal_message_raw_next_retry_at"), table_name="terminal_message_raw", ) op.drop_index( op.f("ix_terminal_message_raw_parse_status"), table_name="terminal_message_raw", ) op.drop_column("terminal_message_raw", "next_retry_at") op.drop_column("terminal_message_raw", "parse_attempts") op.drop_column("terminal_message_raw", "parse_status") def downgrade() -> None: op.add_column( "terminal_message_raw", sa.Column( "parse_status", sa.String(length=32), nullable=False, server_default="pending", ), ) op.add_column( "terminal_message_raw", sa.Column("parse_attempts", sa.Integer(), nullable=False, server_default="0"), ) op.add_column( "terminal_message_raw", sa.Column("next_retry_at", sa.DateTime(timezone=True), nullable=True), ) op.create_index( op.f("ix_terminal_message_raw_parse_status"), "terminal_message_raw", ["parse_status"], unique=False, ) op.create_index( op.f("ix_terminal_message_raw_next_retry_at"), "terminal_message_raw", ["next_retry_at"], unique=False, ) op.execute( sa.text( """ UPDATE terminal_message_raw SET parse_status = CASE WHEN parsed_at IS NULL THEN 'pending' WHEN parse_error IS NULL THEN 'succeeded' ELSE 'failed' END, parse_attempts = CASE WHEN parsed_at IS NULL THEN 0 ELSE 1 END """ ) ) op.drop_index( op.f("ix_terminal_message_raw_parsed_at"), table_name="terminal_message_raw", ) op.drop_column("terminal_message_raw", "parsed_at")