From c88104169bc4fe457f98f33a91574c4dd33da573 Mon Sep 17 00:00:00 2001
From: jhjang <jhjang@maprex.co.kr>
Date: 금, 03 12월 2021 20:08:01 +0900
Subject: [PATCH] - api 입력 오류 수정 - api 기본값 및 중복 설정 적용 수정

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java    |   67 ++++++++++++----
 src/main/java/kr/wisestone/owl/domain/Issue.java                     |    6 
 src/main/webapp/scripts/app/api/apiSetting.controller.js             |    8 +
 /dev/null                                                            |   36 ---------
 src/main/java/kr/wisestone/owl/service/impl/ApiTokenServiceImpl.java |    7 +
 src/main/java/kr/wisestone/owl/service/IssueService.java             |    4 
 src/main/java/kr/wisestone/owl/web/controller/ApiController.java     |   24 +++---
 src/main/webapp/views/api/apiSettingOverlap.html                     |    2 
 src/main/java/kr/wisestone/owl/web/form/IssueApiForm.java            |   29 ++++++
 src/main/resources/mybatis/query-template/issue-template.xml         |    9 +-
 src/main/java/kr/wisestone/owl/constant/MsgConstants.java            |    1 
 11 files changed, 113 insertions(+), 80 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
index 0f28bf6..1a53df4 100644
--- a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
+++ b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -233,5 +233,6 @@
 
     public static final String API_PARAMETER_ISSUE_TYPE_ERROR = "API_PARAMETER_ISSUE_TYPE_ERROR";     // api �뙆�씪誘명꽣 �삤瑜�(�씠�뒋���엯)
     public static final String API_PARAMETER_PROJECT_ERROR = "API_PARAMETER_PROJECT_ERROR";     // api �뙆�씪誘명꽣 �삤瑜�(�봽濡쒖젥�듃)
+    public static final String API_PARAMETER_ERROR = "API_PARAMETER_ERROR";     // api �뙆�씪誘명꽣 �삤瑜�
     public static final String API_USER_ERROR = "API_USER_ERROR";     // api �궗�슜�옄 �삤瑜�
 }
diff --git a/src/main/java/kr/wisestone/owl/domain/Issue.java b/src/main/java/kr/wisestone/owl/domain/Issue.java
index 119e58f..97a7656 100644
--- a/src/main/java/kr/wisestone/owl/domain/Issue.java
+++ b/src/main/java/kr/wisestone/owl/domain/Issue.java
@@ -340,11 +340,11 @@
         this.parentIssue = parentIssue;
     }
 
-    public String isApi() {
+    public String getIsApi() {
         return isApi;
     }
 
-    public void setApi(String api) {
-        isApi = api;
+    public void setIsApi(String isApi) {
+        this.isApi = isApi;
     }
 }
diff --git a/src/main/java/kr/wisestone/owl/service/IssueService.java b/src/main/java/kr/wisestone/owl/service/IssueService.java
index 5e900fa..ab36a30 100644
--- a/src/main/java/kr/wisestone/owl/service/IssueService.java
+++ b/src/main/java/kr/wisestone/owl/service/IssueService.java
@@ -28,7 +28,7 @@
     Issue addIssue(User user, IssueForm issueForm, List<MultipartFile> multipartFiles);
 
     Issue addApiIssue(IssueApiForm issueApiForm);
-
+    Issue modifyIssue(IssueApiForm issueApiForm, List<MultipartFile> files);
 
     List<IssueVo> findIssue(Map<String, Object> resJsonData,
                             IssueCondition condition, Pageable pageable);
@@ -43,6 +43,8 @@
 
     Issue modifyIssue(IssueForm issueForm, List<MultipartFile> files);
 
+    Issue modifyIssue(User user, IssueForm issueForm, List<MultipartFile> multipartFiles);
+
     void removeIssues(IssueForm issueForm);
 
     void modifyIssueStatus(IssueForm issueForm);
diff --git a/src/main/java/kr/wisestone/owl/service/impl/ApiTokenServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/ApiTokenServiceImpl.java
index a1a0bf9..aa0e2d9 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/ApiTokenServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/ApiTokenServiceImpl.java
@@ -95,7 +95,12 @@
 
         ObjectMapper objectMapper = new ObjectMapper();
         //諛섑솚 ���엯�� LinkedHashMap �씠�떎. �씠瑜� User ���엯�쑝濡� 蹂��솚�븯湲� �쐞�빐 ObjectMapper �궗�슜
-        return objectMapper.convertValue(claims.getBody().get(DATA_KEY), UserVo.class);
+        try {
+            return objectMapper.convertValue(claims.getBody().get(DATA_KEY), UserVo.class);
+        } catch (Exception ex) {
+            log.debug(ex.getMessage());
+        }
+        return null;
     }
 
     private Jws<Claims> decryption(String jwt) {
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 3a1202a..8bfe576 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -188,11 +188,7 @@
     }
 
 
