Jelajahi Sumber

feat: edit or create commit-node-link

claws 4 tahun lalu
induk
melakukan
73c2fc75ee

+ 22 - 0
web/src/main/java/cn/seecoder/web/controller/gitlab/CommitController.java

@@ -38,6 +38,8 @@ import java.util.Set;
 @Slf4j
 public class CommitController {
 
+    private final static String LINK_FAIL_ERROR = "Commit Link Failed! No Such Bug or Task Found!";
+
     private final BugListService bugListService;
 
     private final TreeNodeService treeNodeService;
@@ -204,4 +206,24 @@ public class CommitController {
     {
         return Response.buildSuccess(commitService.getDiff(projectId, from, to));
     }
+
+    @ApiOperation(value = "关联commit和缺陷、任务节点", httpMethod = "GET")
+    @GetMapping("/commits/link")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query"),
+            @ApiImplicitParam(name = "commitId", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "relatedType", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "relatedId", dataType = "int", paramType = "query")
+    })
+    public Response<Object> linkCommit(@RequestParam("projectId") Integer projectId,
+                                       @RequestParam("commitId") String commitId,
+                                       @RequestParam("relatedType") CommitRelatedEnum relatedType,
+                                       @RequestParam("relatedId") Integer relatedId)
+    {
+        if (commitService.link(projectId, commitId, relatedType, relatedId)){
+            return Response.buildSuccess(null);
+        } else {
+            return Response.buildFailure(404, LINK_FAIL_ERROR);
+        }
+    }
 }

+ 3 - 0
web/src/main/java/cn/seecoder/web/dao/project/CommitMapper.java

@@ -34,4 +34,7 @@ public interface CommitMapper {
     @Select("select * from commit where project_id = #{projectId}")
     List<CommitPO> selectByProjectId(Integer projectId);
 
+    @Select("select * from commit where id = #{id}")
+    CommitPO selectByCommitId(@Param("id") String id);
+
 }

+ 1 - 0
web/src/main/java/cn/seecoder/web/infrastructure/config/WebSecurityConfig.java

@@ -91,6 +91,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
                 .antMatchers(GET, "/commits/by_branch").access("@authTools.checkProjOwnershipParam(request)")
                 .antMatchers(GET, "/commit").access("@authTools.checkProjOwnershipParam(request)")
                 .antMatchers(GET, "/commits/diff").access("@authTools.checkProjOwnershipParam(request)")
+                .antMatchers(GET, "/commits/link").access("@authTools.checkProjOwnershipParam(request)")
                 // Branch Controller
                 .antMatchers(GET, "/branch/list").access("@authTools.checkProjOwnershipParam(request)")
                 // Deployment Controller

+ 3 - 1
web/src/main/java/cn/seecoder/web/model/enums/CommitRelatedEnum.java

@@ -14,7 +14,9 @@ public enum CommitRelatedEnum {
     @JsonProperty("tree_id")
     TREE_ID("tree_id"),
     @JsonProperty("bug_id")
-    BUG_ID("bug_id");
+    BUG_ID("bug_id"),
+    @JsonProperty("none")
+    NONE("none");
 
     private final String value;
     CommitRelatedEnum(String value) {

+ 0 - 1
web/src/main/java/cn/seecoder/web/model/po/project/CommitPO.java

@@ -43,6 +43,5 @@ public class CommitPO {
         this.projectId = projectId;
         this.relatedType = type;
         this.relatedId = relatedId;
-
     }
 }

+ 6 - 1
web/src/main/java/cn/seecoder/web/model/vo/project/CommitVO.java

@@ -27,8 +27,12 @@ public class CommitVO {
     private String timestamp;
     @ApiModelProperty("commit 用户的gitlab用户名")
     private String gitlabUsername;
+    @ApiModelProperty("commit 用户邮箱")
+    private String authorEmail;
     @ApiModelProperty("commit type")
     private CommitRelatedEnum relatedType;
+    @ApiModelProperty("related id")
+    private Integer relatedId;
     @ApiModelProperty("commit parents")
     private List<String> parents;
 
@@ -41,7 +45,8 @@ public class CommitVO {
         message = vo.getMessage();
         title = vo.getMessage();
         timestamp = vo.getCommittedDate().toString();
-        gitlabUsername = vo.getCommitterName();
+        gitlabUsername = vo.getAuthorName();
         parents = vo.getParentIds();
+        authorEmail = vo.getAuthorEmail();
     }
 }

+ 7 - 0
web/src/main/java/cn/seecoder/web/service/bug_list/BugListService.java

@@ -1,6 +1,7 @@
 package cn.seecoder.web.service.bug_list;
 
 import cn.seecoder.web.core.commit.model.CommitState;
+import cn.seecoder.web.model.po.bug_list.BugListPO;
 import cn.seecoder.web.model.vo.bug_list.BugListCreateVO;
 import cn.seecoder.web.model.vo.bug_list.BugListUpdateBasicVO;
 import cn.seecoder.web.model.vo.bug_list.BugListVO;
@@ -33,4 +34,10 @@ public interface BugListService {
      * @param id 关联的bug id
      */
     void updateState(CommitState state,Integer id);
+
+    /**
+     * 根据id查询对应的bug
+     * @param id 关联的bug id
+     */
+    BugListPO getBugById(Integer id);
 }

+ 7 - 0
web/src/main/java/cn/seecoder/web/service/impl/bug_list/BugListServiceImpl.java

@@ -165,4 +165,11 @@ public class BugListServiceImpl implements BugListService {
 
         }catch (Exception e){}
     }
