add platform plugin sdk

This commit is contained in:
AnAngle 2023-04-16 17:27:16 +08:00 committed by jianxing
parent 29ff912f9d
commit ea2e973e79
21 changed files with 589 additions and 0 deletions

View File

@ -0,0 +1,156 @@
package io.metersphere.plugin.platform.api;
import io.metersphere.plugin.platform.dto.*;
import java.util.List;
/**
* 平台对接相关业务
* @author jianxing.chen
*/
public interface Platform {
/**
* 获取平台相关需求
* 功能用例关联需求时调用
* @param projectConfig 项目设置表单值
* @return 需求列表
*/
List<DemandDTO> getDemands(String projectConfig);
/**
* 创建缺陷并封装 MS 返回
* 创建缺陷时调用
* @param issuesRequest issueRequest
* @return MS 缺陷
*/
MsIssueDTO addIssue(PlatformIssuesUpdateRequest issuesRequest);
/**
* 项目设置中选项从平台获取下拉框选项
* frontend.json 中选项值配置了 optionMethod 项目设置时调用
* @return 返回下拉列表
* 该接口后续版本将废弃替换为 getFormOptions
*/
@Deprecated
List<SelectOption> getProjectOptions(GetOptionRequest request);
/**
* 项目设置和缺陷表单中调用接口获取下拉框选项
* 配置文件的表单中选项值配置了 optionMethod 则调用获取表单的选项值
* @return 返回下拉列表
*/
List<SelectOption> getFormOptions(GetOptionRequest request);
/**
* 更新缺陷
* 编辑缺陷时调用
* @param request
* @return MS 缺陷
*/
MsIssueDTO updateIssue(PlatformIssuesUpdateRequest request);
/**
* 删除缺陷平台缺陷
* 删除缺陷时调用
* @param id 平台的缺陷 ID
*/
void deleteIssue(String id);
/**
* 校验服务集成配置
* 服务集成点击校验时调用
*/
void validateIntegrationConfig();
/**
* 校验项目配置
* 项目设置成点击校验项目 key 时调用
*/
void validateProjectConfig(String projectConfig);
/**
* 校验用户配置配置
* 用户信息校验第三方信息时调用
*/
void validateUserConfig(String userConfig);
/**
* 支持附件上传
* 编辑缺陷上传附件是会调用判断是否支持附件上传
* 如果支持会调用 syncIssuesAttachment 上传缺陷到第三方平台
*/
boolean isAttachmentUploadSupport();
/**
* 同步缺陷最新变更
* 开源用户点击同步缺陷时调用
*/
SyncIssuesResult syncIssues(SyncIssuesRequest request);
/**
* 同步项目下所有的缺陷
* 企业版用户会调用同步缺陷
*/
void syncAllIssues(SyncAllIssuesRequest request);
/**
* 获取附件内容
* 同步缺陷中同步附件时会调用
* @param fileKey 文件关键字
*/
byte[] getAttachmentContent(String fileKey);
/**
* 获取第三方平台缺陷的自定义字段
* 需要 PluginMetaInfo isThirdPartTemplateSupport 返回 true
* @return
*/
List<PlatformCustomFieldItemDTO> getThirdPartCustomField(String projectConfig);
/**
* Get请求的代理
* 目前使用场景富文本框中如果有图片是存储在第三方平台MS 通过 url 访问
* 这时如果第三方平台需要登入才能访问到静态资源可以通过将富文本框图片内容构造如下格式访问
* ![name](/resource/md/get/path?platform=Jira?project_id=&workspace_id=&path=)
* @param path
* @return
*/
Object proxyForGet(String path, Class responseEntityClazz);
/**
* 同步 MS 缺陷附件到第三方平台
* isAttachmentUploadSupport 返回为 true 同步和创建缺陷时会调用
*/
void syncIssuesAttachment(SyncIssuesAttachmentRequest request);
/**
* 获取第三方平台的状态列表
* 缺陷列表和编辑缺陷时会调用
* @return
*/
List<PlatformStatusDTO> getStatusList(String projectConfig);
/**
* 获取第三方平台的状态转移列表
* 即编辑缺陷时的可选状态
* 默认会调用 getStatusList可重写覆盖
* @param issueId
* @return
*/
List<PlatformStatusDTO> getTransitions(String projectConfig, String issueId);
/**
* 用例关联需求时调用
* 可在第三方平台添加用例和需求的关联关系
* @param request
*/
void handleDemandUpdate(DemandUpdateRequest request);
/**
* 用例批量关联需求时调用
* 可在第三方平台添加用例和需求的关联关系
* @param request
*/
void handleDemandUpdateBatch(DemandUpdateRequest request);
}

View File

@ -0,0 +1,46 @@
package io.metersphere.plugin.platform.api;
/**
* 插件的基本信息
* @author jianxing.chen
*/
public interface PluginMetaInfo {
/**
* 该插件是否是开源的
* 默认是
* @return
*/
boolean isXpack();
/**
* 返回插件的关键字
* @return
*/
String getKey();
/**
* 返回插件的名称
* @return
*/
String getLabel();
/**
* 返回前端渲染需要的数据
* 默认会返回 resources下的 json/frontend.json
* @return
*/
String getFrontendMetaData();
/**
* 返回插件的版本
* @return
*/
String getVersion();
/**
* 插件是否支持第三方模板
* @return
*/
boolean isThirdPartTemplateSupport();
}

View File

@ -0,0 +1,36 @@
package io.metersphere.plugin.platform.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class CustomFieldDTO implements Serializable {
private String id;
private String name;
private String scene;
private String type;
private String remark;
private Boolean system;
private Boolean global;
private Long createTime;
private Long updateTime;
private String createUser;
private String projectId;
private Boolean thirdPart;
private String options;
private static final long serialVersionUID = 1L;
}