-
-    //  API 瑜� �넻�빐 �씠�뒋 異붽�.
-    @Override
-    @Transactional
-    public Issue addApiIssue(IssueApiForm issueApiForm) {
+    private IssueForm convertToIssueForm(IssueApiForm issueApiForm, User user) {
         if (issueApiForm.getIssueTypeId() == null) {
             throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_ISSUE_TYPE_ERROR));
         }
@@ -211,14 +207,7 @@
         }
         issueForm.setProjectId(project.getId());
 
-        // �넗�겙�쑝濡� �쑀�� �젙蹂� 媛��졇�삤湲�
-        String token = issueApiForm.getToken();
-        UserVo userVo = this.apiTokenService.certification(token);
-
-        // �빐�떦 �쑀�� �젙蹂닿� �쁽�옱 db�뿉 �엳�뒗吏� �솗�씤
-        User user = this.userService.getUser(userVo.getId());
         if (user != null) {
-
             // 湲곕낯媛� �엯�젰�븯湲�
             IssueApiDefaultForm issueApiDefaultForm = new IssueApiDefaultForm();
             issueApiDefaultForm.setUserId(user.getId());
@@ -226,6 +215,7 @@
             IssueApiDefault issueApiDefault = this.issueApiDefaultService.find(issueApiDefaultForm);
             if (issueApiDefault != null) {
                 ConvertUtil.copyProperties(issueApiDefault, issueForm);
+                issueForm.setId(null);
                 issueForm.setPriorityId(issueApiDefault.getPriority().getId());
                 issueForm.setSeverityId(issueApiDefault.getSeverity().getId());
             }
@@ -248,11 +238,33 @@
             // api �엯�젰媛� �쟻�슜
             ConvertUtil.copyProperties(issueApiForm, issueForm);
 
-            return addIssue(user, issueForm, issueApiForm.getMultipartFiles());
+            return issueForm;
+
         } else {
             throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_USER_ERROR));
         }
     }
+
+    private User convertToUser(String token) {
+        // �넗�겙�쑝濡� �쑀�� �젙蹂� 媛��졇�삤湲�
+        UserVo userVo = this.apiTokenService.certification(token);
+
+        // �빐�떦 �쑀�� �젙蹂닿� �쁽�옱 db�뿉 �엳�뒗吏� �솗�씤
+        return this.userService.getUser(userVo.getId());
+    }
+
+
+    //  API 瑜� �넻�빐 �씠�뒋 異붽�.
+    @Override
+    @Transactional
+    public Issue addApiIssue(IssueApiForm issueApiForm) {
+        User user = convertToUser(issueApiForm.getToken());
+        IssueForm issueForm = this.convertToIssueForm(issueApiForm, user);
+
+        return addIssue(user, issueForm, issueApiForm.getMultipartFiles());
+    }
+
+
 
     // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋
     private IssueVo findIssue(IssueApiForm issueApiForm, Long userId) {
@@ -316,6 +328,10 @@
         issue.setIssueType(issueType);
         issue.setPriority(priority);
         issue.setSeverity(severity);
+        if (issueForm.getParentIssueId() != null){
+            Issue parentIssue = this.getIssue(issueForm.getParentIssueId());
+            issue.setParentIssue(parentIssue);
+        }
 
         issue.setIssueNumber(this.issueNumberGeneratorService.generateIssueNumber(project));    //  媛� �봽濡쒖젥�듃�쓽 怨좎쑀 �씠�뒋 踰덊샇 �깮�꽦
 
@@ -1209,12 +1225,29 @@
         issueVo.setIssueHistoryVos(this.issueHistoryService.findIssueHistory(issue.getId()));
     }
 
