"""Friendship model: a one-directional request that becomes mutual on accept.""" from sqlalchemy import ( CheckConstraint, Column, DateTime, ForeignKey, Integer, String, UniqueConstraint, ) from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.database import Base class FriendshipStatus: """String values for the friendship.status column.""" PENDING = "pending" ACCEPTED = "accepted" class Friendship(Base): __tablename__ = "friendships" __table_args__ = ( UniqueConstraint( "requester_id", "addressee_id", name="uq_friendships_pair", ), CheckConstraint( "requester_id <> addressee_id", name="ck_friendships_no_self", ), CheckConstraint( "status IN ('pending', 'accepted')", name="ck_friendships_status", ), ) id = Column(Integer, primary_key=True, index=True) requester_id = Column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True, ) addressee_id = Column( Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True, ) status = Column( String(20), nullable=False, default=FriendshipStatus.PENDING, server_default=FriendshipStatus.PENDING, ) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) requester = relationship( "User", foreign_keys=[requester_id], back_populates="sent_friend_requests", ) addressee = relationship( "User", foreign_keys=[addressee_id], back_populates="received_friend_requests", )