from sqlalchemy import String, Integer, ForeignKey, CheckConstraint, func 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 class ConnectionRequest(Base): __tablename__ = "connection_requests" __table_args__ = ( CheckConstraint( "status IN ('pending', 'accepted', 'rejected', 'cancelled')", name="ck_connection_requests_status", ), ) id: Mapped[int] = mapped_column(primary_key=True, index=True) sender_id: Mapped[int] = mapped_column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) receiver_id: Mapped[int] = mapped_column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) status: Mapped[str] = mapped_column(String(20), nullable=False, server_default="pending") created_at: Mapped[datetime] = mapped_column(default=func.now(), server_default=func.now()) resolved_at: Mapped[Optional[datetime]] = mapped_column(nullable=True, default=None) person_id: Mapped[Optional[int]] = mapped_column( Integer, ForeignKey("people.id", ondelete="SET NULL"), nullable=True ) # Relationships with explicit foreign_keys to disambiguate sender: Mapped["User"] = relationship(foreign_keys=[sender_id], lazy="selectin") receiver: Mapped["User"] = relationship(foreign_keys=[receiver_id], lazy="selectin")