from sqlalchemy import Integer, ForeignKey, func from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import Mapped, mapped_column, relationship from datetime import datetime from typing import Optional, TYPE_CHECKING from app.database import Base if TYPE_CHECKING: from app.models.user import User from app.models.person import Person class UserConnection(Base): __tablename__ = "user_connections" id: Mapped[int] = mapped_column(primary_key=True, index=True) user_id: Mapped[int] = mapped_column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) connected_user_id: Mapped[int] = mapped_column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) person_id: Mapped[Optional[int]] = mapped_column( Integer, ForeignKey("people.id", ondelete="SET NULL"), nullable=True ) sharing_overrides: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True) created_at: Mapped[datetime] = mapped_column(default=func.now(), server_default=func.now()) # Relationships connected_user: Mapped["User"] = relationship(foreign_keys=[connected_user_id], lazy="selectin") person: Mapped[Optional["Person"]] = relationship(foreign_keys=[person_id], lazy="selectin")