+    // �씠�뒋瑜� �닔�젙�븳�떎
+    @Override
+    public Issue modifyIssue(IssueApiForm issueApiForm, List<MultipartFile> files) {
+        User user = this.convertToUser(issueApiForm.getToken());
+        IssueForm issueForm = this.convertToIssueForm(issueApiForm, user);
+
+        return this.modifyIssue(user, issueForm, files);
+    }
+
     //  �씠�뒋瑜� �닔�젙�븳�떎.
     @Override
     @Transactional
     public Issue modifyIssue(IssueForm issueForm, List<MultipartFile> multipartFiles) {
+        User user = this.webAppUtil.getLoginUserObject();
+        return modifyIssue(user, issueForm, multipartFiles);
+    }
+
+    //  �씠�뒋瑜� �닔�젙�븳�떎.
+    @Override
+    @Transactional
+    public Issue modifyIssue(User user, IssueForm issueForm, List<MultipartFile> multipartFiles) {
         //  �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎.
-        this.workspaceService.checkUseWorkspace();
+        this.workspaceService.checkUseWorkspace(user, user.getLastWorkspaceId());
         //  �씠�뒋 �닔�젙 沅뚰븳 泥댄겕
         this.verifyIssueModifyPermission(issueForm.getId());
         //  �봽濡쒖젥�듃 �쑀�슚�꽦 泥댄겕
@@ -1266,14 +1299,14 @@
         //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds());
         //  �떞�떦遺��꽌 吏��젙
         if(issueForm.getDepartmentIds().size()>0){
-            this.issueDepartmentService.modifyIssueDepartment(issue, project.getWorkspace(), issueForm.getDepartmentIds());
+            this.issueDepartmentService.modifyIssueDepartment(issue, user, project.getWorkspace(), issueForm.getDepartmentIds());
         }
 
         //  multipartFile �쓣 file Map List 媛앹껜濡� 蹂�寃쏀븳�떎.
         List<Map<String, Object>> convertFileMaps = this.convertMultipartFileToFile(multipartFiles);
 
         //  泥⑤� �뙆�씪 ���옣 - 鍮꾨룞湲곕줈 �옉�룞
-        this.attachedFileService.addAttachedFile(convertFileMaps, issue, this.webAppUtil.getLoginUser().getAccount());
+        this.attachedFileService.addAttachedFile(convertFileMaps, issue, user.getAccount());
         //  �궘�젣�맂 泥⑤��뙆�씪 泥섎━
         this.attachedFileService.removeAttachedFiles(issueForm.getRemoveFiles());
         //  �뀓�뒪�듃 �뿉�뵒�꽣�뿉 泥⑤��븳 �뙆�씪�쓣 �씠�뒋�� �뿰寃�
@@ -1282,7 +1315,7 @@
         this.issueCustomFieldValueService.modifyIssueCustomFieldValue(issue, issueForm.getIssueCustomFields());
         //  �씠�뒋 �씠�젰 �벑濡�
         if (!StringUtils.isEmpty(detectIssueChange.toString())) {
-            this.issueHistoryService.addIssueHistory(issue, IssueHistoryType.MODIFY, detectIssueChange.toString());
+            this.issueHistoryService.addIssueHistory(issue, user, IssueHistoryType.MODIFY, detectIssueChange.toString());
         }
         //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
         log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_MODIFY));
diff --git a/src/main/java/kr/wisestone/owl/web/controller/ApiController.java b/src/main/java/kr/wisestone/owl/web/controller/ApiController.java
index b8c060c..f056a56 100644
--- a/src/main/java/kr/wisestone/owl/web/controller/ApiController.java
+++ b/src/main/java/kr/wisestone/owl/web/controller/ApiController.java
@@ -1,16 +1,12 @@
 package kr.wisestone.owl.web.controller;
 
 import kr.wisestone.owl.constant.Constants;
+import kr.wisestone.owl.constant.MsgConstants;
 import kr.wisestone.owl.domain.Issue;
 import kr.wisestone.owl.exception.OwlRuntimeException;
-import kr.wisestone.owl.service.GuideService;
 import kr.wisestone.owl.service.IssueService;
 import kr.wisestone.owl.util.ConvertUtil;
-import kr.wisestone.owl.util.MapUtil;
-import kr.wisestone.owl.web.condition.GuideCondition;
-import kr.wisestone.owl.web.form.GuideForm;
 import kr.wisestone.owl.web.form.IssueApiForm;
-import kr.wisestone.owl.web.form.IssueForm;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Pageable;
 import org.springframework.http.MediaType;
