38 lines
1.7 KiB
Python
38 lines
1.7 KiB
Python
"""ORM model for conversation share links.
|
|
|
|
A share link is a short, revocable code created by a user for *one* of their
|
|
conversations. Redeeming it copies that single conversation into the redeemer's
|
|
account. The table only stores the link itself — the conversation is copied
|
|
lazily at import time.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import UTC, datetime
|
|
|
|
from sqlalchemy import Boolean, String
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from deerflow.persistence.base import Base
|
|
from deerflow.persistence.types import BeijingDateTime
|
|
|
|
|
|
class ThreadShareRow(Base):
|
|
__tablename__ = "thread_shares"
|
|
|
|
# Short, URL-safe, unguessable code embedded in the share link.
|
|
share_code: Mapped[str] = mapped_column(String(32), primary_key=True)
|
|
# The user who created the share.
|
|
owner_user_id: Mapped[str] = mapped_column(String(64), nullable=False, index=True)
|
|
# The single conversation (thread) this link shares.
|
|
thread_id: Mapped[str] = mapped_column(String(64), nullable=False, index=True)
|
|
# Soft-disable: a revoked link can no longer be previewed or imported.
|
|
revoked: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
|
|
# Share mode:
|
|
# "import" — recipient (a logged-in user) copies the conversation into
|
|
# their own account and can keep chatting in the copy.
|
|
# "view" — a public, read-only static page anyone can open without
|
|
# logging in; viewers cannot send new messages.
|
|
mode: Mapped[str] = mapped_column(String(16), nullable=False, default="import", server_default="import")
|
|
created_at: Mapped[datetime] = mapped_column(BeijingDateTime(), nullable=False, default=lambda: datetime.now(UTC))
|