language-learning-app/api/alembic/versions/20260531_0020_add_article_tables.py

78 lines
2.5 KiB
Python
Raw Normal View History

"""add article tables
Revision ID: 0020
Revises: 0019
Create Date: 2026-05-31
"""
from typing import Sequence, Union
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
from alembic import op
revision: str = "0020"
down_revision: Union[str, None] = "0019"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.create_table(
"article",
sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True),
sa.Column("article_type", sa.Text(), nullable=False),
sa.Column("language", sa.Text(), nullable=False),
sa.Column("target_complexity", sa.Text(), nullable=False),
sa.Column("title", sa.Text(), nullable=False),
sa.Column("text", sa.Text(), nullable=False),
sa.Column("text_linguistic_data", postgresql.JSONB(), nullable=True),
sa.Column("audio_key", sa.Text(), nullable=True),
sa.Column(
"created_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
sa.Column("published_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
)
op.create_table(
"article_ownership",
sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True),
sa.Column(
"article_id",
postgresql.UUID(as_uuid=True),
sa.ForeignKey("article.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column("ownership_role", sa.Text(), nullable=False),
sa.Column(
"user_id",
postgresql.UUID(as_uuid=True),
sa.ForeignKey("users.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column(
"created_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.func.now(),
),
sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
)
op.create_index(
"ix_article_ownership_article_id", "article_ownership", ["article_id"]
)
op.create_index("ix_article_ownership_user_id", "article_ownership", ["user_id"])
def downgrade() -> None:
op.drop_index("ix_article_ownership_user_id", table_name="article_ownership")
op.drop_index("ix_article_ownership_article_id", table_name="article_ownership")
op.drop_table("article_ownership")
op.drop_table("article")