- CreatorFollow model + pure SQL migration 022
- Follow router: POST/DELETE /follows/{creator_id}, GET /follows/me, GET /follows/{id}/status
- follower_count on creator detail endpoint
- Follow button on CreatorDetail (authenticated users only)
- CreatorTiers page with Free/Pro/Premium cards, Coming Soon modals
- Tiers link in creator sidebar nav
- Route /creator/tiers (protected)
31 lines
1 KiB
Python
31 lines
1 KiB
Python
"""Add creator_follows table for user follow system.
|
|
|
|
Revision ID: 022_add_creator_follows
|
|
Revises: 021_add_highlight_trim_columns
|
|
"""
|
|
|
|
from alembic import op
|
|
|
|
|
|
revision = "022_add_creator_follows"
|
|
down_revision = "021_add_highlight_trim_columns"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.execute("""
|
|
CREATE TABLE IF NOT EXISTS creator_follows (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
creator_id UUID NOT NULL REFERENCES creators(id) ON DELETE CASCADE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
CONSTRAINT uq_creator_follow_user_creator UNIQUE (user_id, creator_id)
|
|
)
|
|
""")
|
|
op.execute("CREATE INDEX IF NOT EXISTS ix_creator_follows_user_id ON creator_follows (user_id)")
|
|
op.execute("CREATE INDEX IF NOT EXISTS ix_creator_follows_creator_id ON creator_follows (creator_id)")
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.execute("DROP TABLE IF EXISTS creator_follows")
|