"""auth_sessions table, so sign-out and password changes revoke JWTs Revision ID: auth_sessions_001 Revises: agent_quick_replies_001 Create Date: 2026-10-12 Tokens issued before this revision carry no session id and stay valid until they expire, so the deploy signs nobody out. """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision: str = 'auth_sessions_001' down_revision: Union[str, None] = 'agent_quick_replies_001' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.create_table( 'auth_sessions', sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False), sa.Column('user_id', postgresql.UUID(as_uuid=True), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), sa.Column('revoked_at', sa.DateTime(timezone=True), nullable=True), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id'), ) op.create_index('ix_auth_sessions_user_id', 'auth_sessions', ['user_id']) def downgrade() -> None: op.drop_index('ix_auth_sessions_user_id', table_name='auth_sessions') op.drop_table('auth_sessions')