新增了完整的Confluence集成插件,包含以下核心功能: 1. 基础认证与配置管理,支持API Token和OAuth2两种认证方式 2. 评论去重、权限控制与提及解析 3. 知识库检索与页面内容处理 4. 评论收发、编辑删除与流式回复支持 5. 附件与页面标签管理 6. 内容属性存储与AI元数据管理 7. Webhook事件接收与处理 8. 完整的插件配置与状态检查
70 lines
2.7 KiB
Python
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 []
|