From 3c54a4671cf489fd2c32e24685338bc3590e8d4b Mon Sep 17 00:00:00 2001 From: minhee <alsdldlfrl@gmail.com> Date: 화, 15 3월 2022 17:34:41 +0900 Subject: [PATCH] - api로 이슈 추가 시 사용자정의필드 타입으로 체크 => 정규식표현검사로 체크로 변경 --- src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java | 290 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 235 insertions(+), 55 deletions(-) diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java index 97b799f..0c6dee8 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java @@ -48,6 +48,7 @@ import java.io.IOException; import java.text.ParseException; import java.util.*; +import java.util.regex.Pattern; import static kr.wisestone.owl.domain.enumType.CustomFieldType.*; @@ -310,7 +311,7 @@ } // 以묐났�맂 �긽�쐞 �씠�뒋寃��깋 - List<Issue> issues = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId()); + List<Issue> issues = this.findIssue(issueApiForm, issueForm, customFieldApiOverlaps, user.getId()); int size = issues.size(); if (size > 0) { Issue targetIssue = issues.get(0); @@ -327,7 +328,6 @@ // �궗�슜�옄 �젙�쓽 �븘�뱶 �꽕�젙 issueForm.setIssueCustomFields(issueApiForm.getCustomFieldValues()); // 媛숈� �룄硫붿씤 �뾽泥� 李얘린 - this.findCompanyField(issueForm); // api �엯�젰媛� �쟻�슜 ConvertUtil.copyProperties(issueApiForm, issueForm); @@ -339,10 +339,15 @@ } } + /** + * �룄硫붿씤�씠 �룞�씪�븳 �뾽泥� 李얘린 + * @param issueForm IssueForm + * @return IssueForm + */ private IssueForm findCompanyField(IssueForm issueForm) { if(issueForm.getIssueCustomFields() != null && issueForm.getIssueCustomFields().size() > 0) { CompanyFieldCondition condition = new CompanyFieldCondition(); - List<Map<String, Object>> companyFields = this.companyFieldService.find(condition); + List<Map<String, Object>> companyFields = Lists.newArrayList(); List<Map<String, Object>> issueCompanyFields = Lists.newArrayList(); List<Map<String, Object>> issueIspFields = Lists.newArrayList(); List<Map<String, Object>> issueHostingFields = Lists.newArrayList(); @@ -350,27 +355,36 @@ for (Map<String, Object> issueCustomField : issueForm.getIssueCustomFields()) { Long customFieldId = MapUtil.getLong(issueCustomField, "customFieldId"); CustomField customField = this.customFieldService.getCustomField(customFieldId); - if(customField != null && customField.getCustomFieldType().toString().equals("SITE") && customField.getName().equals("�룄硫붿씤")) { + if(customField != null && customField.getCustomFieldType().equals(SITE) && customField.getName().equals("�룄硫붿씤")) { String useValue = issueCustomField.get("useValue").toString(); + String[] urlArr = null; + List<String> urls = Lists.newArrayList(); + if (useValue.contains(",")) { + urlArr = useValue.split(","); + urls.addAll(Arrays.asList(urlArr)); + } else { + urls.add(useValue); + } + condition.setUrls(urls); + companyFields = this.companyFieldService.find(condition); + if(companyFields != null && companyFields.size() > 0) { for (Map<String, Object> companyField : companyFields) { CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class); - if(companyFieldVo.getUrl() != null && useValue.equals(companyFieldVo.getUrl())) { - companyField.put("companyId", companyField.get("id")); - issueCompanyFields.add(companyField); - if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) { - Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId()); - if (ispField != null) { - ispField.put("ispId", ispField.get("id")); - issueIspFields.add(ispField); - } + companyField.put("companyId", companyField.get("id")); + issueCompanyFields.add(companyField); + if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) { + Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId()); + if (ispField != null) { + ispField.put("ispId", ispField.get("id")); + issueIspFields.add(ispField); } - if(companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) { - Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId()); - if (hostingField != null) { - hostingField.put("hostingId", hostingField.get("id")); - issueHostingFields.add(hostingField); - } + } + if(companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) { + Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId()); + if (hostingField != null) { + hostingField.put("hostingId", hostingField.get("id")); + issueHostingFields.add(hostingField); } } } @@ -383,6 +397,41 @@ } return issueForm; + } + + /** + * 議곌굔�뿉 留욌뒗 �뙆�듃�꼫 �젙蹂� 李얘린 + * @param condition CompanyFieldCondition + * @param issueCompanyFields List<Map<String, Object>> + * @param issueIspFields List<Map<String, Object>> + * @param issueHostingFields List<Map<String, Object>> + */ + private void findPartner(CompanyFieldCondition condition, List<Map<String, Object>> issueCompanyFields + , List<Map<String, Object>> issueIspFields, List<Map<String, Object>> issueHostingFields) { + + List<Map<String, Object>> companyFields = this.companyFieldService.find(condition); + + if(companyFields != null && companyFields.size() > 0) { + for (Map<String, Object> companyField : companyFields) { + CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class); + companyField.put("companyId", companyField.get("id")); + issueCompanyFields.add(companyField); + if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) { + Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId()); + if (ispField != null) { + ispField.put("ispId", ispField.get("id")); + issueIspFields.add(ispField); + } + } + if(companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) { + Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId()); + if (hostingField != null) { + hostingField.put("hostingId", hostingField.get("id")); + issueHostingFields.add(hostingField); + } + } + } + } } private User convertToUser(String token) { @@ -411,10 +460,12 @@ // 媛��긽 �긽�쐞 �씠�뒋 異붽� parentIssueForm.setUseIssueCustomFields(issueApiForm.getUseIssueCustomFieldIds()); // 媛숈� �룄硫붿씤 �뾽泥� 李얘린 - IssueForm partners = this.findCompanyField(parentIssueForm); - parentIssueForm.setIssueCompanyFields(partners.getIssueCompanyFields()); - parentIssueForm.setIssueIspFields(partners.getIssueIspFields()); - parentIssueForm.setIssueHostingFields(partners.getIssueHostingFields()); + if (parentIssueForm.getIssueCompanyFields() == null) { + IssueForm partners = this.findCompanyField(parentIssueForm); + parentIssueForm.setIssueCompanyFields(partners.getIssueCompanyFields()); + parentIssueForm.setIssueIspFields(partners.getIssueIspFields()); + parentIssueForm.setIssueHostingFields(partners.getIssueHostingFields()); + } Issue issue = addIssue(user, parentIssueForm, null); issues.add(issue); @@ -435,24 +486,113 @@ return null; } + /** + * url �젙洹쒖떇 �몴�쁽 + * @param url String + */ + private boolean verifyUrl(String url) { + boolean urlChk = false; + if (!StringUtils.isEmpty(url)) { + String reg = "^((http|https)://)?(www.)?([a-zA-Z0-9]+)\\.[a-z]+([a-zA-z0-9.?#]+)?"; + if(Pattern.matches(reg, url)) { + urlChk = true; + } + } + return urlChk; + } + + /** + * ip �젙洹쒖떇 �몴�쁽 + * @param ip String + * @return boolean + */ + private boolean verifyIp(String ip) { + boolean ipChk = false; + if (!StringUtils.isEmpty(ip)) { + if (Pattern.matches("^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\" + + ".(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", ip)) { + ipChk = true; + } + } + + return ipChk; + } + // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋 - private List<Issue> findIssue(IssueApiForm issueApiform, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) { + private List<Issue> findIssue(IssueApiForm issueApiform, IssueForm issueForm, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) { List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues(); List<Issue> resultIssueVos = Lists.newArrayList(); String comma = ","; if (issueCustomFieldValueForms.size() > 0) { String concatUseValue = ""; + String customFieldType = ""; int useIdx = 0; + int cntIp = 0; + int cntSite = 0; IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator(); Collections.sort(issueCustomFieldValueForms, comp); List<String> userValues = Lists.newArrayList(); + CompanyFieldCondition condition = new CompanyFieldCondition(); + List<Map<String, Object>> issueCompanyFields = Lists.newArrayList(); + List<Map<String, Object>> issueIspFields = Lists.newArrayList(); + List<Map<String, Object>> issueHostingFields = Lists.newArrayList(); + for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) { userValues.add(issueCustomFieldValueForm.getUseValue()); + for(CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) { if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) { + + String useValue = issueCustomFieldValueForm.getUseValue(); + if (useValue.contains(" ")) { + useValue = useValue.replace(" ",""); + } + + if (this.verifyIp(useValue)) { + long ip = ConvertUtil.ipToLong(useValue); + customFieldType = IP_ADDRESS.toString(); + if (cntIp == 0){ + condition.setIp(ip); + } + cntIp ++; + } + + if (this.verifyUrl(useValue)) { + customFieldType = SITE.toString(); + if (cntSite == 0) { + condition.setUrl(useValue); + } + cntSite ++; + } + + /*if (customFieldApiOverlap.getCustomField().getCustomFieldType().equals(IP_ADDRESS)) { + long ip = ConvertUtil.ipToLong(useValue); + customFieldType = IP_ADDRESS.toString(); + if (cntIp == 0){ + condition.setIp(ip); + } + cntIp ++; + }*/ + + /*if(customFieldApiOverlap.getCustomField().getCustomFieldType().equals(SITE)) { + customFieldType = SITE.toString(); + String[] urlArr = null; + List<String> urls = Lists.newArrayList(); + if (useValue.contains(",")) { + urlArr = useValue.split(","); + urls.addAll(Arrays.asList(urlArr)); + } else { + urls.add(useValue); + } + if (cntSite == 0) { + condition.setUrl(urls); + } + cntSite ++; + }*/ + if (useIdx > 0) { concatUseValue = concatUseValue.concat(comma); } @@ -462,12 +602,42 @@ } } + // 異붽� �븷 url or ip�뿉 �룷�븿�릺�뼱�엳�뒗 �뙆�듃�꼫 李얘린 + if ((condition.getIp() > 0) || (condition.getUrl() != null && !condition.getUrl().equals(""))) { + this.findPartner(condition, issueCompanyFields, issueIspFields, issueHostingFields); + } + + issueForm.setIssueCompanyFields(issueCompanyFields); + issueForm.setIssueIspFields(issueIspFields); + issueForm.setIssueHostingFields(issueHostingFields); + IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition(); issueCustomFieldValueCondition.setUseValue(concatUseValue); issueCustomFieldValueCondition.setUseValues(userValues); issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId()); + issueCustomFieldValueCondition.setCustomFieldType(customFieldType); // issueCustomFieldValueCondition.setIssueStatusType("CLOSE"); - List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition); + List<Map<String, Object>> results = Lists.newArrayList(); + if (customFieldType.equals(IP_ADDRESS.toString()) && issueForm.getIssueCompanyFields() != null && issueForm.getIssueCompanyFields().size() > 0) { + long ipValue = 0; + if (concatUseValue.contains(",")) { + String[] arr = concatUseValue.split(","); + for (String str : arr) { + ipValue = ConvertUtil.ipToLong(str); + } + } else { + ipValue = ConvertUtil.ipToLong(concatUseValue); + } + issueCustomFieldValueCondition.setUseValue(String.valueOf(ipValue)); + } + + if (issueCustomFieldValueCondition.getCustomFieldType() != null && !issueCustomFieldValueCondition.getCustomFieldType().equals("")) { + // �궗�슜�옄�젙�쓽�븘�뱶 ���엯�씠 IP_ADDRESS �삉�뒗 SITE �씪 寃쎌슦 + results = this.issueMapper.findByCustomFieldValueByCompany(issueCustomFieldValueCondition); + } else { + results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition); + } + if (results != null && results.size() > 0) { for (Map<String, Object> result : results) { resultIssueVos.add(this.getIssue(MapUtil.getLong(result, "id"))); @@ -534,6 +704,16 @@ issue = this.issueRepository.saveAndFlush(issue); issue.setReverseIndex(issue.getId() * -1); // 荑쇰━ �냽�룄 媛쒖꽑�쓣 �쐞�빐 由щ쾭�뒪 �씤�뜳�뒪 �깮�꽦 + + if (issueForm.getParentIssueId() != null){ + Issue parentIssue = this.getIssue(issueForm.getParentIssueId()); + if (issueForm.getIsApi().equals(Issue.IS_API_YES) + || (issueForm.getInheritYn() != null && issueForm.getInheritYn())) { + // �븯�쐞�씠�뒋�뿉 �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �쟻�슜 + this.inheritPartners(issue, parentIssue); + } + } + // �떞�떦�옄 吏��젙 //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds()); // �떞�떦遺��꽌 吏��젙 @@ -544,15 +724,6 @@ this.issueIspService.modifyIssueIspField(issue, issueForm, detectIssueChange); // HOSTING �젙蹂� ���옣 this.issueHostingService.modifyIssueHostingField(issue, issueForm, detectIssueChange); - - if (issueForm.getParentIssueId() != null){ - Issue parentIssue = this.getIssue(issueForm.getParentIssueId()); - if (issueForm.getIsApi().equals(Issue.IS_API_YES) - || (issueForm.getInheritYn() != null && issueForm.getInheritYn())) { - // �븯�쐞�씠�뒋�뿉 �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �쟻�슜 - this.inheritPartners(issue, parentIssue); - } - } // 泥⑤� �뙆�씪 ���옣 // multipartFile �쓣 file Map List 媛앹껜濡� 蹂�寃쏀븳�떎. @@ -1577,11 +1748,14 @@ this.setAttachedFiles(issue, issueVo); // 泥⑤� �뙆�씪 �젙蹂� �뀑�똿 this.setIssueCustomFields(issue, issueVo); // �궗�슜�옄 �젙�쓽 �븘�뱶 媛� �젙蹂� �뀑�똿 this.setRelationIssue(issue, issueVo); //�뿰愿� �씪媛� �뀑�똿 - this.setDownIssues(issue, issueVo); //�븯�쐞 �씠�뒋 �꽭�똿 + this.setDownIssues(issue, issueVo, issueCondition.getHideCompleteIssue()); //�븯�쐞 �씠�뒋 �꽭�똿 break; case "02": // �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭, �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂�, �뙎湲�, 湲곕줉�쓣 �뀑�똿�븳�떎. - this.setIssueDetail(issueVo, issue, user); // �씠�뒋 �긽�꽭 �젙蹂대�� �뀑�똿�븳�떎. + if (issueCondition.getHideCompleteIssue() == null) { + issueCondition.setHideCompleteIssue(true); + } + this.setIssueDetail(issueVo, issue, user, issueCondition.getHideCompleteIssue()); // �씠�뒋 �긽�꽭 �젙蹂대�� �뀑�똿�븳�떎. this.setIssueTableConfigs(issue, issueVo, issueCondition); issueVo.setProjectVo(ConvertUtil.copyProperties(issue.getProject(), ProjectVo.class)); break; @@ -1615,7 +1789,7 @@ // �븯�쐞 �씠�뒋 �젙蹂대�� �뀑�똿�븳�떎 - private void setDownIssues(Issue issue, IssueVo issueVo) { + private void setDownIssues(Issue issue, IssueVo issueVo, boolean hideCompleteIssue) { Page<Issue> downIssues = null; List<Issue> downIssueList = this.issueRepository.findByParentIssueId(issue.getId()); @@ -1625,7 +1799,13 @@ startPage = (int) Math.floor(issueVo.getDownPage()/issueVo.getDownPageSize()); } Pageable pageable = PageRequest.of(startPage, issueVo.getDownPageSize()); - downIssues = this.issueRepository.findByParentIssueId(issue.getId(), pageable); + + if(hideCompleteIssue){ + downIssues = this.issueRepository.findByParentIssueId(issue.getId(), IssueStatusType.CLOSE, pageable); + }else { + downIssues = this.issueRepository.findByParentIssueId(issue.getId(), pageable); + } + } if(downIssues != null){ issueVo.setDownTotalPage(downIssues.getTotalPages()); @@ -1663,6 +1843,12 @@ @Override @Transactional(readOnly = true) public void setIssueDetail(IssueVo issueVo, Issue issue, User user) { + setIssueDetail(issueVo, issue, user, false); + } + + @Override + @Transactional(readOnly = true) + public void setIssueDetail(IssueVo issueVo, Issue issue, User user, boolean hideCompleteIssue) { // �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤 if (this.checkHasPermission(issueVo, issueVo.getUserVos(), user, issueVo.getDepartmentVos())) { issueVo.setModifyPermissionCheck(Boolean.TRUE); @@ -1681,7 +1867,7 @@ this.setAttachedFiles(issue, issueVo); // 泥⑤� �뙆�씪 �젙蹂� �뀑�똿 this.setIssueCustomFields(issue, issueVo); // �궗�슜�옄 �젙�쓽 �븘�뱶 媛� �젙蹂� �뀑�똿 this.setRelationIssue(issue, issueVo); //�뿰愿� �씪媛� �뀑�똿 - this.setDownIssues(issue, issueVo); //�븯�쐞 �씪媛� �꽭�똿 + this.setDownIssues(issue, issueVo, hideCompleteIssue); //�븯�쐞 �씪媛� �꽭�똿 this.setIssueComments(issue, issueVo); // �뙎湲� �젙蹂� �뀑�똿 this.setIssueHistory(issue, issueVo); // �씠�뒋 湲곕줉 �젙蹂� �뀑�똿 @@ -2601,21 +2787,24 @@ this.messageAccessor.getMessage(MsgConstants.ISSUE_REMOVE_NOT_SELECT)); } - List<Issue> removeIssues = Lists.newArrayList(); + Set<Long> removeIds = new HashSet<>(); for (Long issueId : issueForm.getRemoveIds()) { + removeIds.add(issueId); //�븯�쐞�씠�뒋 泥댄겕 List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId); if(downIssues != null && downIssues.size() > 0){ for(Issue downIssue : downIssues){ Long downIssueId = downIssue.getId(); - downIssue = this.issueRemoves(downIssueId, user); - removeIssues.add(downIssue); + removeIds.add(downIssueId); } } - Issue issue = this.issueRemoves(issueId, user); - removeIssues.add(issue); } + + for (Long removeId : removeIds) { + this.issueRemoves(removeId, user); + } + // �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏� log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE)); } @@ -3209,22 +3398,13 @@ saveIssueForm.setId(issue.getId()); - IssueDepartment issueDepartment = new IssueDepartment(); - issueDepartment.setIssue(issue); - issueDepartment.setWorkspace(workspace); - - + // �썙�겕�뵆濡쒖슦 ��湲� �긽�깭�쓽 遺��꽌 異붽� List<Long> departmentsIds = this.workflowDepartmentService.findFirstDepartmentIds(workflow); if (departmentsIds != null && departmentsIds.size() > 0) { - for (Long departmentId : departmentsIds) { - issueDepartment.setDepartment(this.departmentService.getDepartment(departmentId)); - } - issue.addIssueDepartment(issueDepartment); + this.issueDepartmentService.add(departmentsIds, workspace, issue); } - this.setIssuePartners(saveIssueForm, issue); } - // 0.416 - 0.439 -- Gitblit v1.8.0