+
+    @Override
+    public BugListPO getBugById(Integer id) {
+        BugListPO bugListPO = bugListMapper.selectById(id);
+        return bugListPO;
+//        return new BugListVO(bugListPO, userMapper.select(bugListPO.getProcessorId()).getUsername());
+    }
 }

+ 78 - 7
web/src/main/java/cn/seecoder/web/service/impl/project/CommitServiceImpl.java

@@ -2,7 +2,13 @@ package cn.seecoder.web.service.impl.project;
 
 import cn.seecoder.web.dao.user.UserMapper;
 import cn.seecoder.web.model.enums.CommitRelatedEnum;
+import cn.seecoder.web.model.po.bug_list.BugListPO;
+import cn.seecoder.web.model.po.tree.TreeNodePO;
+import cn.seecoder.web.model.vo.bug_list.BugListVO;
 import cn.seecoder.web.model.vo.project.CommitVO;
+import cn.seecoder.web.model.vo.tree.TreeNodeVO;
+import cn.seecoder.web.service.bug_list.BugListService;
+import cn.seecoder.web.service.tree.TreeNodeService;
 import com.nju.edu.gitlab.SeecoderGitlabApi;
 import com.nju.edu.gitlab.vo.DiffVO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -11,10 +17,7 @@ import cn.seecoder.web.dao.project.CommitMapper;
 import cn.seecoder.web.model.po.project.CommitPO;
 import cn.seecoder.web.service.project.CommitService;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -27,12 +30,16 @@ public class CommitServiceImpl implements CommitService {
 
     private final CommitMapper commitMapper;
     private final SeecoderGitlabApi seecoderGitlabApi;
+    private final TreeNodeService treeNodeService;
+    private final BugListService bugListService;
 
 
     @Autowired
-    public CommitServiceImpl(CommitMapper commitMapper, SeecoderGitlabApi seecoderGitlabApi) {
+    public CommitServiceImpl(CommitMapper commitMapper, SeecoderGitlabApi seecoderGitlabApi, TreeNodeService treeNodeService, BugListService bugListService) {
         this.commitMapper = commitMapper;
         this.seecoderGitlabApi = seecoderGitlabApi;
+        this.treeNodeService = treeNodeService;
+        this.bugListService = bugListService;
     }
 
     @Autowired
@@ -82,7 +89,17 @@ public class CommitServiceImpl implements CommitService {
         try{
             List<com.nju.edu.gitlab.vo.commit.CommitVO> commitsResponse = seecoderGitlabApi.getCommitsByBranch(projectId, "master");
             for (com.nju.edu.gitlab.vo.commit.CommitVO commit : commitsResponse){
-                allCommits.add(new CommitVO(commit));
+                CommitVO commitVO = new CommitVO(commit);
+                CommitPO commitPO = commitMapper.selectByCommitId(commitVO.getId());
+                if (commitPO != null){
+//                System.out.println(commitPO.getId());
+                    commitVO.setRelatedType(commitPO.getRelatedType());
+                    commitVO.setRelatedId(commitPO.getRelatedId());
+                } else {
+//                System.out.println("hh");
+                    commitVO.setRelatedType(CommitRelatedEnum.NONE);
+                }
+                allCommits.add(commitVO);
             }
 
         } catch (Exception e){
@@ -97,7 +114,17 @@ public class CommitServiceImpl implements CommitService {
     public CommitVO getCommitByHash(Integer projectId, String hash) {
         try {
             com.nju.edu.gitlab.vo.commit.CommitVO commit = seecoderGitlabApi.getCommitByHash(projectId, hash);
-            return new CommitVO(commit);
+            CommitVO commitVO = new CommitVO(commit);
+            CommitPO commitPO = commitMapper.selectByCommitId(hash);
+            if (commitPO != null){
+                System.out.println(commitPO.getId());
+                commitVO.setRelatedType(commitPO.getRelatedType());
+                commitVO.setRelatedId(commitPO.getRelatedId());
+            } else {
+                System.out.println("hh");
+                commitVO.setRelatedType(CommitRelatedEnum.NONE);
+            }
+            return commitVO;
         } catch (Exception e){
             e.printStackTrace();
             return null;
@@ -114,4 +141,48 @@ public class CommitServiceImpl implements CommitService {
         }
         return new HashSet<>();
     }
+
+    @Override
+    public boolean link(Integer projectId, String commitHash, CommitRelatedEnum relatedType, Integer relatedId) {
+        // check if the related target exists
+        if (relatedType == CommitRelatedEnum.TREE_ID){
+            TreeNodePO node = treeNodeService.getNodeByNodeId(relatedId);
+            if (node == null){
+                return false;
+            } else if (! node.getProjectId().equals(projectId)) {
+                return false;
+            }
+        } else {
+            BugListPO node = bugListService.getBugById(relatedId);
+            if (node == null){
+                return false;
+            } else if (! node.getProjectId().equals(projectId)) {
+                return false;
+            }
+        }
+
+        // check if the commit is already exist, then update it. if not, insert a new one.
+        CommitPO commitPODB = commitMapper.selectByCommitId(commitHash);
+        if (commitPODB != null){
+            commitPODB.setRelatedType(relatedType);
+            commitPODB.setRelatedId(relatedId);
+            commitMapper.update(commitPODB);
+        } else {
+            CommitVO commit = this.getCommitByHash(projectId, commitHash);
+
+            CommitPO commitPO = new CommitPO();
+            commitPO.setId(commit.getId());
+            commitPO.setMessage(commit.getMessage());
+            commitPO.setTitle(commit.getTitle());
+            commitPO.setProjectId(projectId);
+//            commitPO.setTimestamp(commit.getTimestamp());
+            commitPO.setGitlabUsername(commit.getGitlabUsername());
+            commitPO.setEmail(commit.getAuthorEmail());
+            commitPO.setRelatedType(relatedType);
+            commitPO.setRelatedId(relatedId);
+
+            this.save(commitPO);
+        }
+        return true;
+    }
 }

+ 4 - 2
web/src/main/java/cn/seecoder/web/service/impl/tree/TreeNodeServiceImpl.java

@@ -240,8 +240,10 @@ public class TreeNodeServiceImpl implements TreeNodeService {
         return getTreeNodeVOS(nodesPO);
     }
 
-
-
+    @Override
+    public TreeNodePO getNodeByNodeId(int nodeId) {
+        return treeNodeMapper.getTreeNodeById(nodeId);
+    }
 
     /**
      * 创建一个default的节点

+ 10 - 0
web/src/main/java/cn/seecoder/web/service/project/CommitService.java

@@ -37,4 +37,14 @@ public interface CommitService {
     CommitVO getCommitByHash(Integer projectId, String hash);
 
     Set<DiffVO> getDiff(Integer projectId, String fromHash, String toHash);
+
+    /**
+     * link commit and tree node or bug
+     * @param projectId
+     * @param commitHash
+     * @param relatedType
+     * @param relatedId
+     * @return
+     */
+    boolean link(Integer projectId, String commitHash, CommitRelatedEnum relatedType, Integer relatedId);
 }

+ 7 - 0
web/src/main/java/cn/seecoder/web/service/tree/TreeNodeService.java

@@ -3,6 +3,7 @@ package cn.seecoder.web.service.tree;
 
 
 
+import cn.seecoder.web.model.po.tree.TreeNodePO;
 import cn.seecoder.web.model.vo.tree.TreeNodeCreateVO;
 import cn.seecoder.web.model.vo.tree.TreeNodeUpdateBasicVO;
 import cn.seecoder.web.model.vo.tree.TreeNodeVO;
@@ -49,6 +50,12 @@ public interface TreeNodeService {
 
     List<TreeNodeVO> getNodesWithTaskTypeByProjectId(int projectId);
 
+    /**
+     * 根据nodeId查询得到一个TreeNode
+     * @param nodeId node的ID
+     * @return 如果有返回该TreeNodePO,否则NULL
+     */
+    TreeNodePO getNodeByNodeId(int nodeId);
 
     void updateNodeState(Integer id, CommitState state);
 }