"""Create notifications table for in-app notification centre. Revision ID: 041 Revises: 040 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects.postgresql import JSONB revision = "041" down_revision = "040" branch_labels = None depends_on = None def upgrade() -> None: op.create_table( "notifications", sa.Column("id", sa.Integer, primary_key=True, index=True), sa.Column( "user_id", sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False, ), sa.Column("type", sa.String(50), nullable=False), sa.Column("title", sa.String(255), nullable=True), sa.Column("message", sa.Text, nullable=True), sa.Column("data", JSONB, nullable=True), sa.Column("source_type", sa.String(50), nullable=True), sa.Column("source_id", sa.Integer, nullable=True), sa.Column("is_read", sa.Boolean, nullable=False, server_default="false"), sa.Column( "created_at", sa.DateTime, nullable=False, server_default=sa.func.now(), ), ) # Fast unread count query op.execute( 'CREATE INDEX "ix_notifications_user_unread" ON notifications (user_id, is_read) ' "WHERE is_read = false" ) # Paginated listing op.create_index( "ix_notifications_user_created", "notifications", ["user_id", sa.text("created_at DESC")], ) def downgrade() -> None: op.drop_index("ix_notifications_user_created", table_name="notifications") op.execute('DROP INDEX IF EXISTS "ix_notifications_user_unread"') op.drop_table("notifications")