python-wechat-kf/app/routes/api.py

80 lines
2.0 KiB
Python

from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from pydantic import BaseModel
from app.database import get_db
from app.services.message_service import (
get_conversations,
get_messages,
send_and_save,
save_messages,
)
from app.services.wechat_client import sync_msg
from app.config import settings
router = APIRouter(prefix="/api")
class SendMsgRequest(BaseModel):
external_userid: str
content: str
open_kfid: str = ""
class SyncRequest(BaseModel):
cursor: str = ""
token: str = ""
limit: int = 100
open_kfid: str = ""
@router.get("/conversations")
async def list_conversations(
open_kfid: str = Query(""),
db: AsyncSession = Depends(get_db),
):
"""获取会话列表"""
conversations = await get_conversations(db, open_kfid)
return {"conversations": conversations}
@router.get("/messages")
async def list_messages(
external_userid: str = Query(...),
open_kfid: str = Query(""),
page: int = Query(1, ge=1),
page_size: int = Query(50, ge=1, le=200),
db: AsyncSession = Depends(get_db),
):
"""获取某客户的消息列表"""
messages = await get_messages(db, external_userid, open_kfid, page, page_size)
return {"messages": messages}
@router.post("/send")
async def send_message(
req: SendMsgRequest,
db: AsyncSession = Depends(get_db),
):
"""发送消息"""
result = await send_and_save(db, req.external_userid, req.content, req.open_kfid)
return result
@router.post("/sync")
async def sync_messages(
req: SyncRequest,
db: AsyncSession = Depends(get_db),
):
"""手动拉取消息(轮询模式)"""
kfid = req.open_kfid or settings.open_kfid
result = await sync_msg(kfid, req.cursor, req.token, req.limit)
msg_list = result.get("msg_list", [])
saved = 0
if msg_list:
saved = await save_messages(db, msg_list)
return {
**result,
"saved": saved,
"total": len(msg_list),
}