"""Feishu (Lark) Helpdesk driver — ``kind='helpdesk'``. Read-only data source: pulls 服务台 ticket data for analytics/reporting (see :mod:`app.domains.feishu_helpdesk`). Multi-instance — one row per 服务台, each carrying its own ``helpdesk_id`` / ``helpdesk_token`` plus the owning Feishu app's ``app_id`` / ``app_secret`` (a 服务台 is bound to a specific app; the app needs the ``helpdesk:all:readonly`` scope). """ from __future__ import annotations import logging from app.domains.feishu_helpdesk.client import FeishuHelpdeskClient from app.integrations.driver_base import IntegrationDriver from app.integrations.registry import register_driver from app.integrations.schemas import ( IntegrationFieldInfo, IntegrationTestResult, ) logger = logging.getLogger(__name__) _CONFIG_SCHEMA = [ IntegrationFieldInfo( key="app_id", label="App ID", is_secret=False, required=True, placeholder="cli_xxxxxxxxxxxxxxxx", hint="服务台所属飞书应用的 App ID(与审批/通知可同一应用)。", ), IntegrationFieldInfo( key="app_secret", label="App Secret", is_secret=True, required=True, hint="该飞书应用的 App Secret,仅在轮换时重新粘贴。", ), IntegrationFieldInfo( key="helpdesk_id", label="Helpdesk ID", is_secret=False, required=True, hint="服务台后台 > 开发者选项 里的 helpdesk_id。", ), IntegrationFieldInfo( key="helpdesk_token", label="Helpdesk Token", is_secret=True, required=True, hint="服务台后台 > 开发者选项 里的 helpdesk_token(ht- 前缀)。", ), ] @register_driver class FeishuHelpdeskDriver(IntegrationDriver): kind = "helpdesk" provider = "feishu" display_name = "飞书 (Lark) 服务台" description = ( "飞书开放平台 Helpdesk v1。只读拉取服务台工单做分析报表。" "应用需开通 helpdesk:all:readonly 权限并发布版本;每个服务台一行," "可挂多个。由 feishu.helpdesk_sync 定时同步落库。" ) supports_multi_instance = True config_schema = _CONFIG_SCHEMA def make_client(self) -> FeishuHelpdeskClient: return FeishuHelpdeskClient( app_id=str(self.config.get("app_id") or ""), app_secret=str(self.config.get("app_secret") or ""), helpdesk_id=str(self.config.get("helpdesk_id") or ""), helpdesk_token=str(self.config.get("helpdesk_token") or ""), ) async def test_connection(self) -> IntegrationTestResult: try: total = await self.make_client().test_connection_total() except Exception as e: # noqa: BLE001 return IntegrationTestResult( ok=False, message=f"{type(e).__name__}: {e}", ) return IntegrationTestResult( ok=True, message=f"连接成功,服务台可见工单约 {total} 条。", )