"""note_link_previews (URL unfurl — M6 1901) Revision ID: 0020 Revises: 0019 Create Date: 2026-07-23 Cached OG/meta previews for URLs in a note, fetched server-side on request (unfurl.py) and stored so they never re-fetch. One per (note, url). """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects.postgresql import UUID revision = "0020" down_revision = "0019" branch_labels = None depends_on = None def upgrade() -> None: op.create_table( "note_link_previews", sa.Column("id", UUID(as_uuid=True), primary_key=True), sa.Column("note_id", UUID(as_uuid=True), sa.ForeignKey("notes.id", ondelete="CASCADE"), nullable=False), sa.Column("url", sa.Text(), nullable=False), sa.Column("title", sa.Text(), nullable=True), sa.Column("description", sa.Text(), nullable=True), sa.Column("image_url", sa.Text(), nullable=True), sa.Column("site_name", sa.Text(), nullable=True), sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()), sa.UniqueConstraint("note_id", "url", name="uq_note_link_previews_note_url"), ) op.create_index("ix_note_link_previews_note", "note_link_previews", ["note_id"]) def downgrade() -> None: op.drop_index("ix_note_link_previews_note", table_name="note_link_previews") op.drop_table("note_link_previews")