"""Convert notification title/body from text to jsonb (i18n dict). title and body become jsonb objects keyed by locale code: {"zh": "欢迎来到觅爻", "zh_Hant": "...", "en": "..."} Existing data is wrapped under the "zh" key (simplified Chinese default). Revision ID: 20260428_0001 """ from alembic import op import sqlalchemy as sa revision = "20260428_0001" down_revision = "20260427_0002" branch_labels = None depends_on = None def upgrade() -> None: op.execute( """ ALTER TABLE notifications ALTER COLUMN title TYPE jsonb USING jsonb_build_object('zh', title), ALTER COLUMN body TYPE jsonb USING jsonb_build_object('zh', body); """ ) op.execute( """ ALTER TABLE notifications DROP CONSTRAINT IF EXISTS ck_notifications_payload_object; """ ) op.execute( """ ALTER TABLE notifications ADD CONSTRAINT ck_notifications_payload_object CHECK (jsonb_typeof(payload) = 'object'); """ ) def downgrade() -> None: op.execute( """ ALTER TABLE notifications ALTER COLUMN title TYPE text USING COALESCE(title ->> 'zh', ''), ALTER COLUMN body TYPE text USING COALESCE(body ->> 'zh', ''); """ )