""" Chat models: conversations and messages with status tracking. """ import uuid from datetime import datetime from app import db class Conversation(db.Model): __tablename__ = "conversations" id = db.Column(db.String(36), primary_key=True, default=lambda: str(uuid.uuid4())) user_id = db.Column(db.String(36), db.ForeignKey("users.id"), nullable=False, index=True) title = db.Column(db.String(256), default="新对话") last_message_at = db.Column(db.DateTime, default=datetime.utcnow) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) messages = db.relationship("Message", backref="conversation", lazy="dynamic", order_by="Message.created_at") class MessageStatus: SENT = "sent" DELIVERED = "delivered" READ = "read" RECALLED = "recalled" FAILED = "failed" class Message(db.Model): __tablename__ = "messages" id = db.Column(db.String(36), primary_key=True, default=lambda: str(uuid.uuid4())) conversation_id = db.Column(db.String(36), db.ForeignKey("conversations.id"), nullable=False, index=True) sender_id = db.Column(db.String(36), db.ForeignKey("users.id"), nullable=False, index=True) content = db.Column(db.Text, nullable=False) content_type = db.Column(db.String(32), default="text") # text, image, file attachment_url = db.Column(db.String(512)) attachment_name = db.Column(db.String(256)) status = db.Column(db.String(32), default=MessageStatus.SENT) is_recalled = db.Column(db.Boolean, default=False) recalled_at = db.Column(db.DateTime) created_at = db.Column(db.DateTime, default=datetime.utcnow) def to_dict(self): return { "id": self.id, "conversation_id": self.conversation_id, "sender_id": self.sender_id, "content": self.content, "content_type": self.content_type, "attachment_url": self.attachment_url, "attachment_name": self.attachment_name, "status": self.status, "is_recalled": self.is_recalled, "created_at": self.created_at.isoformat() if self.created_at else None, }