"""Add outbox delivery state, retry and lease tracking. Revision ID: 0007_outbox_delivery_state Revises: 0006_reevaluate_child_lineage Create Date: 2026-08-28 """ import sqlalchemy as sa from alembic import op revision: str = "0007_outbox_delivery_state" down_revision: str | None = "0006_reevaluate_child_lineage" branch_labels: str | None = None depends_on: str | None = None def upgrade() -> None: op.add_column( "outbox_events", sa.Column( "delivery_status", sa.String(length=32), nullable=False, server_default="pending", ), ) op.add_column( "outbox_events", sa.Column( "attempt_count", sa.Integer(), nullable=False, server_default="0", ), ) op.add_column( "outbox_events", sa.Column("next_attempt_at", sa.DateTime(timezone=True), nullable=True), ) op.add_column( "outbox_events", sa.Column("last_attempt_at", sa.DateTime(timezone=True), nullable=True), ) op.add_column( "outbox_events", sa.Column("delivered_at", sa.DateTime(timezone=True), nullable=True), ) op.add_column( "outbox_events", sa.Column("lease_expires_at", sa.DateTime(timezone=True), nullable=True), ) op.add_column( "outbox_events", sa.Column("claim_token", sa.String(length=36), nullable=True), ) op.add_column( "outbox_events", sa.Column("last_error_code", sa.String(length=64), nullable=True), ) op.add_column( "outbox_events", sa.Column("last_error_detail", sa.String(length=2000), nullable=True), ) op.add_column( "outbox_events", sa.Column("last_http_status", sa.Integer(), nullable=True), ) op.create_index( "ix_outbox_events_delivery_claim", "outbox_events", ["delivery_status", "next_attempt_at"], ) def downgrade() -> None: op.drop_index("ix_outbox_events_delivery_claim", table_name="outbox_events") op.drop_column("outbox_events", "last_http_status") op.drop_column("outbox_events", "last_error_detail") op.drop_column("outbox_events", "last_error_code") op.drop_column("outbox_events", "lease_expires_at") op.drop_column("outbox_events", "claim_token") op.drop_column("outbox_events", "delivered_at") op.drop_column("outbox_events", "last_attempt_at") op.drop_column("outbox_events", "next_attempt_at") op.drop_column("outbox_events", "attempt_count") op.drop_column("outbox_events", "delivery_status")