@@ -23,10 +19,6 @@
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.Stack;
 
 @Controller
 public class ApiController extends BaseController {
@@ -54,9 +46,17 @@
         Map<String, Object> resJsonData = new HashMap<>();
 
         IssueApiForm issueForm = IssueApiForm.make(ConvertUtil.convertJsonToMap(request.getParameter(Constants.REQ_KEY_CONTENT)), request.getFiles("file"));
-        Issue issue = this.issueService.addApiIssue(issueForm);
-        //  踰꾩쟾 �깮�꽦
-        this.issueService.addIssueVersion(issue.getId());
+        if (issueForm == null) {
+            throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_ERROR));
+        }
+        if (issueForm.getApiType() == IssueApiForm.ApiType.add) {
+            Issue issue = this.issueService.addApiIssue(issueForm);
+            //  踰꾩쟾 �깮�꽦
+            this.issueService.addIssueVersion(issue.getId());
+        } else {
+            this.issueService.modifyIssue(issueForm, request.getFiles("file"));
+        }
+
         return this.setSuccessMessage(resJsonData);
     }
 
diff --git a/src/main/java/kr/wisestone/owl/web/form/IssueApiForm.java b/src/main/java/kr/wisestone/owl/web/form/IssueApiForm.java
index ed11829..8c1e7a8 100644
--- a/src/main/java/kr/wisestone/owl/web/form/IssueApiForm.java
+++ b/src/main/java/kr/wisestone/owl/web/form/IssueApiForm.java
@@ -1,7 +1,9 @@
 package kr.wisestone.owl.web.form;
 
 import com.google.common.collect.Lists;
+import kr.wisestone.owl.constant.MsgConstants;
 import kr.wisestone.owl.domain.IssueCustomFieldValue;
+import kr.wisestone.owl.exception.OwlRuntimeException;
 import kr.wisestone.owl.util.ConvertUtil;
 import kr.wisestone.owl.util.MapUtil;
 import kr.wisestone.owl.vo.CustomFieldVo;
