60 lines
2.5 KiB
Python
60 lines
2.5 KiB
Python
|
|
"""聊天记录导出相关数据模型。"""
|
|||
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
from typing import Literal, Optional
|
|||
|
|
|
|||
|
|
from pydantic import BaseModel, Field
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ---------------------------------------------------------------------------
|
|||
|
|
# 导出请求(POST /api/messages/export 异步用)
|
|||
|
|
# ---------------------------------------------------------------------------
|
|||
|
|
class ExportRequest(BaseModel):
|
|||
|
|
"""导出请求(POST /api/messages/export 异步用)。
|
|||
|
|
|
|||
|
|
limit > 1000 或 include_media=true 时应走异步端点;
|
|||
|
|
同步 GET /api/messages/export 仅服务 limit ≤ 1000 的纯文本导出。
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
talker: str = Field(..., description="会话 wxid 或群 id")
|
|||
|
|
format: Literal["html", "csv", "json", "txt"] = Field(
|
|||
|
|
"html", description="导出格式:html / csv / json / txt"
|
|||
|
|
)
|
|||
|
|
limit: int = Field(1000, ge=1, le=100000, description="导出消息数上限")
|
|||
|
|
include_media: bool = Field(False, description="是否打包媒体文件(zip)")
|
|||
|
|
media_inline: bool = Field(
|
|||
|
|
False, description="媒体是否内联(仅 HTML,将图片 base64 嵌入)"
|
|||
|
|
)
|
|||
|
|
start_time: Optional[int] = Field(None, description="起始时间戳(Unix 秒,含)")
|
|||
|
|
end_time: Optional[int] = Field(None, description="结束时间戳(Unix 秒,含)")
|
|||
|
|
|
|||
|
|
|
|||
|
|
# ---------------------------------------------------------------------------
|
|||
|
|
# 导出任务状态
|
|||
|
|
# ---------------------------------------------------------------------------
|
|||
|
|
class ExportTaskStatus(BaseModel):
|
|||
|
|
"""导出任务状态。
|
|||
|
|
|
|||
|
|
状态机:pending → running → completed / failed / cancelled。
|
|||
|
|
completed 时 download_url 字段有效;expires_at 之后下载链接失效。
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
task_id: str = Field(description="任务 ID(UUID)")
|
|||
|
|
status: Literal[
|
|||
|
|
"pending", "running", "completed", "failed", "cancelled"
|
|||
|
|
] = Field("pending", description="任务状态")
|
|||
|
|
progress: float = Field(
|
|||
|
|
0.0, ge=0.0, le=1.0, description="进度 0-1(processed/total)"
|
|||
|
|
)
|
|||
|
|
total: int = Field(0, description="待处理消息总数(运行中逐步更新)")
|
|||
|
|
processed: int = Field(0, description="已处理消息数")
|
|||
|
|
download_url: Optional[str] = Field(
|
|||
|
|
None, description="下载链接(status=completed 时有效)"
|
|||
|
|
)
|
|||
|
|
expires_at: Optional[int] = Field(
|
|||
|
|
None, description="下载链接过期时间戳(默认 2 小时后)"
|
|||
|
|
)
|
|||
|
|
error_message: Optional[str] = Field(
|
|||
|
|
None, description="失败原因(status=failed 时有效)"
|
|||
|
|
)
|