from sqlalchemy import ( Boolean, Column, Integer, String, DateTime, Text, ForeignKey, Enum, ) from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.db.base import Base import enum class MessageType(enum.Enum): TEXT = "text" IMAGE = "image" FILE = "file" class Conversation(Base): __tablename__ = "conversations" id = Column(Integer, primary_key=True, index=True) participant_1_id = Column(Integer, ForeignKey("users.id"), nullable=False) participant_2_id = Column(Integer, ForeignKey("users.id"), nullable=False) created_at = Column(DateTime, nullable=False, default=func.now()) updated_at = Column( DateTime, nullable=False, default=func.now(), onupdate=func.now() ) # Relationships participant_1 = relationship("User", foreign_keys=[participant_1_id]) participant_2 = relationship("User", foreign_keys=[participant_2_id]) messages = relationship( "Message", back_populates="conversation", cascade="all, delete-orphan" ) class Message(Base): __tablename__ = "messages" id = Column(Integer, primary_key=True, index=True) conversation_id = Column(Integer, ForeignKey("conversations.id"), nullable=False) sender_id = Column(Integer, ForeignKey("users.id"), nullable=False) receiver_id = Column(Integer, ForeignKey("users.id"), nullable=False) message_type = Column(Enum(MessageType), default=MessageType.TEXT) content = Column(Text, nullable=False) file_url = Column(String, nullable=True) is_read = Column(Boolean, default=False) read_at = Column(DateTime, nullable=True) created_at = Column(DateTime, nullable=False, default=func.now()) # Relationships conversation = relationship("Conversation", back_populates="messages") sender = relationship("User", foreign_keys=[sender_id]) receiver = relationship("User", foreign_keys=[receiver_id]) class GroupChat(Base): __tablename__ = "group_chats" id = Column(Integer, primary_key=True, index=True) name = Column(String, nullable=False) description = Column(Text, nullable=True) created_by = Column(Integer, ForeignKey("users.id"), nullable=False) is_active = Column(Boolean, default=True) created_at = Column(DateTime, nullable=False, default=func.now()) # Relationships creator = relationship("User") members = relationship( "GroupChatMember", back_populates="group_chat", cascade="all, delete-orphan" ) messages = relationship( "GroupMessage", back_populates="group_chat", cascade="all, delete-orphan" ) class GroupChatMember(Base): __tablename__ = "group_chat_members" id = Column(Integer, primary_key=True, index=True) group_chat_id = Column(Integer, ForeignKey("group_chats.id"), nullable=False) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) is_admin = Column(Boolean, default=False) joined_at = Column(DateTime, nullable=False, default=func.now()) # Relationships group_chat = relationship("GroupChat", back_populates="members") user = relationship("User") class GroupMessage(Base): __tablename__ = "group_messages" id = Column(Integer, primary_key=True, index=True) group_chat_id = Column(Integer, ForeignKey("group_chats.id"), nullable=False) sender_id = Column(Integer, ForeignKey("users.id"), nullable=False) message_type = Column(Enum(MessageType), default=MessageType.TEXT) content = Column(Text, nullable=False) file_url = Column(String, nullable=True) created_at = Column(DateTime, nullable=False, default=func.now()) # Relationships group_chat = relationship("GroupChat", back_populates="messages") sender = relationship("User")