View File

@ -0,0 +1,15 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Setter
@Getter
public class DemandDTO {
protected String id;
protected String name;
protected String platform;
protected List<? extends DemandDTO> children;
}

View File

@ -0,0 +1,28 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
public class DemandUpdateRequest {
/**
* 关联需求的用例信息
* getDemandId 可以获取关联的需求ID
* getOriginDemandId 可以获取修改前的需求ID
*/
private TestCaseDemandDTO testCase;
/**
* 批量关联需求时会使用
*/
private List<TestCaseDemandDTO> testCaseList;
/**
* 项目设置的配置项
*/
private String projectConfig;
}

View File

@ -0,0 +1,17 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class GetOptionRequest {
/**
* 项目设置的配置项
*/
private String projectConfig;
/**
* 对应插件中获取选项的方法名
*/
private String optionMethod;
}

View File

@ -0,0 +1,41 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class MsIssueDTO {
private String id;
private String title;
private String status;
private Long createTime;
private Long updateTime;
private String reporter;
private String lastmodify;
private String platform;
private String projectId;
private String creator;
private String resourceId;
private Integer num;
private String platformStatus;
private String platformId;
private String description;
private String customFields;
}

View File

@ -0,0 +1,11 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class PlatformAttachment {
private String fileName;
private String fileKey;
}

View File

@ -0,0 +1,12 @@
package io.metersphere.plugin.platform.dto;
import lombok.Data;
@Data
public class PlatformCustomFieldItemDTO extends CustomFieldDTO {
private Object value;
private String key;
private String customData;
private Boolean required;
private String defaultValue;
}

View File

@ -0,0 +1,14 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@Getter
@Setter
public class PlatformIssuesDTO extends MsIssueDTO {
private List<PlatformCustomFieldItemDTO> customFieldList;
private List<PlatformAttachment> attachments = new ArrayList<>();
}

View File

@ -0,0 +1,28 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.Set;
@Getter
@Setter
public class PlatformIssuesUpdateRequest extends PlatformIssuesDTO {
/**
* 用户信息的第三方平台的配置项
*/
private String userPlatformUserConfig;
/**
* 项目设置的配置项
*/
private String projectConfig;
/**
* 改缺陷关联的附件集合
*/
private Set<String> msAttachmentNames;
/**
* 第三方平台缺陷的状态
*/
private PlatformStatusDTO transitions;
}

View File

@ -0,0 +1,12 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class PlatformRequest {
private String integrationConfig;
private String workspaceId;
private String userPlatformInfo;
}

View File

@ -0,0 +1,11 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class PlatformStatusDTO {
protected String value;
protected String label;
}

View File

@ -0,0 +1,12 @@
package io.metersphere.plugin.platform.dto;
import lombok.Data;
import java.util.List;
@Data
public class PlatformUser {
private List<String> roleId;
private String name;
private String user;
}

View File

@ -0,0 +1,18 @@
package io.metersphere.plugin.platform.dto;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@EqualsAndHashCode
public class SelectOption {
public SelectOption(String text, String value) {
this.text = text;
this.value = value;
}
private String text;
private String value;
}

View File

@ -0,0 +1,31 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
@Setter
@Getter
public class SyncAllIssuesRequest extends SyncIssuesRequest {
/**
* 项目设置的配置项
*/
private String projectConfig;
/**
* 缺陷模板所关联的自定义字段
*/
private String defaultCustomFields;
/**
* 需要同步的缺陷列表
*/
private List<PlatformIssuesDTO> issues;
private boolean pre;
private Long createTime;
private Consumer<Map> handleSyncFunc;
}

View File

@ -0,0 +1,20 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Setter
@Getter
public class SyncAllIssuesResult extends SyncIssuesResult {
private List<MsIssueDTO> updateIssues = new ArrayList<>();
private Map<String, List<PlatformAttachment>> attachmentMap = new HashMap<>();
/**
* 保存当前查询到的缺陷的平台ID
*/
private List<String> allIds = new ArrayList<>();
}

View File

@ -0,0 +1,24 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
import java.io.File;
@Getter
@Setter
public class SyncIssuesAttachmentRequest {
/**
* 平台 ID
*/
private String platformId;
/**
* 需要同步的附件
*/
private File file;
/**
* 操作类型是更新还是删除
* 参考 AttachmentSyncType
*/
private String syncType;
}

View File

@ -0,0 +1,23 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Setter
@Getter
public class SyncIssuesRequest {
/**
* 项目设置的配置项
*/
private String projectConfig;
/**
* 缺陷模板所关联的自定义字段
*/
private String defaultCustomFields;
/**
* 需要同步的缺陷列表
*/
private List<PlatformIssuesDTO> issues;
}

View File

@ -0,0 +1,18 @@
package io.metersphere.plugin.platform.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Setter
@Getter
public class SyncIssuesResult {
private List<MsIssueDTO> updateIssues = new ArrayList<>();
private List<MsIssueDTO> addIssues = new ArrayList<>();
private Map<String, List<PlatformAttachment>> attachmentMap = new HashMap<>();
private List<String> deleteIssuesIds = new ArrayList<>();
}

View File

@ -0,0 +1,16 @@
package io.metersphere.plugin.platform.dto;
import io.metersphere.base.domain.TestCaseWithBLOBs;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class TestCaseDemandDTO extends TestCaseWithBLOBs {
/**
* 修改前的需求ID
* demandId 字段可获取修改后的ID
*/
private String originDemandId;
}