PMFlow/backend/app/api/feishu_api/test_routes.py

83 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Feishu connection test routes."""
from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from ...database import get_db
from ...dependencies.auth import get_current_user
from ...dependencies.tenant import get_tenant_id
from ...models import User
from ...services.feishu_integration import get_feishu_service
from ...services.feishu_long_connection import get_feishu_long_connection_manager
from .helpers import build_long_connection_failure
router = APIRouter()
@router.post("/test-connection")
async def test_feishu_connection(
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
tenant_id: int = Depends(get_tenant_id),
):
"""测试飞书连接是否正常。"""
_ = current_user
try:
service = get_feishu_service(db)
await service.load_config(tenant_id)
manager = get_feishu_long_connection_manager()
if not service.is_configured():
return {
"status": "error",
"message": "飞书未配置",
}
try:
access_token = await service._get_tenant_access_token()
event_mode = "long_connection"
long_status = manager.status() if manager else None
if not long_status:
return {
"status": "error",
"message": "长连接管理器未初始化",
"event_mode": event_mode,
}
if not long_status.get("sdk_available"):
return {
"status": "error",
"message": "长连接 SDK 未安装(缺少 lark-oapi)",
"event_mode": event_mode,
"long_connection": long_status,
}
if not long_status.get("thread_alive"):
message, detail = build_long_connection_failure(long_status)
return {
"status": "error",
"message": message,
"event_mode": event_mode,
"long_connection": long_status,
"detail": detail,
}
return {
"status": "success",
"message": "飞书连接正常",
"has_token": bool(access_token),
"mode": "long_connection",
"event_mode": event_mode,
"long_connection": long_status,
}
except Exception as token_error:
return {
"status": "error",
"message": f"获取 Token 失败: {str(token_error)}",
"hint": "请检查 App ID 和 App Secret 是否正确",
}
except Exception as exc:
raise HTTPException(status_code=500, detail=f"测试连接失败: {str(exc)}")