ForcePilot/backend/package/yuxi/external_systems/integrations/jira/metadata.py
Kris 9e095ee5ec feat: 完成多批次功能迭代与优化
本次提交包含大量功能完善与修复:
1. 新增多类操作的操作人审计字段与环境校验逻辑
2. 修复多集成的认证头生成逻辑,支持动态token类型
3. 新增通知派发适配器框架与多渠道实现
4. 完善健康检查返回结果与指标监控项
5. 优化JQL校验逻辑与资产导入规则
6. 补充各类DTO字段与持久层映射关系
7. 修复并优化测试用例、配额、密钥轮转等服务逻辑
2026-07-11 05:39:41 +08:00

163 lines
7.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.

"""Jira / Confluence 厂商集成元数据。
定义 ``IntegrationMetadata(key="jira", ...)`` 与 ``IntegrationMetadata(key="confluence", ...)``
两个实例,由 ``__init__.py`` 自注册到 ``IntegrationRegistry``。元数据为内存态,不持久化到数据库。
同时定义 Atlassian Cloud / Data Center 的 API 端点常量、OAuth 端点常量、路径模板等,
供 ``operations.py`` / ``generators.py`` 复用。
Cloud vs Data Center 路径差异(见设计文档 §1 / §4
| 维度 | Cloud | Data Center |
| --- | --- | --- |
| Jira API 版本 | v3 | v2 |
| Confluence API 版本 | v2 | v1``/rest/api`` |
| Jira REST 根路径Basic Auth | ``https://<site>.atlassian.net/rest/api/3`` | ``https://<host>:<port>/[context]/rest/api/2`` |
| Jira REST 根路径OAuth 3LO | ``https://api.atlassian.com/ex/jira/{cloudId}/rest/api/3`` | 无DC 不需要 cloudId |
| Confluence REST 根路径Basic Auth | ``https://<site>.atlassian.net/wiki/rest/api/v2`` | ``https://<host>:<port>/[context]/rest/api`` |
| Confluence REST 根路径OAuth 3LO | ``https://api.atlassian.com/ex/confluence/{cloudId}/wiki/rest/api/v2`` | 无 |
"""
from __future__ import annotations
from yuxi.external_systems.integrations.schemas import IntegrationMetadata
# ── OAuth 2.0 (3LO) 端点常量 ──────────────────────────────────────────────
CLOUD_AUTHORIZE_URL = "https://auth.atlassian.com/authorize"
CLOUD_TOKEN_URL = "https://auth.atlassian.com/oauth/token"
CLOUD_ACCESSIBLE_RESOURCES_URL = "https://api.atlassian.com/oauth/token/accessible-resources"
# ── Atlassian OAuth 代理地址前缀 ──────────────────────────────────────────
CLOUD_OAUTH_PROXY_BASE = "https://api.atlassian.com/ex"
# ── 健康检查推荐路径 ──────────────────────────────────────────────────────
JIRA_CLOUD_HEALTH_CHECK_PATH = "/rest/api/3/myself"
JIRA_DC_HEALTH_CHECK_PATH = "/rest/api/2/myself"
CONFLUENCE_CLOUD_HEALTH_CHECK_PATH = "/wiki/rest/api/v2/user/current"
CONFLUENCE_DC_HEALTH_CHECK_PATH = "/rest/api/user/current"
# ── Jira 元数据发现路径模板 ───────────────────────────────────────────────
JIRA_PROJECTS_PATH = "/rest/api/{api_version}/project"
JIRA_PROJECT_DETAIL_PATH = "/rest/api/{api_version}/project/{project_id_or_key}"
JIRA_ISSUE_TYPES_PATH = "/rest/api/{api_version}/issue/createmeta/{project_id_or_key}/issuetypes"
JIRA_ISSUE_TYPE_FIELDS_PATH = "/rest/api/{api_version}/issue/createmeta/{project_id_or_key}/issuetypes/{issue_type_id}"
JIRA_FIELDS_PATH = "/rest/api/{api_version}/field"
JIRA_STATUSES_PATH = "/rest/api/{api_version}/status"
# ── Jira Issue CRUD 路径模板 ──────────────────────────────────────────────
JIRA_ISSUE_CREATE_PATH = "/rest/api/{api_version}/issue"
JIRA_ISSUE_GET_UPDATE_PATH = "/rest/api/{api_version}/issue/{{issueIdOrKey}}"
JIRA_ISSUE_TRANSITIONS_PATH = "/rest/api/{api_version}/issue/{{issueIdOrKey}}/transitions"
JIRA_SEARCH_CLOUD_PATH = "/rest/api/{api_version}/search/jql"
JIRA_SEARCH_DC_PATH = "/rest/api/{api_version}/search"
# ── Confluence 元数据发现路径模板 ─────────────────────────────────────────
CONFLUENCE_CLOUD_SPACES_PATH = "/wiki/rest/api/v2/spaces"
CONFLUENCE_DC_SPACES_PATH = "/rest/api/space"
# ── Confluence 页面 CRUD 路径模板 ─────────────────────────────────────────
CONFLUENCE_CLOUD_PAGES_PATH = "/wiki/rest/api/v2/pages"
CONFLUENCE_CLOUD_PAGE_DETAIL_PATH = "/wiki/rest/api/v2/pages/{id}"
CONFLUENCE_CLOUD_SEARCH_PATH = "/wiki/rest/api/v2/search"
CONFLUENCE_DC_CONTENT_PATH = "/rest/api/content"
CONFLUENCE_DC_CONTENT_DETAIL_PATH = "/rest/api/content/{id}"
CONFLUENCE_DC_SEARCH_PATH = "/rest/api/content/search"
# ── IntegrationMetadata 定义 ──────────────────────────────────────────────
_CONNECTION_EXTRA_SCHEMA: dict = {
"type": "object",
"properties": {
"deployment_mode": {
"type": "string",
"enum": ["cloud", "data_center"],
"default": "cloud",
"description": "部署模式cloud 或 data_center",
},
"site_url": {
"type": "string",
"description": "Cloud 站点 URLAPI token 场景),如 https://myorg.atlassian.net",
},
"base_url": {
"type": "string",
"description": "DC 实例根 URL如 https://jira.example.com:8443/context",
},
"api_version": {
"type": "string",
"enum": ["v2", "v3"],
"default": "v3",
"description": "API 版本Cloud 用 v3DC 用 v2",
},
"product": {
"type": "string",
"enum": ["jira", "confluence"],
"default": "jira",
"description": "Atlassian 产品jira 或 confluence",
},
"cloud_id": {
"type": "string",
"description": "Cloud 3LO 场景的 cloudId首次授权时解析可手动指定用于多站点校验",
},
},
"required": ["deployment_mode"],
}
_DEPENDENCY_NOTE = (
"Cloud 3LOjira_cloud_3lo推荐用于生产环境自动解析 cloudId。"
"Cloud API tokenbasic2024-12-15 起新 token 默认 1 年过期,旧 token 在 2026-03-14 至 2026-05-12 间过期,需定期更换。"
"DC 需 Jira 8.4+(分步 createmeta 端点PAT 需 Jira 8.14+ / Confluence 7.9+。"
"DC OAuth2oauth2_authorization_code需框架补齐 PKCE 支持,当前建议 DC 场景使用 PAT。"
"Cloud 旧 search 端点(/rest/api/3/search已 deprecated需使用 /rest/api/3/search/jql。"
"Cloud 限流自 2026-03-02 起强制执行 points-based 计费,影响 3LO 应用API token 不受影响。"
)
JIRA_METADATA = IntegrationMetadata(
key="jira",
display_name="Jira / Confluence",
description="Atlassian Jira 集成,支持 Issue CRUD / JQL 搜索 / Transition / 项目管理",
adapter_type="http",
source_types=["jira"],
supported_auth_types=[
"jira_cloud_3lo", # Cloud 3LO专属含 cloudId 解析)
"basic", # Cloud API token
"oauth2_authorization_code", # DC OAuth2需框架补齐 PKCE
"jira_dc_pat", # DC PAT
],
tags=["研发管理", "项目管理", "SaaS", "Enterprise"],
icon="jira",
docs_url="https://developer.atlassian.com/cloud/jira/platform/rest/v3/",
connection_extra_schema=_CONNECTION_EXTRA_SCHEMA,
example_config={
"deployment_mode": "cloud",
"api_version": "v3",
"product": "jira",
"auth_type": "jira_cloud_3lo",
},
dependency_note=_DEPENDENCY_NOTE,
)
CONFLUENCE_METADATA = IntegrationMetadata(
key="confluence",
display_name="Confluence",
description="Atlassian Confluence 集成,支持页面 CRUD / CQL 搜索 / 空间管理",
adapter_type="http",
source_types=["confluence"],
supported_auth_types=[
"jira_cloud_3lo",
"basic",
"oauth2_authorization_code",
"jira_dc_pat",
],
tags=["知识库", "SaaS", "Enterprise"],
icon="confluence",
docs_url="https://developer.atlassian.com/cloud/confluence/rest/v2/",
connection_extra_schema=_CONNECTION_EXTRA_SCHEMA,
example_config={
"deployment_mode": "cloud",
"api_version": "v2",
"product": "confluence",
"auth_type": "jira_cloud_3lo",
},
dependency_note=_DEPENDENCY_NOTE,
)