跳到主要内容

后端

适用环境SaaS
私有部署

要求

ONES
v6.0.40+

概述

流程中间件,用于帮助你劫持ONES系统上的某些操作,劫持分为三种,前置,替换,后置。

  • 前置:修改操作的入参,也可以通过报错sdk抛出自定义错误,拒绝这次操作。
  • 替换:完整替换这次操作,自定义操作。
  • 后置:可在这次操作完整执行后,做其余事情。

参数格式

在前置或后置中,劫持函数的入参跟出参格式必须保持一致,而替换可以不一致,根据能力决定。

限制

  • 在同一个流程中,可以被多个插件做前置劫持,执行顺序根据插件启用时间顺序执行。
  • 在同一个流程中,只能被一个插件做替换劫持。
  • 在同一个流程中,可以被多个插件做后置劫持,执行顺序根据插件启用时间逆序执行。

使用

  • config/plugin.yaml

    plugin.yaml 文件的 middlewares 字段中声明使用的流程中间件

    config/plugin.yaml
    middlewares:
    - abilityType: abilityType # 中间件类型类型枚举值
    pre: preFunc # 前置处理函数
    replace: replaceFunc # 替换处理函数
    post: postFunc # 后置处理函数
  • /backend/src/index.ts编写对应的函数处理逻辑

    /backend/src/index.ts
    import { PluginError, PluginErrorTypeEnum } from '@ones-op/node-error'
    import type { PluginRequest, PluginResponse } from '@ones-op/node-types'

    export async function preFunc(request: PluginRequest): Promise<PluginResponse> {
    const body = request.body as any
    const name = body?.name as string
    if (name.length > 10) {
    // 通过插件报错的sdk,抛出错误
    throw new PluginError(PluginErrorTypeEnum.error, 500, '名字过长')
    }
    // 修改操作参数
    body.name = 'newName'
    return {
    body: body,
    }
    }

    export async function replaceFunc(request: PluginRequest): Promise<PluginResponse> {
    // 替换原有操作逻辑
    // result为约定的参数格式
    return {
    body: result,
    }
    }

    export async function postFunc(request: PluginRequest): Promise<PluginResponse> {
    const param = request.body
    // 后续动作
    return {
    body: param,
    }
    }

中间件列表

更新用例执行结果 updateTestCaseResult

ONES v6.0.40+

描述 支持插件劫持修改执行测试用例结果流程,目前只支持前置劫持,即在用户真正修改执行测试用例前,插件可二次修改其参数,或通过报错sdk,抛出标准错误。

Example

/backend/src/index.ts
enum Result {
failed = 'failed',
passed = 'passed',
blocked = 'blocked',
skipped = 'skipped',
}

interface Case {
executor: string
note: string
result: Result
uuid: string
steps: Step[]
}

interface Step {
uuid: string
actual_result: string
execute_result: string
}

interface UpdateTestCaseResultReq {
teamUUID: string
planUUID: string
cases: Case[]
}

export async function updateTestCaseResultPreFunc(
request: PluginRequest<UpdateTestCaseResultReq>,
): Promise<PluginResponse> {
const param = request.body
// 参数修改,错误返回
Logger.info(param.teamUUID)
Logger.info(param.operatorUUID)
return {
body: param,
}
}

前置方法参数说明

字段描述类型只读
teamUUID团队UUID字符串
planUUID测试计划UUID字符串
cases.executor执行者UUID字符串
cases.note执行时所填写的备注字符串
cases.result执行结果,是一个枚举值 passed: 通过 failed:失败 blocked:阻塞 skipped:跳过枚举
cases.uuid执行用例对应的UUID字符串
cases.steps.uuid执行用例中的步骤的UUID字符串
cases.steps.execute_result执行用例中的步骤的执行结果,是一个枚举值 passed: 通过 failed:失败 blocked:阻塞 skipped:跳过枚举
cases.steps.actual_result实际执行结果字符串

关联工作项 linkIssues

ONES v6.0.84+,v6.1.61+

描述 支持插件劫持关联工作项流程,目前只支持前置劫持,即在用户真正关联工作项前,插件可通过报错sdk,抛出标准错误,暂不支持修改参数。

Example

/backend/src/index.ts
interface LinkIssuesReq {
teamID: string
operatorID: string
issueID: string
links: LinkIssue[]
}

