From fd51593dc035550618108e97a2f24cecc3eadc2e Mon Sep 17 00:00:00 2001 From: shiziyuan9527 Date: Thu, 10 Mar 2022 10:55:22 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E9=A1=B9=E7=9B=AE=E8=AE=BE=E7=BD=AE):?= =?UTF-8?q?=20=E6=A3=80=E6=9F=A5=E4=B8=89=E6=96=B9=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=85=B3=E8=81=94=E9=A1=B9=E7=9B=AE=E6=9C=89=E6=95=88=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1010673 --user=李玉号 【项目设置】-zentao/tapd 编辑项目 写入无效的项目id ,进入缺陷管理,创建缺陷会报错 https://www.tapd.cn/55049933/s/1115973 --- .../controller/ProjectController.java | 5 +++ .../metersphere/service/ProjectService.java | 34 +++++++++++++++++++ .../track/issue/AbstractIssuePlatform.java | 5 +++ .../track/issue/IssuesPlatform.java | 7 ++++ .../metersphere/track/issue/JiraPlatform.java | 19 ++++++++++- .../metersphere/track/issue/TapdPlatform.java | 9 +++++ .../track/issue/ZentaoPlatform.java | 5 +++ .../track/issue/client/TapdClient.java | 7 ++++ .../track/issue/client/ZentaoClient.java | 15 ++++++++ .../track/issue/client/ZentaoGetClient.java | 2 ++ .../issue/client/ZentaoPathInfoClient.java | 2 ++ .../track/issue/domain/zentao/RequestUrl.java | 1 + .../resources/i18n/messages_en_US.properties | 1 + .../resources/i18n/messages_zh_CN.properties | 1 + .../resources/i18n/messages_zh_TW.properties | 1 + .../components/project/menu/EditProject.vue | 22 ++++++++++-- .../menu/components/ProjectJiraConfig.vue | 1 + frontend/src/i18n/en-US.js | 4 ++- frontend/src/i18n/zh-CN.js | 4 ++- frontend/src/i18n/zh-TW.js | 4 ++- 20 files changed, 143 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/io/metersphere/controller/ProjectController.java b/backend/src/main/java/io/metersphere/controller/ProjectController.java index c9df5d3e0e..88abb511b5 100644 --- a/backend/src/main/java/io/metersphere/controller/ProjectController.java +++ b/backend/src/main/java/io/metersphere/controller/ProjectController.java @@ -152,4 +152,9 @@ public class ProjectController { public boolean isVersionEnable(@PathVariable String projectId) { return projectService.isVersionEnable(projectId); } + + @PostMapping("/check/third/project") + public void checkThirdProjectExist(@RequestBody Project project) { + projectService.checkThirdProjectExist(project); + } } diff --git a/backend/src/main/java/io/metersphere/service/ProjectService.java b/backend/src/main/java/io/metersphere/service/ProjectService.java index 446adc162a..b4bb2d242f 100644 --- a/backend/src/main/java/io/metersphere/service/ProjectService.java +++ b/backend/src/main/java/io/metersphere/service/ProjectService.java @@ -36,6 +36,11 @@ import io.metersphere.performance.request.DeleteTestPlanRequest; import io.metersphere.performance.request.QueryProjectFileRequest; import io.metersphere.performance.service.PerformanceReportService; import io.metersphere.performance.service.PerformanceTestService; +import io.metersphere.track.issue.AbstractIssuePlatform; +import io.metersphere.track.issue.JiraPlatform; +import io.metersphere.track.issue.TapdPlatform; +import io.metersphere.track.issue.ZentaoPlatform; +import io.metersphere.track.request.testcase.IssuesRequest; import io.metersphere.track.service.TestCaseService; import io.metersphere.track.service.TestPlanProjectService; import io.metersphere.track.service.TestPlanReportService; @@ -188,6 +193,35 @@ public class ProjectService { return project; } + public void checkThirdProjectExist(Project project) { + IssuesRequest issuesRequest = new IssuesRequest(); + if (StringUtils.isBlank(project.getId())) { + MSException.throwException("project ID cannot be empty"); + } + issuesRequest.setProjectId(project.getId()); + issuesRequest.setWorkspaceId(project.getWorkspaceId()); + if (StringUtils.equalsIgnoreCase(project.getPlatform(), IssuesManagePlatform.Tapd.name())) { + TapdPlatform tapd = new TapdPlatform(issuesRequest); + this.doCheckThirdProjectExist(tapd, project.getTapdId()); + } else if (StringUtils.equalsIgnoreCase(project.getPlatform(), IssuesManagePlatform.Jira.name())) { + JiraPlatform jira = new JiraPlatform(issuesRequest); + this.doCheckThirdProjectExist(jira, project.getJiraKey()); + } else if (StringUtils.equalsIgnoreCase(project.getPlatform(), IssuesManagePlatform.Zentao.name())) { + ZentaoPlatform zentao = new ZentaoPlatform(issuesRequest); + this.doCheckThirdProjectExist(zentao, project.getZentaoId()); + } + } + + private void doCheckThirdProjectExist(AbstractIssuePlatform platform, String relateId) { + if (StringUtils.isBlank(relateId)) { + MSException.throwException(Translator.get("issue_project_not_exist")); + } + Boolean exist = platform.checkProjectExist(relateId); + if (BooleanUtils.isFalse(exist)) { + MSException.throwException(Translator.get("issue_project_not_exist")); + } + } + private String genSystemId() { String maxSystemIdInDb = extProjectMapper.getMaxSystemId(); String systemId = "10001"; diff --git a/backend/src/main/java/io/metersphere/track/issue/AbstractIssuePlatform.java b/backend/src/main/java/io/metersphere/track/issue/AbstractIssuePlatform.java index 282aba12a7..2dab21ace5 100644 --- a/backend/src/main/java/io/metersphere/track/issue/AbstractIssuePlatform.java +++ b/backend/src/main/java/io/metersphere/track/issue/AbstractIssuePlatform.java @@ -522,4 +522,9 @@ public abstract class AbstractIssuePlatform implements IssuesPlatform { } return false; } + + @Override + public Boolean checkProjectExist(String relateId) { + return null; + } } diff --git a/backend/src/main/java/io/metersphere/track/issue/IssuesPlatform.java b/backend/src/main/java/io/metersphere/track/issue/IssuesPlatform.java index e25202161f..c2e540a8be 100644 --- a/backend/src/main/java/io/metersphere/track/issue/IssuesPlatform.java +++ b/backend/src/main/java/io/metersphere/track/issue/IssuesPlatform.java @@ -78,4 +78,11 @@ public interface IssuesPlatform { * @return */ IssueTemplateDao getThirdPartTemplate(); + + /** + * 检查其它平台关联的ID是否存在 + * @param relateId 其它平台在MS项目上关联的相关ID + * @return Boolean + */ + Boolean checkProjectExist(String relateId); } diff --git a/backend/src/main/java/io/metersphere/track/issue/JiraPlatform.java b/backend/src/main/java/io/metersphere/track/issue/JiraPlatform.java index a1857073c1..a6cc967fc5 100644 --- a/backend/src/main/java/io/metersphere/track/issue/JiraPlatform.java +++ b/backend/src/main/java/io/metersphere/track/issue/JiraPlatform.java @@ -133,7 +133,11 @@ public class JiraPlatform extends AbstractIssuePlatform { } public List getIssueTypes(String jiraKey) { - return jiraClientV2.getIssueType(jiraKey); + try { + return jiraClientV2.getIssueType(jiraKey); + } catch (Exception e) { + return null; + } } @Override @@ -648,4 +652,17 @@ public class JiraPlatform extends AbstractIssuePlatform { }); return options.toJSONString(); } + + @Override + public Boolean checkProjectExist(String relateId) { + try { + JiraIssueProject project = jiraClientV2.getProject(relateId); + if (project != null && StringUtils.isNotBlank(project.getId())) { + return true; + } + } catch (Exception e) { + return false; + } + return false; + } } diff --git a/backend/src/main/java/io/metersphere/track/issue/TapdPlatform.java b/backend/src/main/java/io/metersphere/track/issue/TapdPlatform.java index eaf8f82c37..341fb5eb72 100644 --- a/backend/src/main/java/io/metersphere/track/issue/TapdPlatform.java +++ b/backend/src/main/java/io/metersphere/track/issue/TapdPlatform.java @@ -264,4 +264,13 @@ public class TapdPlatform extends AbstractIssuePlatform { } return null; } + + @Override + public Boolean checkProjectExist(String relateId) { + try { + return tapdClient.checkProjectExist(relateId); + } catch (Exception e) { + return false; + } + } } diff --git a/backend/src/main/java/io/metersphere/track/issue/ZentaoPlatform.java b/backend/src/main/java/io/metersphere/track/issue/ZentaoPlatform.java index db9e147123..bf54d1b6ca 100644 --- a/backend/src/main/java/io/metersphere/track/issue/ZentaoPlatform.java +++ b/backend/src/main/java/io/metersphere/track/issue/ZentaoPlatform.java @@ -409,4 +409,9 @@ public class ZentaoPlatform extends AbstractIssuePlatform { String imgRegex = ""; return ztDescription.replaceAll(imgRegex, ""); } + + @Override + public Boolean checkProjectExist(String relateId) { + return zentaoClient.checkProjectExist(relateId); + } } diff --git a/backend/src/main/java/io/metersphere/track/issue/client/TapdClient.java b/backend/src/main/java/io/metersphere/track/issue/client/TapdClient.java index 85635bf7d2..cd4a0e167b 100644 --- a/backend/src/main/java/io/metersphere/track/issue/client/TapdClient.java +++ b/backend/src/main/java/io/metersphere/track/issue/client/TapdClient.java @@ -117,4 +117,11 @@ public class TapdClient extends BaseClient { USER_NAME = config.getAccount(); PASSWD = config.getPassword(); } + + public boolean checkProjectExist(String relateId) { + String url = getBaseUrl() + "/roles?workspace_id={1}"; + ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, getAuthHttpEntity(), String.class, relateId); + TapdGetIssueResponse res = (TapdGetIssueResponse) getResultForObject(TapdGetIssueResponse.class, response); + return res == null || res.getStatus() != 404; + } } diff --git a/backend/src/main/java/io/metersphere/track/issue/client/ZentaoClient.java b/backend/src/main/java/io/metersphere/track/issue/client/ZentaoClient.java index a0723bf845..e93355d299 100644 --- a/backend/src/main/java/io/metersphere/track/issue/client/ZentaoClient.java +++ b/backend/src/main/java/io/metersphere/track/issue/client/ZentaoClient.java @@ -188,4 +188,19 @@ public abstract class ZentaoClient extends BaseClient { } return String.format(replaceImgUrl, suffix); } + + public boolean checkProjectExist(String relateId) { + String sessionId = login(); + ResponseEntity response = restTemplate.exchange(requestUrl.getProductGet(), + HttpMethod.GET, null, String.class, relateId, sessionId); + try { + Object data = JSONObject.parseObject(response.getBody()).get("data"); + if (!StringUtils.equals((String) data, "false")) { + return true; + } + } catch (Exception e) { + LogUtil.info("query zentao product info error. product id: " + relateId); + } + return false; + } } diff --git a/backend/src/main/java/io/metersphere/track/issue/client/ZentaoGetClient.java b/backend/src/main/java/io/metersphere/track/issue/client/ZentaoGetClient.java index d77b9f47a3..00325c81f7 100644 --- a/backend/src/main/java/io/metersphere/track/issue/client/ZentaoGetClient.java +++ b/backend/src/main/java/io/metersphere/track/issue/client/ZentaoGetClient.java @@ -19,6 +19,7 @@ public class ZentaoGetClient extends ZentaoClient { private static final String CREATE_META_DATA="?m=bug&f=create&productID={0}&t=json&zentaosid={1}"; private static final String REPLACE_IMG_URL=""; private static final Pattern IMG_PATTERN = Pattern.compile("m=file&f=read&fileID=(.*?)\"/>"); + private static final String PRODUCT_GET = "&module=product&methodName=getById¶ms=productID={0}&zentaosid={1}"; // 注意 recTotal={1}&recPerPage={2}&pageID={3} 顺序不能调换,有点恶心 private static final String BUG_LIST_URL = "/?m=bug&f=browse&productID={0}&branch=&browseType=¶m=0&orderBy=&recTotal={1}&recPerPage={2}&pageID={3}&t=json&zentaosid={4}"; @@ -43,6 +44,7 @@ public class ZentaoGetClient extends ZentaoClient { request.setBugDelete(getNotSuperModelUrl(BUG_DELETE)); request.setBugList(getNotSuperModelUrl(BUG_LIST_URL)); request.setCreateMetaData(getNotSuperModelUrl(CREATE_META_DATA)); + request.setProductGet(getUrl(PRODUCT_GET)); requestUrl = request; } diff --git a/backend/src/main/java/io/metersphere/track/issue/client/ZentaoPathInfoClient.java b/backend/src/main/java/io/metersphere/track/issue/client/ZentaoPathInfoClient.java index 431ed4afc6..66c34a5ee8 100644 --- a/backend/src/main/java/io/metersphere/track/issue/client/ZentaoPathInfoClient.java +++ b/backend/src/main/java/io/metersphere/track/issue/client/ZentaoPathInfoClient.java @@ -20,6 +20,7 @@ public class ZentaoPathInfoClient extends ZentaoClient { private static final String FILE_UPLOAD = "/api-getModel-file-saveUpload.json?zentaosid="; private static final String REPLACE_IMG_URL = ""; private static final Pattern IMG_PATTERN = Pattern.compile("file-read-(.*?)\"/>"); + private static final String PRODUCT_GET = "/api-getModel-product-getById-productID={0}?zentaosid={1}"; private static final String BUG_LIST_URL = "/bug-browse-{1}---0--{2}-{3}-{4}.json?zentaosid={5}"; @@ -44,6 +45,7 @@ public class ZentaoPathInfoClient extends ZentaoClient { request.setBugDelete(getUrl(BUG_DELETE)); request.setBugList(getUrl(BUG_LIST_URL)); request.setCreateMetaData(getUrl(CREATE_META_DATA)); + request.setProductGet(getUrl(PRODUCT_GET)); requestUrl = request; } diff --git a/backend/src/main/java/io/metersphere/track/issue/domain/zentao/RequestUrl.java b/backend/src/main/java/io/metersphere/track/issue/domain/zentao/RequestUrl.java index 4124fb02a3..2e42db14dc 100644 --- a/backend/src/main/java/io/metersphere/track/issue/domain/zentao/RequestUrl.java +++ b/backend/src/main/java/io/metersphere/track/issue/domain/zentao/RequestUrl.java @@ -21,5 +21,6 @@ public class RequestUrl { private String buildsGet; private String fileUpload; private String replaceImgUrl; + private String productGet; private Pattern imgPattern; } diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index 3e5194965a..bee024047e 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -163,6 +163,7 @@ id_required=ID required id_repeat_in_table=ID is repeat in table step_model_tip=Step description fill in STEP, text description please fill in TEXT (not required) case_status_not_exist=The use case status must be Prepare, Underway way and Completed +issue_project_not_exist=ID does not exist or other errors #ldap ldap_url_is_null=LDAP address is empty ldap_dn_is_null=LDAP binding DN is empty diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index c4b64bf5e2..9b123d98e4 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -163,6 +163,7 @@ id_required=ID必填 id_repeat_in_table=表格内ID重复 step_model_tip=步骤描述填写 STEP,文本描述请填写 TEXT (非必填) case_status_not_exist=用例状态必须为未开始(Prepare)、进行中(Underway)、已完成(Completed) +issue_project_not_exist=ID不存在或其它错误 #ldap ldap_url_is_null=LDAP地址为空 ldap_dn_is_null=LDAP绑定DN为空 diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index 8fd5bcea91..315b650a2e 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -163,6 +163,7 @@ id_required=ID必填 id_repeat_in_table=表格內ID重復 step_model_tip=步驟描述填寫 STEP,文本描述請填寫 TEXT (非必填) case_status_not_exist=用例狀態必須為未開始(Prepare)、進行中(Underway)、已完成(Completed) +issue_project_not_exist=ID不存在或其它錯誤 #ldap ldap_url_is_null=LDAP地址為空 ldap_dn_is_null=LDAP綁定DN為空 diff --git a/frontend/src/business/components/project/menu/EditProject.vue b/frontend/src/business/components/project/menu/EditProject.vue index 8462441d66..43ce64cb48 100644 --- a/frontend/src/business/components/project/menu/EditProject.vue +++ b/frontend/src/business/components/project/menu/EditProject.vue @@ -39,12 +39,17 @@ + {{ $t('test_track.issue.check_id_exist') }} - - + + + + {{ $t('test_track.issue.check_id_exist') }}