添加用户消息记录接口;
This commit is contained in:
162
backend/app/routes/message_routes.py
Normal file
162
backend/app/routes/message_routes.py
Normal file
@@ -0,0 +1,162 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
消息API路由
|
||||
提供加载会话存档、查询消息等功能的API接口
|
||||
"""
|
||||
|
||||
from typing import Optional
|
||||
from fastapi import APIRouter, HTTPException, Query, Depends
|
||||
import logging
|
||||
|
||||
from app.services.message_service import get_message_service, MessageService
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
router = APIRouter(
|
||||
prefix="/messages",
|
||||
tags=["messages"],
|
||||
responses={404: {"description": "Not found"}},
|
||||
)
|
||||
|
||||
|
||||
@router.post("/load")
|
||||
async def load_messages(
|
||||
seq: int = Query(0, description="起始seq值,首次使用0"),
|
||||
limit: int = Query(100, description="拉取数量限制", ge=1, le=1000),
|
||||
service: MessageService = Depends(get_message_service),
|
||||
):
|
||||
"""
|
||||
加载会话存档到数据库
|
||||
|
||||
完整流程:拉取 → 解密 → 保存
|
||||
|
||||
- 从企业微信拉取会话存档
|
||||
- 自动解密所有加密消息
|
||||
- 自动保存到数据库(去重处理)
|
||||
|
||||
参数说明:
|
||||
- seq: 起始序列号,首次拉取使用0,后续使用上次返回的max_seq
|
||||
- limit: 一次拉取的消息数量,最大1000
|
||||
|
||||
返回示例:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "消息加载完成",
|
||||
"data": {
|
||||
"total_fetched": 150,
|
||||
"encrypted_count": 120,
|
||||
"decrypted_success": 115,
|
||||
"decrypted_failed": 5,
|
||||
"saved_count": 145,
|
||||
"duplicates_skipped": 5,
|
||||
"failed_to_save": 0,
|
||||
"max_seq": 12345,
|
||||
"next_seq": 12346
|
||||
},
|
||||
"execution_time": "0:00:02.345678",
|
||||
"timestamp": "2025-12-10T16:44:22.123456"
|
||||
}
|
||||
```
|
||||
"""
|
||||
try:
|
||||
logger.info(f"API调用: 加载消息, seq={seq}, limit={limit}")
|
||||
result = await service.load_messages(seq=seq, limit=limit)
|
||||
|
||||
if not result.get("success", False):
|
||||
raise HTTPException(
|
||||
status_code=500, detail=result.get("message", "加载消息失败")
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"加载消息API调用失败: {e}")
|
||||
raise HTTPException(status_code=500, detail=f"加载消息失败: {str(e)}")
|
||||
|
||||
|
||||
@router.get("/")
|
||||
async def get_messages(
|
||||
page: int = Query(1, description="页码", ge=1),
|
||||
page_size: int = Query(20, description="每页数量", ge=1, le=100),
|
||||
msgtype: Optional[str] = Query(None, description="消息类型过滤"),
|
||||
roomid: Optional[str] = Query(None, description="群聊ID过滤"),
|
||||
from_user: Optional[str] = Query(None, description="发送者过滤"),
|
||||
service: MessageService = Depends(get_message_service),
|
||||
):
|
||||
"""
|
||||
查询消息列表
|
||||
|
||||
支持分页和过滤条件查询
|
||||
"""
|
||||
try:
|
||||
logger.info(
|
||||
f"API调用: 查询消息列表, page={page}, page_size={page_size}, "
|
||||
f"msgtype={msgtype}, roomid={roomid}, from_user={from_user}"
|
||||
)
|
||||
|
||||
result = await service.get_messages(
|
||||
page=page,
|
||||
page_size=page_size,
|
||||
msgtype=msgtype,
|
||||
roomid=roomid,
|
||||
from_user=from_user,
|
||||
)
|
||||
|
||||
if not result.get("success", False):
|
||||
raise HTTPException(
|
||||
status_code=500, detail=result.get("message", "查询消息列表失败")
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"查询消息列表失败: {e}")
|
||||
raise HTTPException(status_code=500, detail=f"查询消息列表失败: {str(e)}")
|
||||
|
||||
|
||||
@router.get("/stats")
|
||||
async def get_message_stats(service: MessageService = Depends(get_message_service)):
|
||||
"""
|
||||
获取消息统计信息
|
||||
|
||||
返回数据库中消息的统计信息
|
||||
"""
|
||||
try:
|
||||
# 这里可以添加统计逻辑
|
||||
# 暂时返回空统计,实际实现需要连接数据库统计
|
||||
return {
|
||||
"success": True,
|
||||
"data": {"total_messages": 0, "message_types": {}, "date_distribution": {}},
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"获取消息统计失败: {e}")
|
||||
raise HTTPException(status_code=500, detail=f"获取消息统计失败: {str(e)}")
|
||||
|
||||
|
||||
@router.get("/{msgid}")
|
||||
async def get_message_by_id(
|
||||
msgid: str, service: MessageService = Depends(get_message_service)
|
||||
):
|
||||
"""
|
||||
根据消息ID获取单个消息详情
|
||||
"""
|
||||
try:
|
||||
# 这里可以添加根据msgid查询消息的逻辑
|
||||
# 暂时返回空,实际实现需要连接数据库查询
|
||||
return {"success": True, "data": None, "message": "消息查询功能待实现"}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"查询消息详情失败 (msgid: {msgid}): {e}")
|
||||
raise HTTPException(status_code=500, detail=f"查询消息详情失败: {str(e)}")
|
||||
|
||||
|
||||
# 应用关闭时的清理
|
||||
@router.on_event("shutdown")
|
||||
async def shutdown_event():
|
||||
"""应用关闭时清理资源"""
|
||||
from app.services.message_service import close_message_service
|
||||
|
||||
close_message_service()
|
||||
logger.info("消息服务已关闭")
|
||||
Reference in New Issue
Block a user