interface LinkIssue {
issueIDs: string[]
issueLinkTypeID: string
linkDescType: string
}

export async function LinkIssuesPreFunc(
request: PluginRequest<LinkIssuesReq>,
): Promise<PluginResponse> {
Logger.info(request.body.teamID)
Logger.info(request.body.operatorID)
Logger.info(request.body.issueID)
for (let i = 0; i < request.body.links.length; i++) {
Logger.info(request.body.links[i])
}
return {
body: request.body,
}
}

前置方法参数说明

字段描述类型
teamID团队ID字符串
operatorID操作者ID字符串
issueID关联方工作项ID字符串
links被关联方工作项对象数组

links 说明:

字段描述类型
issueIDs被关联工作项ID字符串数组
issueLinkTypeID关联关系类型:UUID0001:关联字符串枚举
linkDescType关联关系方向:link_out_desc:发起关联方的描述 link_in_desc:被关联方的描述字符串枚举

删除关联工作项 unlinkIssues

ONES v6.0.84+,v6.1.61+

描述 支持插件劫持删除关联工作项流程,目前只支持前置劫持,即在用户删除关联工作项前,插件可通过报错sdk,抛出标准错误,暂不支持修改参数。

Example

/backend/src/index.ts
interface UnlinkIssuesReq {
teamID: string
operatorID: string
issueID: string
links: UnlinkIssue[]
}

interface UnlinkIssue {
issueIDs: string[]
issueLinkTypeID: string
linkDescType: string
}

export async function UnlinkIssuesPreFunc(
request: PluginRequest<UnlinkIssuesReq>,
): Promise<PluginResponse> {
const param = request.body
Logger.info(param.teamID)
Logger.info(param.operatorID)
Logger.info(param.issueID)
for (let i = 0; i < param.links.length; i++) {
Logger.info(param.links[i])
}
return {
body: param,
}
}

前置方法参数说明

字段描述类型
teamID团队ID字符串
operatorID操作者ID字符串
issueID关联方工作项ID字符串
links被关联方工作项对象数组

links 说明:

字段描述类型
issueIDs被关联工作项ID字符串数组
issueLinkTypeID关联关系类型:UUID0001:关联字符串枚举
linkDescType关联关系方向:link_out_desc:发起关联方的描述 link_in_desc:被关联方的描述字符串枚举

新建工作项 createIssues

ONES v6.0.84+,v6.1.61+

描述 支持插件劫持新建(支持批量)工作项(包括子工作项)流程,目前只支持前置劫持,即在用户新建工作项前,插件可通过报错sdk,抛出标准错误,暂不支持修改参数。

Example

/backend/src/index.ts
interface CreateIssuesReq {
teamID: string
operatorID: string
issues: CreateIssues[]
}

interface CreateIssues {
issueID: string
assign: string
summary: string
parentIssueID: string
projectID: string
issueTypeScopeID: string
issueTypeID: string
subIssueTypeID: string
watchers: string[]
sprintID: string
deadline: string
descRich: string
priority: string
addManHours: AddManHourReq[]
fieldValues: FieldRawValue[]
}

interface AddManHourReq {
type: string
mode: string
hours: number
}

interface FieldRawValue {
fieldID: string
value: any
}

export async function CreateIssuesPreFunc(
request: PluginRequest<CreateIssuesReq>,
): Promise<PluginResponse> {
const param = request.body
Logger.info(param.teamID)
Logger.info(param.operatorID)
Logger.info(param.issues)
return {
body: param,
}
}

前置方法参数说明

字段描述类型
teamID团队ID字符串
operatorID操作者ID字符串
issues待新建工作项结构对象数组

issues 说明:

字段描述类型
issueID工作项ID字符串
assign负责人ID字符串
summary标题字符串
parentIssueID父工作项ID字符串
statusID工作项状态ID字符串
projectID所属项目ID字符串
issueTypeScopeID当前项目下工作项类型 ID字符串
issueTypeID工作项类型ID字符串
subIssueTypeID子工作项类型ID字符串
watchers关注者字符串数组
sprintID所属迭代ID字符串
deadline截止日期整形
descRich富文本描述字符串
priority优先级字符串
addManHours工时信息对象数组
fieldValues属性值对象数组

