chrysopedia/alembic/versions/019_add_highlight_candidates.py

44 lines
1.7 KiB
Python

"""Add highlight_candidates table for highlight detection scoring.
Revision ID: 019_add_highlight_candidates
Revises: 018_add_impersonation_log
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import UUID
revision = "019_add_highlight_candidates"
down_revision = "018_add_impersonation_log"
branch_labels = None
depends_on = None
def upgrade() -> None:
# Pure SQL to avoid all SQLAlchemy enum creation hooks
op.execute("CREATE TYPE highlight_status AS ENUM ('candidate', 'approved', 'rejected')")
op.execute("""
CREATE TABLE highlight_candidates (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
key_moment_id UUID NOT NULL UNIQUE REFERENCES key_moments(id) ON DELETE CASCADE,
source_video_id UUID NOT NULL REFERENCES source_videos(id) ON DELETE CASCADE,
score FLOAT NOT NULL,
score_breakdown JSONB,
duration_secs FLOAT NOT NULL,
status highlight_status NOT NULL DEFAULT 'candidate',
created_at TIMESTAMP NOT NULL DEFAULT now(),
updated_at TIMESTAMP NOT NULL DEFAULT now()
)
""")
op.execute("CREATE INDEX ix_highlight_candidates_source_video_id ON highlight_candidates (source_video_id)")
op.execute("CREATE INDEX ix_highlight_candidates_score_desc ON highlight_candidates (score DESC)")
op.execute("CREATE INDEX ix_highlight_candidates_status ON highlight_candidates (status)")
def downgrade() -> None:
op.drop_index("ix_highlight_candidates_status")
op.drop_index("ix_highlight_candidates_score_desc")
op.drop_index("ix_highlight_candidates_source_video_id")
op.drop_table("highlight_candidates")
sa.Enum(name="highlight_status").drop(op.get_bind(), checkfirst=True)