"""Expand generic notifications and route desktop delivery through them. Revision ID: 20260716_05 Revises: 20260716_04 """ import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql revision = "20260716_05" down_revision = "20260716_04" branch_labels = None depends_on = None def upgrade() -> None: op.add_column( "notifications", sa.Column("requires_action", sa.Boolean(), nullable=False, server_default=sa.true()), ) op.add_column( "notifications", sa.Column("due_at", sa.DateTime(timezone=True), nullable=True), ) op.alter_column("desktop_notification_deliveries", "distribution_id", nullable=True) op.add_column( "desktop_notification_deliveries", sa.Column("notification_id", postgresql.UUID(as_uuid=True), nullable=True), ) op.create_foreign_key( "fk_desktop_notification_deliveries_notification", "desktop_notification_deliveries", "notifications", ["notification_id"], ["id"], ondelete="CASCADE", ) op.create_unique_constraint( "uq_desktop_notification_user_notification", "desktop_notification_deliveries", ["user_id", "notification_id"], ) def downgrade() -> None: op.drop_constraint( "uq_desktop_notification_user_notification", "desktop_notification_deliveries", type_="unique", ) op.drop_constraint( "fk_desktop_notification_deliveries_notification", "desktop_notification_deliveries", type_="foreignkey", ) op.drop_column("desktop_notification_deliveries", "notification_id") # Legacy rows always have a distribution id; rows created by the generic delivery path do not. op.execute("DELETE FROM desktop_notification_deliveries WHERE distribution_id IS NULL") op.alter_column("desktop_notification_deliveries", "distribution_id", nullable=False) op.drop_column("notifications", "due_at") op.drop_column("notifications", "requires_action")