"""runtime features Revision ID: 20260327_0002 Revises: 20260327_0001 Create Date: 2026-03-27 00:30:00.000000 """ from collections.abc import Sequence import sqlalchemy as sa from alembic import op # revision identifiers, used by Alembic. revision: str = "20260327_0002" down_revision: str | None = "20260327_0001" branch_labels: Sequence[str] | None = None depends_on: Sequence[str] | None = None def upgrade() -> None: op.add_column("issues_cache", sa.Column("release", sa.String(length=255), nullable=True)) op.add_column( "notifications_sent", sa.Column("project_slug", sa.String(length=255), nullable=True) ) op.add_column( "notifications_sent", sa.Column("group_name", sa.String(length=50), nullable=True) ) op.add_column("notifications_sent", sa.Column("priority", sa.String(length=20), nullable=True)) op.add_column( "notifications_sent", sa.Column("delivery_status", sa.String(length=50), nullable=False, server_default="sent"), ) op.create_index( op.f("ix_notifications_sent_group_name"), "notifications_sent", ["group_name"], unique=False, ) op.create_table( "mute_rules", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("pattern", sa.Text(), nullable=False), sa.Column("description", sa.Text(), nullable=True), sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("true")), sa.Column( "created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), ) op.create_unique_constraint("uq_mute_rules_pattern", "mute_rules", ["pattern"]) op.create_table( "project_ownership_overrides", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("project_slug", sa.String(length=255), nullable=False), sa.Column("group_name", sa.String(length=50), nullable=False), 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, ), ) op.create_index( op.f("ix_project_ownership_overrides_project_slug"), "project_ownership_overrides", ["project_slug"], unique=True, ) op.create_table( "group_topic_overrides", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("group_name", sa.String(length=50), nullable=False), sa.Column("topic_id", sa.Integer(), nullable=False), 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, ), ) op.create_index( op.f("ix_group_topic_overrides_group_name"), "group_topic_overrides", ["group_name"], unique=True, ) op.create_table( "group_subscriber_overrides", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("group_name", sa.String(length=50), nullable=False), sa.Column("user_id", sa.BigInteger(), nullable=False), sa.Column( "created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), sa.UniqueConstraint("group_name", "user_id", name="uq_group_subscriber"), ) op.create_index( op.f("ix_group_subscriber_overrides_group_name"), "group_subscriber_overrides", ["group_name"], unique=False, ) op.create_index( op.f("ix_group_subscriber_overrides_user_id"), "group_subscriber_overrides", ["user_id"], unique=False, ) def downgrade() -> None: op.drop_index( op.f("ix_group_subscriber_overrides_user_id"), table_name="group_subscriber_overrides", ) op.drop_index( op.f("ix_group_subscriber_overrides_group_name"), table_name="group_subscriber_overrides", ) op.drop_table("group_subscriber_overrides") op.drop_index(op.f("ix_group_topic_overrides_group_name"), table_name="group_topic_overrides") op.drop_table("group_topic_overrides") op.drop_index( op.f("ix_project_ownership_overrides_project_slug"), table_name="project_ownership_overrides", ) op.drop_table("project_ownership_overrides") op.drop_constraint("uq_mute_rules_pattern", "mute_rules", type_="unique") op.drop_table("mute_rules") op.drop_index(op.f("ix_notifications_sent_group_name"), table_name="notifications_sent") op.drop_column("notifications_sent", "delivery_status") op.drop_column("notifications_sent", "priority") op.drop_column("notifications_sent", "group_name") op.drop_column("notifications_sent", "project_slug") op.drop_column("issues_cache", "release")