"""add totp_used_codes table for TOTP replay prevention Revision ID: f6a7b8c9d0e1 Revises: e5f6a7b8c9d0 Create Date: 2026-05-17 00:00:00.000000 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import mysql # revision identifiers, used by Alembic. revision = 'f6a7b8c9d0e1' down_revision = 'e5f6a7b8c9d0' branch_labels = None depends_on = None def upgrade(): op.create_table( 'totp_used_codes', sa.Column('id', mysql.INTEGER(unsigned=True), autoincrement=True, nullable=False), sa.Column('user_id', mysql.INTEGER(unsigned=True), nullable=False), sa.Column('code', sa.String(length=6), nullable=False), sa.Column('expires_at', sa.DateTime(), nullable=False), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('user_id', 'code', name='uq_totp_used_user_code'), ) op.create_index('ix_totp_used_codes_user_id', 'totp_used_codes', ['user_id']) def downgrade(): op.drop_index('ix_totp_used_codes_user_id', table_name='totp_used_codes') op.drop_table('totp_used_codes')