"""realtime core Revision ID: c3a8e5f1b6d2 Revises: b2f7c1a9d3e4 Create Date: 2026-05-29 18:30:00.000000 """ from collections.abc import Sequence import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql revision: str = "c3a8e5f1b6d2" down_revision: str | None = "b2f7c1a9d3e4" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: op.add_column("messages", sa.Column("sender_id", sa.BigInteger(), nullable=True)) op.add_column("messages", sa.Column("text", sa.String(), nullable=True)) op.add_column( "messages", sa.Column("has_media", sa.Boolean(), nullable=False, server_default=sa.false()), ) op.add_column( "messages", sa.Column( "is_self_destruct", sa.Boolean(), nullable=False, server_default=sa.false() ), ) op.add_column( "messages", sa.Column("edited_at", sa.DateTime(timezone=True), nullable=True) ) op.create_index("ix_messages_box", "messages", ["account_id", "message_id"]) op.create_table( "message_versions", sa.Column("account_id", sa.Integer(), nullable=False), sa.Column("chat_id", sa.BigInteger(), nullable=False), sa.Column("message_id", sa.BigInteger(), nullable=False), sa.Column("observed_at", sa.DateTime(timezone=True), nullable=False), sa.Column("edit_date", sa.DateTime(timezone=True), nullable=True), sa.Column("text", sa.String(), nullable=True), sa.Column("raw", postgresql.JSONB(astext_type=sa.Text()), nullable=False), sa.PrimaryKeyConstraint("account_id", "chat_id", "message_id", "observed_at"), ) op.create_table( "media", sa.Column("id", sa.Integer(), nullable=False), sa.Column("account_id", sa.Integer(), nullable=False), sa.Column("chat_id", sa.BigInteger(), nullable=False), sa.Column("message_id", sa.BigInteger(), nullable=False), sa.Column("kind", sa.String(), nullable=False), sa.Column("storage_key", sa.String(), nullable=True), sa.Column("file_size", sa.BigInteger(), nullable=True), sa.Column("mime", sa.String(), nullable=True), sa.Column("ttl_seconds", sa.Integer(), nullable=True), sa.Column( "downloaded", sa.Boolean(), nullable=False, server_default=sa.false() ), sa.Column("extracted_text", sa.String(), nullable=True), sa.Column( "created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), sa.PrimaryKeyConstraint("id"), sa.UniqueConstraint("account_id", "chat_id", "message_id"), ) op.create_table( "callbacks", sa.Column("id", sa.Integer(), nullable=False), sa.Column("account_id", sa.Integer(), nullable=False), sa.Column("chat_id", sa.BigInteger(), nullable=False), sa.Column("message_id", sa.BigInteger(), nullable=False), sa.Column("position", sa.Integer(), nullable=False), sa.Column("label", sa.String(), nullable=True), sa.Column("data", sa.LargeBinary(), nullable=True), sa.Column( "created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), sa.PrimaryKeyConstraint("id"), ) op.create_index( "ix_callbacks_message", "callbacks", ["account_id", "chat_id", "message_id"] ) op.create_table( "reactions", sa.Column("id", sa.Integer(), nullable=False), sa.Column("account_id", sa.Integer(), nullable=False), sa.Column("chat_id", sa.BigInteger(), nullable=False), sa.Column("message_id", sa.BigInteger(), nullable=False), sa.Column("peer_id", sa.BigInteger(), nullable=False), sa.Column("reaction", sa.String(), nullable=False), sa.Column( "added_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), sa.Column("removed_at", sa.DateTime(timezone=True), nullable=True), sa.Column( "created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), sa.PrimaryKeyConstraint("id"), ) op.create_index( "ix_reactions_message", "reactions", ["account_id", "chat_id", "message_id"] ) op.execute( "CREATE INDEX ix_reactions_open ON reactions " "(account_id, chat_id, message_id) WHERE removed_at IS NULL" ) def downgrade() -> None: op.drop_table("reactions") op.drop_table("callbacks") op.drop_table("media") op.drop_table("message_versions") op.drop_index("ix_messages_box", table_name="messages") op.drop_column("messages", "edited_at") op.drop_column("messages", "is_self_destruct") op.drop_column("messages", "has_media") op.drop_column("messages", "text") op.drop_column("messages", "sender_id")