ForcePilot/backend/package/yuxi/channel/extensions/confluence/labels.py
Kris f943c31ce4 feat(confluence): 新增Confluence渠道插件完整实现
新增了完整的Confluence集成插件,包含以下核心功能:
1.  基础认证与配置管理,支持API Token和OAuth2两种认证方式
2.  评论去重、权限控制与提及解析
3.  知识库检索与页面内容处理
4.  评论收发、编辑删除与流式回复支持
5.  附件与页面标签管理
6.  内容属性存储与AI元数据管理
7.  Webhook事件接收与处理
8.  完整的插件配置与状态检查
2026-05-21 10:43:42 +08:00

70 lines
2.7 KiB
Python

import logging
from yuxi.channel.extensions.confluence.gateway import ConfluenceGateway
from yuxi.channel.extensions.confluence.types import OutboundResult
logger = logging.getLogger(__name__)
class ConfluenceLabelManager:
def __init__(self, gateway: ConfluenceGateway):
self._gateway = gateway
async def get_page_labels(self, page_id: str, account_id: str = "default") -> list[dict]:
client = self._gateway.get_client(account_id)
if client is None:
return []
try:
result = await client._request("GET", f"/wiki/api/v2/pages/{page_id}/labels")
return result.get("results", [])
except Exception as e:
logger.error("Failed to get labels for page %s: %s", page_id, e)
return []
async def add_page_label(
self, page_id: str, label: str, prefix: str = "global", account_id: str = "default",
) -> OutboundResult:
client = self._gateway.get_client(account_id)
if client is None:
return OutboundResult(success=False, error="Client not found")
try:
result = await client._request(
"POST",
f"/wiki/api/v2/pages/{page_id}/labels",
json={"prefix": prefix, "name": label},
)
return OutboundResult(success=True, comment_id=result.get("id", ""))
except Exception as e:
logger.error("Failed to add label '%s' to page %s: %s", label, page_id, e)
return OutboundResult(success=False, error=str(e))
async def delete_page_label(
self, page_id: str, label_id: str, account_id: str = "default",
) -> OutboundResult:
client = self._gateway.get_client(account_id)
if client is None:
return OutboundResult(success=False, error="Client not found")
try:
await client._request(
"DELETE", f"/wiki/api/v2/pages/{page_id}/labels/{label_id}",
)
return OutboundResult(success=True, comment_id=label_id)
except Exception as e:
logger.error("Failed to delete label %s from page %s: %s", label_id, page_id, e)
return OutboundResult(success=False, error=str(e))
async def get_label_pages(
self, label_id: str, limit: int = 25, account_id: str = "default",
) -> list[dict]:
client = self._gateway.get_client(account_id)
if client is None:
return []
try:
result = await client._request(
"GET", f"/wiki/api/v2/labels/{label_id}/pages", params={"limit": limit},
)
return result.get("results", [])
except Exception as e:
logger.error("Failed to get pages for label %s: %s", label_id, e)
return []