44 lines
1.7 KiB
Python
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)
|