"""add_role_audit_fields Revision ID: 4fa11836f7fd Revises: 013_sync_permissions Create Date: 2026-01-16 17:21:40.514605 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa from sqlalchemy.dialects.postgresql import UUID # revision identifiers, used by Alembic. revision: str = '4fa11836f7fd' down_revision: Union[str, None] = '013_sync_permissions' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # Add role audit trail columns op.add_column('users', sa.Column('role_changed_at', sa.DateTime(timezone=True), nullable=True)) op.add_column('users', sa.Column('role_changed_by', UUID(as_uuid=True), nullable=True)) # Create foreign key constraint to track who changed the role op.create_foreign_key( 'fk_users_role_changed_by', 'users', 'users', ['role_changed_by'], ['id'], ondelete='SET NULL' ) # Create index for efficient querying by role change date op.create_index('idx_users_role_changed_at', 'users', ['role_changed_at']) def downgrade() -> None: # Drop index first op.drop_index('idx_users_role_changed_at') # Drop foreign key constraint op.drop_constraint('fk_users_role_changed_by', 'users', type_='foreignkey') # Drop columns op.drop_column('users', 'role_changed_by') op.drop_column('users', 'role_changed_at')