56 lines
2.2 KiB
Python
56 lines
2.2 KiB
Python
"""
|
|
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,
|
|
}
|