"""add email verification codes table Revision ID: 20260427_add_email_codes Revises: 20260427_create_memberships Create Date: 2026-04-27 22:20:00 """ from __future__ import annotations from alembic import op import sqlalchemy as sa revision = "20260427_add_email_codes" down_revision = "20260427_create_memberships" branch_labels = None depends_on = None def upgrade() -> None: bind = op.get_bind() inspector = sa.inspect(bind) if "email_verification_codes" not in set(inspector.get_table_names()): op.create_table( "email_verification_codes", sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), sa.Column("email", sa.String(length=255), nullable=False), sa.Column("purpose", sa.String(length=50), nullable=False), sa.Column("code_hash", sa.String(length=64), nullable=False), sa.Column("expires_at", sa.DateTime(), nullable=False), sa.Column("consumed_at", sa.DateTime(), nullable=True), sa.Column("created_at", sa.DateTime(), server_default=sa.func.now(), nullable=False), sa.Column("updated_at", sa.DateTime(), server_default=sa.func.now(), nullable=False), sa.PrimaryKeyConstraint("id"), ) op.create_index( "ix_email_verification_codes_email", "email_verification_codes", ["email"], ) op.create_index( "ix_email_verification_codes_purpose", "email_verification_codes", ["purpose"], ) def downgrade() -> None: bind = op.get_bind() inspector = sa.inspect(bind) tables = set(inspector.get_table_names()) if "email_verification_codes" in tables: indexes = {index["name"] for index in inspector.get_indexes("email_verification_codes")} if "ix_email_verification_codes_purpose" in indexes: op.drop_index("ix_email_verification_codes_purpose", table_name="email_verification_codes") if "ix_email_verification_codes_email" in indexes: op.drop_index("ix_email_verification_codes_email", table_name="email_verification_codes") op.drop_table("email_verification_codes")