"""Add revoked_at to musehub_auth_keys musehub#223 -- revoke_key() previously hard-deleted the key row, so there was no way to distinguish "revoked" from "never registered" for GET /api/keys/{key_id}/status. Switches to soft-delete: revoked_at NULL means active. All existing rows are active (NULL default), no backfill needed. Revision ID: 0083 Revises: 0082 """ from __future__ import annotations from typing import Sequence, Union from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision: str = '0083' down_revision: Union[str, None] = '0082' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.add_column( 'musehub_auth_keys', sa.Column('revoked_at', sa.DateTime(timezone=True), nullable=True), ) def downgrade() -> None: op.drop_column('musehub_auth_keys', 'revoked_at')