87 lines
2.2 KiB
Python
87 lines
2.2 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, list_accounts
|
||
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),
|
||
}
|
||
|
||
|
||
@router.get("/accounts")
|
||
async def get_accounts():
|
||
"""获取客服账号列表(用于查看正确的 open_kfid)"""
|
||
result = await list_accounts()
|
||
return result
|