75 lines
1.8 KiB
Python
75 lines
1.8 KiB
Python
"""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",
|
|
)
|