@@ -10,6 +12,12 @@
 import java.util.*;
 
 public class IssueApiForm {
+
+    public enum ApiType {
+        add,
+        modify
+    }
+
     private String token;
     private String title;
     private String projectKey;
@@ -20,6 +28,7 @@
     private Date startDate;
     private Date endDate;
     private Date searchTime;
+    private ApiType apiType;
     private List<DepartmentForm> departments = Lists.newArrayList();
     private List<IssueCustomFieldValueForm> issueCustomFieldValues = Lists.newArrayList();
     private List<Map<String, Object>> CustomFieldValues = Lists.newArrayList();
@@ -33,13 +42,21 @@
         IssueApiForm form = ConvertUtil.convertMapToClass(content, IssueApiForm.class);
         form.setMultipartFiles(files);
 
+        // api ���엯
+        if (MapUtil.getString(content, "apiType") != null) {
+            try {
+                form.setApiType(ApiType.valueOf(MapUtil.getString(content, "apiType")));
+            } catch (Exception ex) {
+                return null;
+            }
+        }
+
         //  �궗�슜�옄 �븘�뱶 �젙蹂�
         if (MapUtil.getObject(content, "customFields") != null){
             List<Map<String, Object>> customFields = (List)MapUtil.getObject(content, "customFields");
             for (Map<String, Object> customField : customFields) {
                 IssueCustomFieldValueForm issueCustomFieldValueForm = ConvertUtil.convertMapToClass(customField, IssueCustomFieldValueForm.class);
                 form.addIssueCustomFieldValue(issueCustomFieldValueForm);
-
 
                 Map<String, Object> customFieldVo = new HashMap<>();
                 customFieldVo.put("id", issueCustomFieldValueForm.getCustomFieldId());
@@ -177,7 +194,15 @@
         CustomFieldValues = customFieldValues;
     }
 
-//    public List<Map<String, Object>> getFiles() {
+    public ApiType getApiType() {
+        return apiType;
+    }
+
+    public void setApiType(ApiType apiType) {
+        this.apiType = apiType;
+    }
+
+    //    public List<Map<String, Object>> getFiles() {
 //        return files;
 //    }
 //
diff --git a/src/main/resources/mybatis/query-template/issue-template.xml b/src/main/resources/mybatis/query-template/issue-template.xml
index bcb5c7b..5344f9f 100644
--- a/src/main/resources/mybatis/query-template/issue-template.xml
+++ b/src/main/resources/mybatis/query-template/issue-template.xml
@@ -510,11 +510,12 @@
     <!--    �듅�젙 �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 媛숈� �씠�뒋瑜� 議고쉶 -->
     <select id="findByCustomFieldValue" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition">
         SELECT
-        id
-        FROM issue
-        LEFT OUTER JOIN issue_custom_field_value issue_custom FORCE INDEX(issueIdIndex) ON issue.id = issue_custom.issue_id
+        iss.id as id,
+        iss.title as title
+        FROM issue iss
+        LEFT OUTER JOIN issue_custom_field_value issue_custom FORCE INDEX(issueIdIndex) ON iss.id = issue_custom.issue_id
         WHERE 1=1
-        AND issue.parent_issue_id IS NULL
+        AND iss.parent_issue_id IS NULL
         <choose>
             <when test="useValues.size != 0">
                 AND issue_custom.use_value IN
diff --git a/src/main/webapp/scripts/app/api/apiSetting.controller.js b/src/main/webapp/scripts/app/api/apiSetting.controller.js
index d24baf8..9031cce 100644
--- a/src/main/webapp/scripts/app/api/apiSetting.controller.js
+++ b/src/main/webapp/scripts/app/api/apiSetting.controller.js
@@ -97,9 +97,11 @@
                             let customFieldApiOverlaps = result.data.data;
                             $scope.vm.form.customFields = [];
 
-                            customFieldApiOverlaps.forEach(function (customFieldApiOverlap) {
-                                $scope.vm.form.customFields.push(customFieldApiOverlap.customFieldVo);
-                            });
+                            if (customFieldApiOverlaps != null) {
+                                customFieldApiOverlaps.forEach(function (customFieldApiOverlap) {
+                                    $scope.vm.form.customFields.push(customFieldApiOverlap.customFieldVo);
+                                });
+                            }
                         }
                         else {
                             SweetAlert.swal($filter("translate")("issue.failedToIssueTypeListLookup"), result.data.message.message, "error"); // "�씠�뒋 �쑀�삎 紐⑸줉 議고쉶 �떎�뙣"
diff --git a/src/main/webapp/views/api/apiOverlapAdd.html b/src/main/webapp/views/api/apiOverlapAdd.html
deleted file mode 100644
index ca69386..0000000
--- a/src/main/webapp/views/api/apiOverlapAdd.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<div class="formModal">
-    <div class="modal-header faded smaller">
-        <div class="modal-title">
-            <strong translate="api.addOverlapField">�궗�슜�옄 �젙�쓽 �븘�뱶 留뚮뱾湲�</strong>
-        </div>
-        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
-            <span aria-hidden="true"> &times;</span>
-        </button>
-    </div>
-
-    <div class="modal-body">
-        <form role="form" name="customFieldAddForm">
-            <div class="form-group">
-                <label for="customFieldAddForm2"><span>�븘�뱶 �꽑�깮</span> <code
-                        class="highlighter-rouge">*</code></label>
-                <select id="customFieldAddForm2" class="form-control" ng-model="vm.form.customFieldType"
-                        ng-change="fn.changeFieldType()">
-                    <option value="INPUT" >寃쎌쑀吏�</option>
-                    <option value="SINGLE_SELECT" >IP</option>
-                    <option value="NUMBER" >援�媛�</option>
-                </select>
-            </div>
-        </form>
-    </div>
-
-    <div class="modal-footer buttons-on-right">
-        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span
-                translate="common.cancel">痍⑥냼</span></button>
-        <button type="button" class="btn btn-md btn-primary bold"
-                js-short-cut
-                js-short-cut-action="(fn.formCheck(customFieldAddForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
-                ng-disabled="fn.formCheck(customFieldAddForm.$invalid)"
-                ng-click="fn.formSubmit()"><span translate="common.save">���옣</span>
-        </button>
-    </div>
-</div>
diff --git a/src/main/webapp/views/api/apiSettingOverlap.html b/src/main/webapp/views/api/apiSettingOverlap.html
index 99d5598..57c7609 100644
--- a/src/main/webapp/views/api/apiSettingOverlap.html
+++ b/src/main/webapp/views/api/apiSettingOverlap.html
@@ -29,7 +29,7 @@
 
 </div>
 
-<div class="element-box">
+<div class="element-box" style="height: 600px">
     <form role="form" name="apiSettingOverlapForm">
         <div class="form-group">
             <label><span translate="common.customField">�궗�슜�옄 �젙�쓽 �븘�뱶</span> </label>

--
Gitblit v1.8.0