language-learning-app/api/alembic/versions/20260408_0009_add_flashcard_tables.py

88 lines
3.1 KiB
Python

"""add flashcard tables
Revision ID: 0009
Revises: 0008
Create Date: 2026-04-08
"""
from typing import Sequence, Union
import sqlalchemy as sa
from alembic import op
from sqlalchemy.dialects import postgresql
revision: str = "0009"
down_revision: Union[str, None] = "0008"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.create_table(
"flashcard",
sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True),
sa.Column(
"user_id",
postgresql.UUID(as_uuid=True),
sa.ForeignKey("users.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column(
"bank_entry_id",
postgresql.UUID(as_uuid=True),
sa.ForeignKey("learnable_word_bank_entry.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column("source_lang", sa.Text(), nullable=False),
sa.Column("target_lang", sa.Text(), nullable=False),
sa.Column("prompt_text", sa.Text(), nullable=False),
sa.Column("answer_text", sa.Text(), nullable=False),
sa.Column("prompt_context_text", sa.Text(), nullable=True),
sa.Column("answer_context_text", sa.Text(), nullable=True),
sa.Column("card_direction", sa.Text(), nullable=False),
sa.Column("prompt_modality", sa.Text(), nullable=False, server_default="text"),
sa.Column(
"created_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
)
op.create_index("ix_flashcard_user_id", "flashcard", ["user_id"])
op.create_index("ix_flashcard_bank_entry_id", "flashcard", ["bank_entry_id"])
op.create_table(
"flashcard_event",
sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True),
sa.Column(
"flashcard_id",
postgresql.UUID(as_uuid=True),
sa.ForeignKey("flashcard.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column(
"user_id",
postgresql.UUID(as_uuid=True),
sa.ForeignKey("users.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column("event_type", sa.Text(), nullable=False),
sa.Column("user_response", sa.Text(), nullable=True),
sa.Column(
"created_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
)
op.create_index("ix_flashcard_event_flashcard_id", "flashcard_event", ["flashcard_id"])
op.create_index("ix_flashcard_event_user_id", "flashcard_event", ["user_id"])
def downgrade() -> None:
op.drop_index("ix_flashcard_event_user_id", table_name="flashcard_event")
op.drop_index("ix_flashcard_event_flashcard_id", table_name="flashcard_event")
op.drop_table("flashcard_event")
op.drop_index("ix_flashcard_bank_entry_id", table_name="flashcard")
op.drop_index("ix_flashcard_user_id", table_name="flashcard")
op.drop_table("flashcard")