chrysopedia/alembic/versions/026_add_share_token.py
jlightner 5f4b960dc1 feat: Added share_token column with migration 026, wired token generati…
- "backend/models.py"
- "alembic/versions/026_add_share_token.py"
- "backend/pipeline/stages.py"
- "backend/routers/shorts.py"
- "backend/routers/shorts_public.py"
- "backend/main.py"

GSD-Task: S01/T01
2026-04-04 10:33:00 +00:00

45 lines
1.3 KiB
Python

"""Add share_token column to generated_shorts for public sharing.
Revision ID: 026_add_share_token
Revises: 025_add_generated_shorts
"""
import secrets
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import UUID
from alembic import op
revision = "026_add_share_token"
down_revision = "025_add_generated_shorts"
branch_labels = None
depends_on = None
def upgrade() -> None:
# Add nullable column first
op.add_column(
"generated_shorts",
sa.Column("share_token", sa.String(16), nullable=True),
)
# Backfill existing complete shorts with unique tokens
conn = op.get_bind()
rows = conn.execute(
sa.text("SELECT id FROM generated_shorts WHERE status = 'complete' AND share_token IS NULL")
).fetchall()
for (row_id,) in rows:
token = secrets.token_urlsafe(8) # ~11 chars, fits in String(16)
conn.execute(
sa.text("UPDATE generated_shorts SET share_token = :token WHERE id = :id"),
{"token": token, "id": row_id},
)
# Create unique index
op.create_index("ix_generated_shorts_share_token", "generated_shorts", ["share_token"], unique=True)
def downgrade() -> None:
op.drop_index("ix_generated_shorts_share_token", table_name="generated_shorts")
op.drop_column("generated_shorts", "share_token")