Files
aiagent/saars/backend/app/models/chat.py
2026-03-07 09:01:00 +08:00

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,
}