addManHours 说明:

字段描述类型
typesimple:简单模式 detailed:汇总模式字符串枚举
moderecorded:登记工时 estimated:预估工时字符串枚举
hours工时值字符串

fieldValues 说明:

字段描述类型
fieldID属性ID字符串
value属性值任意类型

删除工作项 deleteIssue

ONES v6.0.84+,v6.1.61+

描述 支持插件劫持删除工作项流程(暂不支持批量删除),目前只支持前置劫持,即在用户删除工作项前,插件可通过报错sdk,抛出标准错误,暂不支持修改参数。

Example

/backend/src/index.ts
interface DeleteIssueReq {
teamID: string
operatorID: string
issueID: string
}

export async function DeleteTaskPreFunc(
request: PluginRequest<DeleteIssueReq>,
): Promise<PluginResponse> {
Logger.info(request.body.teamID)
Logger.info(request.body.operatorID)
Logger.info(request.body.issueID)
// 结果/错误返回
return {
body: request.body,
}
}

前置方法参数说明

字段描述类型
teamID团队ID字符串
operatorID操作者ID字符串
issueID待删除工作项ID字符串

变更父工作项 updateIssuesParent

ONES v6.0.84+,v6.1.61+

描述 支持插件劫持变更(批量)父工作项流程,目前只支持前置劫持,即在用户变更父工作项前,插件可通过报错sdk,抛出标准错误,暂不支持修改参数。

Example

/backend/src/index.ts
interface UpdateIssuesParentReq {
teamID: string
operatorID: string
issues: IssueParentReq[]
}

interface IssueParentReq {
issueID: string
parentIssueID: string
}

export async function UpdateIssuesParentPreFunc(
request: PluginRequest<UpdateIssuesParentReq>,
): Promise<PluginResponse> {
const param = request.body
// 结果/错误返回
Logger.info(param.teamID)
Logger.info(param.operatorID)
return {
body: param,
}
}

前置方法参数说明

字段描述类型
teamID团队ID字符串
operatorID操作者ID字符串
issues子工作项结构对象数组

issues 说明:

字段描述类型
issueID子工作项 ID字符串
parentIssueID变更为该父工作项字符串

更新工作项类型 updateIssuesType

ONES v6.0.84+,v6.1.61+

描述 支持插件劫持更新(标准/子工作项)工作项类型流程,目前只支持前置劫持,即在用户更新工作项类型前,插件可通过报错sdk,抛出标准错误,暂不支持修改参数。

Example

/backend/src/index.ts
interface UpdateIssuesTypeReq {
teamID: string
operatorID: string
action: string[]
issues: UpdateIssuesPayload[]
}

interface UpdateIssuesPayload {
issueID: string
parentIssueID: string
projectID: string
oldIssueTypeID: string
newIssueTypeID: string
subIssueTypeID: string
status: UpdateIssuesStatus
fieldValues: FieldRawValue[]
}

interface UpdateIssuesStatus {
oldStatusID: string
newStatusID: string
}

interface FieldRawValue {
fieldID: string
value: any
}

export async function UpdateIssuesTypePreFunc(
request: PluginRequest<UpdateIssuesTypeReq>,
): Promise<PluginResponse> {
const param = request.body
// 结果/错误返回
Logger.info(param.teamID)
Logger.info(param.operatorID)
return {
body: param,
}
}

前置方法参数说明

字段描述类型
teamID团队ID字符串
operatorID操作者ID字符串
actionmodify_issue_type:变更工作项类型 std_to_sub_issue_type:转为子工作项 sub_to_std_issue_type:转为标准工作项 std_to_sub_issue_type:变更子工作项类型 sub_to_sub_issue_type:变更子工作项类型字符串枚举
issues待更新的工作项结构对象数组

issues 说明:

字段描述类型
issueID工作项ID字符串
parentIssueID父工作项ID字符串
projectID所属项目ID字符串
oldIssueTypeID当前项目下工作项类型 ID字符串
newIssueTypeID工作项类型ID字符串
status状态对象数组
fieldValues属性值对象数组

status 说明:

字段描述类型
oldStatusID旧状态ID字符串
newStatusID新状态ID字符串

fieldValues 说明:

字段描述类型
fieldID属性ID字符串
value属性值任意类型