New POST /api/profiles/{name}/feedback accepts explicit vibe text and
records feedback against a named profile. GET history endpoint added too.
Scoring now filters feedback by profile_name for profile-aware playlists.
Migration 005 adds profile_name column and makes playlist_id nullable.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
31 lines
1.0 KiB
Python
31 lines
1.0 KiB
Python
"""Add profile_name to feedback_events, make playlist_id nullable
|
|
|
|
Revision ID: 005
|
|
Revises: 004
|
|
Create Date: 2026-02-23
|
|
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision: str = "005"
|
|
down_revision: Union[str, None] = "004"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.add_column("feedback_events", sa.Column("profile_name", sa.Text, nullable=True))
|
|
op.create_index("ix_feedback_events_profile_name", "feedback_events", ["profile_name"])
|
|
|
|
# Make playlist_id nullable (profile-scoped feedback doesn't require a playlist)
|
|
op.alter_column("feedback_events", "playlist_id", existing_type=sa.BigInteger, nullable=True)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.alter_column("feedback_events", "playlist_id", existing_type=sa.BigInteger, nullable=False)
|
|
op.drop_index("ix_feedback_events_profile_name", table_name="feedback_events")
|
|
op.drop_column("feedback_events", "profile_name")
|