80 lines
2.0 KiB
Python
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),
|
|
}
|