"""ShareLink database model.""" from datetime import datetime from typing import TYPE_CHECKING from uuid import UUID, uuid4 from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String from sqlalchemy.dialects.postgresql import UUID as PGUUID from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database.base import Base if TYPE_CHECKING: from app.database.models.board import Board class ShareLink(Base): """ ShareLink model for sharing boards with configurable permissions. Share links allow users to share boards with others without requiring authentication, with permission levels controlling what actions are allowed. """ __tablename__ = "share_links" id: Mapped[UUID] = mapped_column(PGUUID(as_uuid=True), primary_key=True, default=uuid4) board_id: Mapped[UUID] = mapped_column( PGUUID(as_uuid=True), ForeignKey("boards.id", ondelete="CASCADE"), nullable=False ) token: Mapped[str] = mapped_column(String(64), unique=True, nullable=False, index=True) permission_level: Mapped[str] = mapped_column(String(20), nullable=False) # 'view-only' or 'view-comment' created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=datetime.utcnow) expires_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) last_accessed_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) access_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0) is_revoked: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False) # Relationships board: Mapped["Board"] = relationship("Board", back_populates="share_links") def __repr__(self) -> str: """String representation of ShareLink.""" return f""