Files
ai-agent-admin/backend-fastapi/core/chat/model.py
T
2026-06-08 18:14:59 +08:00

67 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from datetime import datetime
from sqlalchemy import Column, String, Text, Boolean, Integer, DateTime, Index, JSON
from sqlalchemy.sql import func
from app.base_model import BaseModel
class Conversation(BaseModel):
"""会话表"""
__tablename__ = "core_conversation"
type = Column(String(20), nullable=False, default="private", comment="会话类型: private/group")
name = Column(String(100), nullable=True, comment="群聊名称(单聊为空)")
avatar = Column(String(500), nullable=True, comment="群头像文件ID")
owner_id = Column(String(21), nullable=True, comment="群主用户ID(逻辑外键关联core_user")
last_message_id = Column(String(21), nullable=True, comment="最后一条消息ID(逻辑外键)")
last_message_time = Column(DateTime, nullable=True, comment="最后消息时间")
last_message_preview = Column(String(200), nullable=True, comment="最后消息预览文本")
member_count = Column(Integer, default=0, comment="成员数")
__table_args__ = (
Index("idx_conversation_type", "type"),
Index("idx_conversation_last_msg_time", "last_message_time"),
)
class ConversationMember(BaseModel):
"""会话成员表"""
__tablename__ = "core_conversation_member"
conversation_id = Column(String(21), nullable=False, comment="会话ID(逻辑外键关联core_conversation")
user_id = Column(String(21), nullable=False, comment="用户ID(逻辑外键关联core_user")
role = Column(String(20), default="member", comment="角色: owner/admin/member")
nickname = Column(String(50), nullable=True, comment="群内昵称")
is_muted = Column(Boolean, default=False, comment="是否免打扰")
is_pinned = Column(Boolean, default=False, comment="是否置顶")
unread_count = Column(Integer, default=0, comment="未读消息数")
last_read_message_id = Column(String(21), nullable=True, comment="最后已读消息ID")
joined_at = Column(DateTime, server_default=func.now(), comment="加入时间")
__table_args__ = (
Index("idx_conv_member_conv_id", "conversation_id"),
Index("idx_conv_member_user_id", "user_id"),
Index("idx_conv_member_conv_user", "conversation_id", "user_id", unique=True),
)
class ChatMessage(BaseModel):
"""聊天消息表"""
__tablename__ = "core_chat_message"
conversation_id = Column(String(21), nullable=False, comment="会话ID(逻辑外键关联core_conversation")
sender_id = Column(String(21), nullable=False, comment="发送者用户ID(逻辑外键关联core_user")
msg_type = Column(String(20), default="text", comment="消息类型: text/image/file/voice/system/recall")
content = Column(Text, nullable=True, comment="文本内容")
file_id = Column(String(21), nullable=True, comment="文件ID(逻辑外键关联core_file_manager")
reply_to_id = Column(String(21), nullable=True, comment="回复的消息ID(逻辑外键)")
is_recalled = Column(Boolean, default=False, comment="是否已撤回")
recalled_at = Column(DateTime, nullable=True, comment="撤回时间")
extra = Column(JSON, nullable=True, comment="扩展数据(@提醒列表、链接预览等)")
__table_args__ = (
Index("idx_chat_msg_conv_id_created", "conversation_id", "sys_create_datetime"),
Index("idx_chat_msg_sender_id", "sender_id"),
)