Files
2026-06-08 18:14:59 +08:00

145 lines
4.4 KiB
Python

from datetime import datetime
from typing import Optional, List, Dict, Any
from pydantic import BaseModel, ConfigDict, Field
# ============ 会话 Schema ============
class ConversationBase(BaseModel):
"""会话基础Schema"""
type: str = Field(default="private", description="会话类型: private/group")
name: Optional[str] = Field(default=None, max_length=100, description="群聊名称")
avatar: Optional[str] = Field(default=None, description="群头像文件ID")
class CreatePrivateConversationIn(BaseModel):
"""创建单聊会话"""
user_id: str = Field(..., description="对方用户ID")
class CreateGroupConversationIn(BaseModel):
"""创建群聊会话"""
name: str = Field(..., max_length=100, description="群聊名称")
member_ids: List[str] = Field(..., description="成员用户ID列表")
avatar: Optional[str] = Field(default=None, description="群头像文件ID")
class UpdateConversationIn(BaseModel):
"""更新群聊信息"""
name: Optional[str] = Field(default=None, max_length=100, description="群聊名称")
avatar: Optional[str] = Field(default=None, description="群头像文件ID")
class ConversationMemberOut(BaseModel):
"""会话成员输出"""
id: str
user_id: str
role: str
nickname: Optional[str] = None
is_muted: bool = False
is_pinned: bool = False
unread_count: int = 0
joined_at: Optional[datetime] = None
# 关联用户信息(由API填充)
user_name: Optional[str] = None
user_avatar: Optional[str] = None
model_config = ConfigDict(from_attributes=True)
class ConversationOut(BaseModel):
"""会话输出"""
id: str
type: str
name: Optional[str] = None
avatar: Optional[str] = None
owner_id: Optional[str] = None
last_message_time: Optional[datetime] = None
last_message_preview: Optional[str] = None
member_count: int = 0
sys_create_datetime: Optional[datetime] = None
# 当前用户相关(由API填充)
unread_count: int = 0
is_muted: bool = False
is_pinned: bool = False
# 单聊对方信息(由API填充)
peer_user_id: Optional[str] = None
peer_user_name: Optional[str] = None
peer_user_avatar: Optional[str] = None
model_config = ConfigDict(from_attributes=True)
class ConversationListOut(BaseModel):
"""会话列表输出"""
items: List[ConversationOut]
total: int
# ============ 成员操作 Schema ============
class AddMembersIn(BaseModel):
"""添加成员"""
user_ids: List[str] = Field(..., description="用户ID列表")
class ConversationSettingIn(BaseModel):
"""会话设置(置顶/免打扰)"""
value: bool = Field(..., description="设置值")
# ============ 消息 Schema ============
class SendMessageIn(BaseModel):
"""发送消息"""
msg_type: str = Field(default="text", description="消息类型: text/image/file/voice")
content: Optional[str] = Field(default=None, description="文本内容")
file_id: Optional[str] = Field(default=None, description="文件ID")
reply_to_id: Optional[str] = Field(default=None, description="回复的消息ID")
extra: Optional[Dict[str, Any]] = Field(default=None, description="扩展数据")
class ChatMessageOut(BaseModel):
"""消息输出"""
id: str
conversation_id: str
sender_id: str
msg_type: str
content: Optional[str] = None
file_id: Optional[str] = None
reply_to_id: Optional[str] = None
is_recalled: bool = False
recalled_at: Optional[datetime] = None
extra: Optional[Dict[str, Any]] = None
sys_create_datetime: Optional[datetime] = None
# 关联信息(由API填充)
sender_name: Optional[str] = None
sender_avatar: Optional[str] = None
# 回复消息预览(由API填充)
reply_to_preview: Optional[str] = None
reply_to_sender_name: Optional[str] = None
# 文件信息(由API填充)
file_name: Optional[str] = None
file_url: Optional[str] = None
file_size: Optional[int] = None
file_ext: Optional[str] = None
model_config = ConfigDict(from_attributes=True)
class ChatMessageListOut(BaseModel):
"""消息列表输出(游标分页)"""
items: List[ChatMessageOut]
has_more: bool = False
class RecallMessageIn(BaseModel):
"""撤回消息"""
pass
class MarkReadIn(BaseModel):
"""标记已读"""
message_id: str = Field(..., description="已读到的消息ID")