message.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, ForeignKey, Enum
  2. from sqlalchemy.sql import func
  3. from sqlalchemy.orm import relationship
  4. import enum
  5. from app.core.database import Base
  6. class MessageType(str, enum.Enum):
  7. MESSAGE = "MESSAGE"
  8. NOTIFICATION = "NOTIFICATION"
  9. class ContentType(str, enum.Enum):
  10. TEXT = "TEXT"
  11. IMAGE = "IMAGE"
  12. VIDEO = "VIDEO"
  13. FILE = "FILE"
  14. # 用户在应用内发起的“申请通知”,用于在私信界面展示通知样式(携带 action_url/action_text)
  15. USER_NOTIFICATION = "USER_NOTIFICATION"
  16. class Message(Base):
  17. __tablename__ = "messages"
  18. id = Column(Integer, primary_key=True, index=True)
  19. sender_id = Column(Integer, ForeignKey("users.id"), nullable=True)
  20. receiver_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
  21. app_id = Column(Integer, ForeignKey("applications.id"), nullable=True)
  22. type = Column(Enum(MessageType), default=MessageType.MESSAGE, nullable=False)
  23. content_type = Column(Enum(ContentType), default=ContentType.TEXT, nullable=False)
  24. title = Column(String(255), nullable=False)
  25. content = Column(Text, nullable=False)
  26. action_url = Column(String(1000), nullable=True)
  27. action_text = Column(String(50), nullable=True)
  28. is_read = Column(Boolean, default=False, nullable=False)
  29. created_at = Column(DateTime(timezone=True), server_default=func.now())
  30. read_at = Column(DateTime(timezone=True), nullable=True)
  31. sender = relationship("User", foreign_keys=[sender_id], backref="sent_messages")
  32. receiver = relationship("User", foreign_keys=[receiver_id], backref="received_messages")
  33. app = relationship("Application", foreign_keys=[app_id])