ForcePilot/backend/package/yuxi/channel/extensions/confluence/search.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

49 lines
1.4 KiB
Python

from datetime import datetime, UTC
class CQLBuilder:
@staticmethod
def comment_poll(
since_iso: str,
space_keys: list[str] | None = None,
) -> str:
parts = ['type = "comment"']
if space_keys:
space_clause = " OR ".join(f'space = "{sk}"' for sk in space_keys)
parts.append(f"({space_clause})")
parts.append(f'lastModified > "{since_iso}"')
parts.append("ORDER BY lastModified ASC")
return " AND ".join(parts)
@staticmethod
def search_pages(
query: str,
space_keys: list[str] | None = None,
) -> str:
parts = [
f'(title ~ "{query}" OR text ~ "{query}")',
'type = "page"',
]
if space_keys:
space_clause = " OR ".join(f'space = "{sk}"' for sk in space_keys)
parts.append(f"({space_clause})")
return " AND ".join(parts)
@staticmethod
def recent_pages(
space_keys: list[str] | None = None,
hours: int = 24,
) -> str:
parts = [
'type = "page"',
f'lastModified > now("-{hours}h")',
]
if space_keys:
space_clause = " OR ".join(f'space = "{sk}"' for sk in space_keys)
parts.append(f"({space_clause})")
return " AND ".join(parts)
@staticmethod
def format_timestamp(ts: float) -> str:
return datetime.fromtimestamp(ts, tz=UTC).strftime("%Y-%m-%dT%H:%M:%S.000Z")