68 lines
2.5 KiB
Python
68 lines
2.5 KiB
Python
"""Make ghost_id nullable, add defaults, create post_users M2M table.
|
|
|
|
Revision ID: 0004
|
|
Revises: 0003_add_page_configs
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
revision = "blog_0004"
|
|
down_revision = "blog_0003"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade():
|
|
# Make ghost_id nullable
|
|
op.alter_column("posts", "ghost_id", existing_type=sa.String(64), nullable=True)
|
|
op.alter_column("authors", "ghost_id", existing_type=sa.String(64), nullable=True)
|
|
op.alter_column("tags", "ghost_id", existing_type=sa.String(64), nullable=True)
|
|
|
|
# Add server defaults for Post
|
|
op.alter_column(
|
|
"posts", "uuid",
|
|
existing_type=sa.String(64),
|
|
server_default=sa.text("gen_random_uuid()"),
|
|
)
|
|
op.alter_column(
|
|
"posts", "updated_at",
|
|
existing_type=sa.DateTime(timezone=True),
|
|
server_default=sa.text("now()"),
|
|
)
|
|
op.alter_column(
|
|
"posts", "created_at",
|
|
existing_type=sa.DateTime(timezone=True),
|
|
server_default=sa.text("now()"),
|
|
)
|
|
|
|
# Create post_users M2M table (replaces post_authors for new posts)
|
|
op.create_table(
|
|
"post_users",
|
|
sa.Column("post_id", sa.Integer, sa.ForeignKey("posts.id", ondelete="CASCADE"), primary_key=True),
|
|
sa.Column("user_id", sa.Integer, primary_key=True),
|
|
sa.Column("sort_order", sa.Integer, nullable=False, server_default="0"),
|
|
)
|
|
op.create_index("ix_post_users_user_id", "post_users", ["user_id"])
|
|
|
|
# Backfill post_users from post_authors for posts that already have user_id.
|
|
# This maps each post's authors to the post's user_id (primary author).
|
|
# Multi-author mapping requires the full sync script.
|
|
op.execute("""
|
|
INSERT INTO post_users (post_id, user_id, sort_order)
|
|
SELECT p.id, p.user_id, 0
|
|
FROM posts p
|
|
WHERE p.user_id IS NOT NULL
|
|
AND p.deleted_at IS NULL
|
|
ON CONFLICT DO NOTHING
|
|
""")
|
|
|
|
|
|
def downgrade():
|
|
op.drop_table("post_users")
|
|
op.alter_column("posts", "created_at", existing_type=sa.DateTime(timezone=True), server_default=None)
|
|
op.alter_column("posts", "updated_at", existing_type=sa.DateTime(timezone=True), server_default=None)
|
|
op.alter_column("posts", "uuid", existing_type=sa.String(64), server_default=None)
|
|
op.alter_column("tags", "ghost_id", existing_type=sa.String(64), nullable=False)
|
|
op.alter_column("authors", "ghost_id", existing_type=sa.String(64), nullable=False)
|
|
op.alter_column("posts", "ghost_id", existing_type=sa.String(64), nullable=False)
|