"""add global analysis webhook settings and delivery queue Revision ID: 20260807_0015 Revises: 20260807_0014 """ from __future__ import annotations from collections.abc import Sequence from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql revision: str = "20260807_0015" down_revision: str | Sequence[str] | None = "20260807_0014" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: op.create_table( "site_settings", sa.Column("key", sa.String(length=64), nullable=False), sa.Column( "value", postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False, ), sa.Column( "secrets", postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False, ), sa.Column( "updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), sa.PrimaryKeyConstraint("key"), ) op.create_table( "webhook_deliveries", sa.Column("id", sa.String(length=40), nullable=False), sa.Column("event_id", sa.String(length=40), nullable=False), sa.Column("event_type", sa.String(length=128), nullable=False), sa.Column("conversation_id", sa.String(length=40), nullable=True), sa.Column("payload", postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.Column("url", sa.String(length=2048), nullable=False), sa.Column( "secrets", postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False, ), sa.Column("status", sa.String(length=16), server_default="pending", nullable=False), sa.Column("attempt_count", sa.Integer(), server_default="0", nullable=False), sa.Column("next_attempt_at", sa.DateTime(timezone=True), nullable=True), sa.Column("last_status_code", sa.Integer(), nullable=True), sa.Column("last_error", sa.String(length=2048), server_default="", nullable=False), sa.Column("delivered_at", sa.DateTime(timezone=True), nullable=True), sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False), sa.ForeignKeyConstraint( ["conversation_id"], ["conversation_sessions.id"], ondelete="SET NULL" ), sa.PrimaryKeyConstraint("id"), sa.UniqueConstraint("event_id"), ) op.create_index("ix_webhook_deliveries_event_type", "webhook_deliveries", ["event_type"]) op.create_index("ix_webhook_deliveries_conversation_id", "webhook_deliveries", ["conversation_id"]) op.create_index("ix_webhook_deliveries_status", "webhook_deliveries", ["status"]) op.create_index("ix_webhook_deliveries_next_attempt_at", "webhook_deliveries", ["next_attempt_at"]) def downgrade() -> None: op.drop_index("ix_webhook_deliveries_next_attempt_at", table_name="webhook_deliveries") op.drop_index("ix_webhook_deliveries_status", table_name="webhook_deliveries") op.drop_index("ix_webhook_deliveries_conversation_id", table_name="webhook_deliveries") op.drop_index("ix_webhook_deliveries_event_type", table_name="webhook_deliveries") op.drop_table("webhook_deliveries") op.drop_table("site_settings")