DingXiaoYu před 2 roky
rodič
revize
a31315f1d2
23 změnil soubory, kde provedl 275 přidání a 481 odebrání
  1. 3 12
      web/src/main/java/cn/seecoder/web/controller/bug_list/BugListController.java
  2. 0 46
      web/src/main/java/cn/seecoder/web/controller/commit/BranchController.java
  3. 98 22
      web/src/main/java/cn/seecoder/web/controller/commit/CommitController.java
  4. 0 85
      web/src/main/java/cn/seecoder/web/controller/commit/CommitLinkController.java
  5. 0 46
      web/src/main/java/cn/seecoder/web/controller/commit/CommitQualityController.java
  6. 5 40
      web/src/main/java/cn/seecoder/web/controller/project/ProjectController.java
  7. 5 25
      web/src/main/java/cn/seecoder/web/controller/tree/TreeNodesController.java
  8. 0 8
      web/src/main/java/cn/seecoder/web/controller/user/UserController.java
  9. 7 0
      web/src/main/java/cn/seecoder/web/service/branch/BranchService.java
  10. 6 0
      web/src/main/java/cn/seecoder/web/service/bug_list/BugListService.java
  11. 18 14
      web/src/main/java/cn/seecoder/web/service/commit/CommitLinkService.java
  12. 9 0
      web/src/main/java/cn/seecoder/web/service/commit/CommitService.java
  13. 7 2
      web/src/main/java/cn/seecoder/web/service/impl/branch/BranchServiceImpl.java
  14. 20 54
      web/src/main/java/cn/seecoder/web/service/impl/bug_list/BugListServiceImpl.java
  15. 3 19
      web/src/main/java/cn/seecoder/web/service/impl/commit/CommitLinkServiceImpl.java
  16. 10 28
      web/src/main/java/cn/seecoder/web/service/impl/commit/CommitServiceImpl.java
  17. 41 15
      web/src/main/java/cn/seecoder/web/service/impl/project/ProjectServiceImpl.java
  18. 1 1
      web/src/main/java/cn/seecoder/web/service/impl/sql/SqlServiceImpl.java
  19. 21 32
      web/src/main/java/cn/seecoder/web/service/impl/tree/TreeNodeServiceImpl.java
  20. 0 1
      web/src/main/java/cn/seecoder/web/service/impl/user/UserServiceImpl.java
  21. 9 0
      web/src/main/java/cn/seecoder/web/service/project/ProjectService.java
  22. 6 2
      web/src/main/java/cn/seecoder/web/service/tree/TreeNodeService.java
  23. 6 29
      web/src/main/java/cn/seecoder/web/service/user/UserService.java

+ 3 - 12
web/src/main/java/cn/seecoder/web/controller/bug_list/BugListController.java

@@ -1,15 +1,12 @@
 package cn.seecoder.web.controller.bug_list;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
 import cn.seecoder.web.model.vo.Response;
 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;
 import cn.seecoder.web.service.bug_list.BugListService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -18,7 +15,7 @@ import java.util.List;
  * @date 2021/3/21
  * @description:
  */
-@Api(tags = "Bug List相关 API")
+
 @RestController
 @RequestMapping("/bug_list")
 public class BugListController {
@@ -31,23 +28,17 @@ public class BugListController {
     }
 
     @PostMapping
-    @ApiOperation(value = "创建一条bug list", httpMethod = "POST")
-    @ApiImplicitParam(value = "bugListCreateVO", dataType = "object", paramType = "body")
     public Response create(@RequestBody BugListCreateVO bugListCreateVO){
         bugListService.create(bugListCreateVO);
         return Response.buildSuccess();
     }
 
     @GetMapping("/list")
-    @ApiOperation(value = "获取一个项目所有bug list", httpMethod = "GET")
-    @ApiImplicitParam(value = "projectId", dataType = "int", paramType = "query")
     public Response<List<BugListVO>> list(@RequestParam("projectId") Integer projectId){
         return Response.buildSuccess(bugListService.list(projectId));
     }
 
     @PutMapping
-    @ApiOperation(value = "更新bug list基本信息, 不需要更新的信息不需要填", httpMethod = "PUT")
-    @ApiImplicitParam(value = "bugListUpdateBasicVO", dataType = "object", paramType = "body")
     public Response updateBasicInfo(@RequestBody BugListUpdateBasicVO bugListUpdateBasicVO){
         bugListService.updateBasicInfo(bugListUpdateBasicVO);
         return Response.buildSuccess();

+ 0 - 46
web/src/main/java/cn/seecoder/web/controller/commit/BranchController.java

@@ -1,46 +0,0 @@
-package cn.seecoder.web.controller.commit;
-
-import cn.seecoder.web.model.vo.Response;
-import cn.seecoder.web.service.branch.BranchService;
-import com.nju.edu.gitlab.vo.BranchVO;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-/**
- * @author claws
- * @date 2022/3/19
- * @description API about branch
- */
-@Api(tags = "Branch API")
-@RestController
-@Slf4j
-public class BranchController {
-    final static String GET_BRANCHES_ERROR = "Fail to search all branches";
-
-    private final BranchService branchService;
-
-    @Autowired
-    public BranchController(BranchService branchService) {
-        this.branchService = branchService;
-    }
-
-    @ApiOperation(value = "获取指定项目的所有branch信息", httpMethod = "GET")
-    @GetMapping("/branch/list")
-    @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query")
-    public Response<Object> getAllBranches(@RequestParam("projectId") Integer projectId){
-        List<BranchVO> allBranches = branchService.getAllBranches(projectId);
-        if (allBranches != null) {
-            return Response.buildSuccess(allBranches);
-        } else {
-            return Response.buildFailure(500, GET_BRANCHES_ERROR);
-        }
-    }
-}

+ 98 - 22
web/src/main/java/cn/seecoder/web/controller/commit/CommitController.java

@@ -1,13 +1,18 @@
 package cn.seecoder.web.controller.commit;
 
+import cn.seecoder.common.exceptions.ServiceException;
+import cn.seecoder.web.model.enums.CommitRelatedEnum;
 import cn.seecoder.web.model.vo.Response;
+import cn.seecoder.web.model.vo.commit.CommitQualityVO;
 import cn.seecoder.web.model.vo.commit.CommitVO;
+import cn.seecoder.web.model.vo.commit.GitWebHookVO;
+import cn.seecoder.web.model.vo.hook.SonarResultHookVO;
+import cn.seecoder.web.service.branch.BranchService;
+import cn.seecoder.web.service.commit.CommitLinkService;
+import cn.seecoder.web.service.commit.CommitQualityService;
 import cn.seecoder.web.service.commit.CommitService;
+import com.nju.edu.gitlab.vo.BranchVO;
 import com.nju.edu.gitlab.vo.DiffVO;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -20,51 +25,122 @@ import java.util.Set;
  * @date 2021/2/4
  * @description: 提交管理接口
  */
-@Api(tags = "Commit Manage API")
+
 @RestController
 @Slf4j
 public class CommitController {
     private final CommitService commitService;
 
+    private final BranchService branchService;
+
+    private final CommitLinkService commitLinkService;
+
+    private final CommitQualityService commitQualityService;
+
     @Autowired
-    public CommitController(CommitService commitService) {
+    public CommitController(CommitService commitService,BranchService branchService,CommitLinkService commitLinkService,CommitQualityService commitQualityService) {
         this.commitService = commitService;
+        this.branchService = branchService;
+        this.commitLinkService = commitLinkService;
+        this.commitQualityService = commitQualityService;
     }
 
-    @ApiOperation(value = "获取指定项目指定分支所有的commit信息", httpMethod = "GET")
+    private final static String GET_BRANCHES_ERROR = "Fail to search all branches";
+
+    private final static String LINK_FAIL_ERROR = "Commit Link Failed! No Such Bug or Task!";
+
+    private final static String QUALITY_QUERY_ERROR = "查询代码版本质量失败";
+
     @GetMapping("/commits/by_branch")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "branchName", dataType = "String", paramType = "query")
-    })
     public Response<List<CommitVO>> getCommitsByBranch(@RequestParam("projectId") Integer projectId,
                                                                                     @RequestParam("branchName") String branchName){
         return Response.buildSuccess(commitService.getCommitsByBranchName(projectId, branchName));
     }
 
-    @ApiOperation(value = "获得一个commit的信息", httpMethod = "GET")
+
     @GetMapping("/commit")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "hash", dataType = "String", paramType = "query")
-    })
     public Response<CommitVO> getCommitByHash(@RequestParam("projectId") Integer projectId,
                                               @RequestParam("hash") String hash)
     {
         return Response.buildSuccess(commitService.getCommitByHash(projectId, hash));
     }
 
-    @ApiOperation(value = "获得两个提交之间的差异", httpMethod = "GET")
+
     @GetMapping("/commits/diff")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "from", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "to", dataType = "String", paramType = "query")
-    })
     public Response<Set<DiffVO>> getDiff(@RequestParam("projectId") Integer projectId,
                                          @RequestParam("from") String from,
                                          @RequestParam("to") String to)
     {
         return Response.buildSuccess(commitService.getDiff(projectId, from, to));
     }
+
+    @GetMapping("/branch/list")
+    public Response<Object> getAllBranches(@RequestParam("projectId") Integer projectId){
+        List<BranchVO> allBranches = branchService.getAllBranches(projectId);
+        if (allBranches != null) {
+            return Response.buildSuccess(allBranches);
+        } else {
+            return Response.buildFailure(500, GET_BRANCHES_ERROR);
+        }
+    }
+
+    /**
+     * @author chenyz
+     * @date 2021/2/4
+     * @description: 此接口挂载在webhooks的push回调中
+     * 只关注push event
+     * 所有分支的push都分析
+     */
+    @PostMapping("/hook")
+    public void pushHook(@RequestBody GitWebHookVO gitWebHookVO) throws ServiceException {
+        commitLinkService.linkCommitByInfoFromGitlab(gitWebHookVO);
+    }
+
+    @GetMapping("/commits/tree")
+    public Response<List<CommitVO>> getTreeCommits(@RequestParam("treeId") Integer treeId){
+        return Response.buildSuccess(commitLinkService.getTreeLinkedCommits(treeId));
+    }
+
+    @GetMapping("/commits/bug_list")
+    public Response<List<CommitVO>> getBugCommits(@RequestParam("bugId") Integer bugId){
+        return Response.buildSuccess(commitLinkService.getBugLinkedCommits(bugId));
+    }
+
+    @GetMapping("/commits/list")
+    public Response<List<CommitVO>> getCommits(@RequestParam("projectId") Integer projectId) {
+        return Response.buildSuccess(commitLinkService.getLinkedCommits(projectId));
+    }
+
+    @GetMapping("/commits/link")
+    public Response<Object> linkCommit(@RequestParam("projectId") Integer projectId,
+                                       @RequestParam("commitId") String commitId,
+                                       @RequestParam("relatedType") CommitRelatedEnum relatedType,
+                                       @RequestParam("relatedId") Integer relatedId)
+    {
+        if (commitLinkService.link(projectId, commitId, relatedType, relatedId)) {
+            return Response.buildSuccess(null);
+        } else {
+            return Response.buildFailure(404, LINK_FAIL_ERROR);
+        }
+    }
+
+    /**
+     * 这是sonar的hook
+    */
+    @PostMapping("/sonar_hook")
+    public Response<Object> sonarHook(@RequestBody SonarResultHookVO sonarResultHookVO) throws ServiceException {
+        if (commitQualityService.processSonarResult(sonarResultHookVO)) {
+            return Response.buildSuccess("ok");
+        } else {
+            return Response.buildFailure(500, "Post Body Process Error!");
+        }
+    }
+
+    @GetMapping("commit/quality")
+    public Response<CommitQualityVO> getQualityByProjectIdAndCommit(@RequestParam("projectId") Integer projectId,
+                                                                    @RequestParam("commitId") String commitId)
+    {
+        CommitQualityVO quality = commitQualityService.getQualityByCommit(projectId, commitId);
+        return Response.buildSuccess(quality);
+    }
 }

+ 0 - 85
web/src/main/java/cn/seecoder/web/controller/commit/CommitLinkController.java

@@ -1,85 +0,0 @@
-package cn.seecoder.web.controller.commit;
-
-import cn.seecoder.common.exceptions.ServiceException;
-import cn.seecoder.web.model.enums.CommitRelatedEnum;
-import cn.seecoder.web.model.vo.commit.GitWebHookVO;
-import cn.seecoder.web.model.vo.Response;
-import cn.seecoder.web.model.vo.commit.CommitVO;
-import cn.seecoder.web.service.commit.CommitLinkService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@Api(tags = "Commit Link Manage API")
-@RestController
-@Slf4j
-public class CommitLinkController {
-    private final static String LINK_FAIL_ERROR = "Commit Link Failed! No Such Bug or Task!";
-
-    @Autowired
-    CommitLinkService commitLinkService;
-    /**
-     * @author chenyz
-     * @date 2021/2/4
-     * @description: 此接口挂载在webhooks的push回调中
-     * todo webhook最多只能获取20个commit
-     *  因为gitlab官方,考虑性能原因导致
-     *  详见 https://docs.gitlab.com/ee/user/project/integrations/webhooks.html push event内容
-     *  暂时无解
-     * 只关注push event
-     * 所有分支的push都分析
-     */
-    @ApiOperation(value = "push回调接口", httpMethod = "POST")
-    @PostMapping("/hook")
-    @ApiImplicitParam(name = "gitWebHookVO",dataType = "object", paramType = "body")
-    public void pushHook(@RequestBody GitWebHookVO gitWebHookVO) throws ServiceException {
-        commitLinkService.linkCommitByInfoFromGitlab(gitWebHookVO);
-    }
-
-    @ApiOperation(value = "获取某个需求树结点的所有commit信息", httpMethod = "GET")
-    @GetMapping("/commits/tree")
-    @ApiImplicitParam(name = "treeId",dataType = "int", paramType = "query")
-    public Response<List<CommitVO>> getTreeCommits(@RequestParam("treeId") Integer treeId){
-        return Response.buildSuccess(commitLinkService.getTreeLinkedCommits(treeId));
-    }
-
-    @ApiOperation(value = "获取bug list中一个bug关联的所有commit信息", httpMethod = "GET")
-    @GetMapping("/commits/bug_list")
-    @ApiImplicitParam(name = "bugId",dataType = "int", paramType = "query")
-    public Response<List<CommitVO>> getBugCommits(@RequestParam("bugId") Integer bugId){
-        return Response.buildSuccess(commitLinkService.getBugLinkedCommits(bugId));
-    }
-
-    @ApiOperation(value = "获取指定项目的所有commit信息", httpMethod = "GET")
-    @GetMapping("/commits/list")
-    @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query")
-    public Response<List<CommitVO>> getCommits(@RequestParam("projectId") Integer projectId) {
-        return Response.buildSuccess(commitLinkService.getLinkedCommits(projectId));
-    }
-
-    @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 (commitLinkService.link(projectId, commitId, relatedType, relatedId)) {
-            return Response.buildSuccess(null);
-        } else {
-            return Response.buildFailure(404, LINK_FAIL_ERROR);
-        }
-    }
-}

+ 0 - 46
web/src/main/java/cn/seecoder/web/controller/commit/CommitQualityController.java

@@ -1,46 +0,0 @@
-package cn.seecoder.web.controller.commit;
-
-import cn.seecoder.common.exceptions.ServiceException;
-import cn.seecoder.web.model.vo.Response;
-import cn.seecoder.web.model.vo.commit.CommitQualityVO;
-import cn.seecoder.web.model.vo.hook.SonarResultHookVO;
-import cn.seecoder.web.service.commit.CommitQualityService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-@Api(tags = "Commit Quality Manage API")
-@RestController
-public class CommitQualityController {
-    private final static String QUALITY_QUERY_ERROR = "查询代码版本质量失败";
-
-    @Autowired
-    CommitQualityService commitQualityService;
-
-    @ApiOperation(value = "sonarqube回调接口", httpMethod = "POST")
-    @PostMapping("/sonar_hook")
-    @ApiImplicitParam(name = "sonarResultHookVO", dataType = "SonarResultHookVO", paramType = "body")
-    public Response<Object> sonarHook(@RequestBody SonarResultHookVO sonarResultHookVO) throws ServiceException {
-        if (commitQualityService.processSonarResult(sonarResultHookVO)) {
-            return Response.buildSuccess("ok");
-        } else {
-            return Response.buildFailure(500, "Post Body Process Error!");
-        }
-    }
-
-    @ApiOperation(value = "查询代码版本质量", httpMethod = "GET")
-    @GetMapping("commit/quality")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "commitId", dataType = "String", paramType = "query")
-    })
-    public Response<CommitQualityVO> getQualityByProjectIdAndCommit(@RequestParam("projectId") Integer projectId,
-                                                                    @RequestParam("commitId") String commitId)
-    {
-        CommitQualityVO quality = commitQualityService.getQualityByCommit(projectId, commitId);
-        return Response.buildSuccess(quality);
-    }
-}

+ 5 - 40
web/src/main/java/cn/seecoder/web/controller/project/ProjectController.java

@@ -1,19 +1,14 @@
 package cn.seecoder.web.controller.project;
 
-import cn.seecoder.web.model.vo.project.ProjectCreateVO;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
 import cn.seecoder.common.exceptions.ServiceException;
 import cn.seecoder.web.model.vo.Response;
+import cn.seecoder.web.model.vo.project.ProjectCreateVO;
 import cn.seecoder.web.model.vo.project.ProjectVO;
 import cn.seecoder.web.model.vo.user.UserVO;
 import cn.seecoder.web.service.project.ProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -22,7 +17,6 @@ import java.util.List;
  * @date 2021/3/10
  * @description: 项目接口
  */
-@Api(tags = "项目相关 API")
 @RestController
 @RequestMapping("/project")
 public class ProjectController {
@@ -34,78 +28,49 @@ public class ProjectController {
         this.projectService = projectService;
     }
 
-
-    @ApiOperation(value = "根据user获取Project列表", httpMethod = "GET")
     @GetMapping("/listByUser")
     public Response<List<ProjectVO>> listProjectsByUserId() throws ServiceException {
         return Response.buildSuccess(projectService.listProjectsByUserId());
     }
 
-    @ApiOperation(value = "根据projectId获取Project", httpMethod = "GET")
     @GetMapping("/{projectId}")
-    @ApiImplicitParam(name = "projectId",dataType ="int", paramType = "path")
     public Response<ProjectVO> getProjectById(@PathVariable("projectId")int projectId){
         return Response.buildSuccess(projectService.getProjectById(projectId));
     }
 
-    @ApiOperation(value = "创建项目,传入的参数中不必带有效的projectId字段,返回一个创建后的结果,注入id", httpMethod = "POST")
     @PostMapping("/create")
-    @ApiImplicitParam(name = "projectCreateVO",dataType = "object", paramType = "body")
     public Response<ProjectVO> createProject(@RequestBody @Validated ProjectCreateVO projectCreateVO) throws ServiceException {
         return Response.buildSuccess(projectService.createProject(projectCreateVO));
     }
 
-    @ApiOperation(value = "获取一个项目所有成员信息", httpMethod = "GET")
     @GetMapping("/members")
-    @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query")
     public Response<List<UserVO>> getProjectMember(@RequestParam("projectId") Integer projectId) throws ServiceException {
         return Response.buildSuccess(projectService.getProjectMembers(projectId));
     }
 
-    @ApiOperation(value = "给项目添加成员", httpMethod = "POST")
     @PostMapping("/members")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "phone", dataType = "string", paramType = "query")
-    })
     public Response addMember(@RequestParam("projectId") Integer projectId,@RequestParam("phone") String phone) throws ServiceException {
         projectService.addMember(projectId, phone);
         return Response.buildSuccess();
     }
 
-    @ApiOperation(value = "给项目添加成员", httpMethod = "POST")
     @PostMapping("/members/add")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "userId", dataType = "int", paramType = "query")
-    })
     public Response addMember(@RequestParam("projectId") Integer projectId,@RequestParam("userId") Integer userId) throws ServiceException {
         projectService.addMember(projectId, userId);
         return Response.buildSuccess();
     }
 
-    @ApiOperation(value = "生成项目关联邀请码", httpMethod = "POST")
     @PostMapping("/relate/code")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query")
-    })
-    public Response generaterelateCode(@RequestParam("projectId") Integer projectId) {
+    public Response generateRelateCode(@RequestParam("projectId") Integer projectId) {
         return Response.buildSuccess(projectService.generaterelateCode(projectId));
     }
 
-    @ApiOperation(value = "通过邀请码关联两个项目", httpMethod = "POST")
     @PostMapping("/relate")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "relateCode", dataType = "String", paramType = "query")
-    })
     public Response generaterelateCode(@RequestParam("projectId") Integer projectId,@RequestParam("relateCode") String relateCode) {
         return Response.buildSuccess(projectService.relateProjects(projectId,relateCode));
     }
 
-    @ApiOperation(value = "查看一个项目关联的所有项目", httpMethod = "GET")
     @GetMapping("/relate/{projectId}")
-    @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query")
     public Response<List<ProjectVO>> getRelatedProject(@PathVariable("projectId") Integer projectId) {
         return Response.buildSuccess(projectService.getRelatedProjects(projectId));
     }

+ 5 - 25
web/src/main/java/cn/seecoder/web/controller/tree/TreeNodesController.java

@@ -1,18 +1,14 @@
 package cn.seecoder.web.controller.tree;
 
 
+import cn.seecoder.common.exceptions.ServiceException;
+import cn.seecoder.web.model.vo.Response;
 import cn.seecoder.web.model.vo.tree.TreeNodeCreateVO;
 import cn.seecoder.web.model.vo.tree.TreeNodeUpdateBasicVO;
 import cn.seecoder.web.model.vo.tree.TreeNodeVO;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiOperation;
+import cn.seecoder.web.service.tree.TreeNodeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import cn.seecoder.common.exceptions.ServiceException;
-import cn.seecoder.web.dao.tree.TreeNodeMapper;
-import cn.seecoder.web.model.vo.Response;
-import cn.seecoder.web.service.tree.TreeNodeService;
 
 import java.util.List;
 
@@ -20,59 +16,43 @@ import java.util.List;
  * @Author cyz,xzh
  * @Description 需求树相关操作
  */
-@Api(tags = "需求相关API")
+
 @RestController
 @RequestMapping("/tree")
 public class TreeNodesController {
     @Autowired
     private TreeNodeService treeNodeService;
 
-    /**
-     * 获取某个项目所有需求情况
-     * @param projectId
-     * @return
-     */
-    @ApiOperation(value = "获取project_id对应的所有nodes",httpMethod = "GET")
     @GetMapping("/{projectId}")
-    @ApiImplicitParam(value = "projectId", dataType ="int", paramType = "path")
     public Response<List<TreeNodeVO>> listTreeNodesByProjectId(@PathVariable("projectId") int projectId){
         return Response.buildSuccess(treeNodeService.listTreeNodesByProjectId(projectId));
     }
 
-    @ApiOperation(value = "插入节点", httpMethod = "POST")
-    @ApiImplicitParam(value = "treeNodeCreateVO",dataType ="object", paramType = "body")
     @PostMapping("/node")
     public Response insertTreeNode(@RequestBody TreeNodeCreateVO treeNodeCreateVO) throws ServiceException {
         treeNodeService.insertTreeNode(treeNodeCreateVO);
         return Response.buildSuccess();
     }
 
-    @ApiOperation(value = "根据nodeId删除节点", httpMethod = "DELETE")
     @DeleteMapping("/node/{nodeId}")
-    @ApiImplicitParam(value = "nodeId",dataType ="int", paramType = "path")
     public Response deleteTreeNode(@PathVariable("nodeId") int nodeId) throws ServiceException {
         treeNodeService.deleteTreeNode(nodeId);
         return Response.buildSuccess();
     }
-    @ApiOperation(value = "根据父节点fatherId创建一个子节点并返回", httpMethod = "POST")
+
     @PostMapping("/subNode/{fatherId}")
-    @ApiImplicitParam(value = "fatherId",dataType ="int", paramType = "path")
     public Response insertTreeNodeByFatherNode(@PathVariable("fatherId") int fatherId) throws ServiceException {
         treeNodeService.insertTreeNodeByFatherNode(fatherId);
         return Response.buildSuccess();
     }
 
-    @ApiOperation(value = "修改节点属性", httpMethod = "PUT")
     @PutMapping("/node")
-    @ApiImplicitParam(value = "treeNodeUpdateBasicVO",dataType = "object", paramType = "body")
     public Response updateTreeNode(@RequestBody TreeNodeUpdateBasicVO treeNodeUpdateBasicVO){
         treeNodeService.updateTreeNode(treeNodeUpdateBasicVO);
         return Response.buildSuccess();
     }
 
-    @ApiOperation(value = "根据项目id返回某个项目所有type为task的节点", httpMethod = "GET")
     @GetMapping("/node/type/task/{projectId}")
-    @ApiImplicitParam(value = "projectId",dataType = "int", paramType = "path")
     public Response getNodesWithTaskTypeByProjectId(@PathVariable("projectId") int projectId){
         List<TreeNodeVO> nodesWithTaskTypeByProjectId = treeNodeService.getNodesWithTaskTypeByProjectId(projectId);
         return Response.buildSuccess(nodesWithTaskTypeByProjectId);

+ 0 - 8
web/src/main/java/cn/seecoder/web/controller/user/UserController.java

@@ -5,9 +5,6 @@ import cn.seecoder.web.model.vo.Response;
 import cn.seecoder.web.model.vo.user.GitlabUserCreateVO;
 import cn.seecoder.web.model.vo.user.UserVO;
 import cn.seecoder.web.service.user.UserService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -18,7 +15,6 @@ import org.springframework.web.bind.annotation.*;
  */
 @RestController
 @RequestMapping("/users")
-@Api(tags = "用户 api")
 public class UserController {
 
     private final UserService userService;
@@ -28,18 +24,14 @@ public class UserController {
         this.userService = userService;
     }
 
-    @ApiOperation(value = "创建gitlab用户", httpMethod = "POST")
     @PostMapping("/gitlab")
-    @ApiImplicitParam(value = "vo",dataType = "object", paramType = "body")
     public Response createGitlabUser(@RequestBody GitlabUserCreateVO vo) throws ServiceException {
         userService.createGitlabUser(vo);
         return Response.buildSuccess();
     }
 
-    @ApiOperation(value = "获取当前登陆的用户信息", httpMethod = "GET")
     @GetMapping("/self")
     public Response<UserVO> getLoginUser(){
         return Response.buildSuccess(userService.getLoginUser());
     }
-
 }

+ 7 - 0
web/src/main/java/cn/seecoder/web/service/branch/BranchService.java

@@ -5,7 +5,14 @@ import com.nju.edu.gitlab.vo.BranchVO;
 import java.util.List;
 
 public interface BranchService {
+
+    /**
+     * 项目下的所有分支信息
+    */
     List<BranchVO> getAllBranches(Integer projectId);
 
+    /**
+     * 通过分支名得到信息
+    */
     BranchVO getBranchByName(Integer projectId, String branchName);
 }

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

@@ -15,8 +15,14 @@ import java.util.List;
  */
 public interface BugListService {
 
+    /**
+     * 创建
+    */
     void create(BugListCreateVO bugListCreateVO);
 
+    /**
+     * 查找项目下所有的bug
+    */
     List<BugListVO> list(Integer projectId);
 
     /**

+ 18 - 14
web/src/main/java/cn/seecoder/web/service/commit/CommitLinkService.java

@@ -2,35 +2,39 @@ package cn.seecoder.web.service.commit;
 
 import cn.seecoder.web.model.enums.CommitRelatedEnum;
 import cn.seecoder.web.model.po.commit.CommitPO;
-import cn.seecoder.web.model.vo.commit.GitWebHookVO;
 import cn.seecoder.web.model.vo.commit.CommitVO;
+import cn.seecoder.web.model.vo.commit.GitWebHookVO;
 
 import java.util.List;
 
 public interface CommitLinkService {
+    /**
+     * 通过webhook返回的信息对commit解析
+    */
     void linkCommitByInfoFromGitlab(GitWebHookVO gitWebHookVO);
 
-    void saveLinkedCommit(CommitPO po);
     /**
-     * 不同分支可能会push相同的commit,分析过的commit不应该再分析,这里是判断是否分析共没有
-     * @param id commit hash id
-     */
-    boolean isLinked(String id);
-
+     * 得到treeId下的所有commit
+    */
     List<CommitVO> getTreeLinkedCommits(Integer treeId);
 
+    /**
+     * 得到bugId下的所有commit
+     */
     List<CommitVO> getBugLinkedCommits(Integer bugId);
 
+    /**
+     * 得到项目下所有解析过的commit
+    */
     List<CommitVO> getLinkedCommits(Integer projectId);
 
-    CommitPO getLinkedCommit(String hash);
     /**
-     * link commit and tree node or bug
-     * @param projectId
-     * @param commitHash
-     * @param relatedType
-     * @param relatedId
-     * @return
+     * 强制解析commit到某个tree或者bugId下
      */
     boolean link(Integer projectId, String commitHash, CommitRelatedEnum relatedType, Integer relatedId);
+
+    /**
+     * 通过id获得已经解析的commit信息
+    */
+    CommitPO getLinkedCommit(String hash);
 }

+ 9 - 0
web/src/main/java/cn/seecoder/web/service/commit/CommitService.java

@@ -16,9 +16,18 @@ import java.util.Set;
  * @description: 项目相关的 git commit 记录分析功能
  */
 public interface CommitService {
+    /**
+     * 查找项目下分支的所有commit
+    */
     List<CommitVO> getCommitsByBranchName(Integer projectId, String branchName);
 
+    /**
+     * 通过commit的id获得commit信息
+    */
     CommitVO getCommitByHash(Integer projectId, String hash);
 
+    /**
+     * 查看两次commit之间的差异
+    */
     Set<DiffVO> getDiff(Integer projectId, String fromHash, String toHash);
 }

+ 7 - 2
web/src/main/java/cn/seecoder/web/service/impl/branch/BranchServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.seecoder.web.service.impl.branch;
 
 import cn.seecoder.web.service.branch.BranchService;
+import cn.seecoder.web.service.commit.CommitService;
 import com.nju.edu.gitlab.SeecoderGitlabApi;
 import com.nju.edu.gitlab.SeecoderGitlabException;
 import com.nju.edu.gitlab.vo.BranchVO;
@@ -12,12 +13,16 @@ import java.util.List;
 @Service
 public class BranchServiceImpl implements BranchService {
 
+    private final SeecoderGitlabApi seecoderGitlabApi;
+
     @Autowired
-    SeecoderGitlabApi seecoderGitlabApi;
+    public BranchServiceImpl(SeecoderGitlabApi seecoderGitlabApi){
+        this.seecoderGitlabApi = seecoderGitlabApi;
+    }
 
     @Override
     public List<BranchVO> getAllBranches(Integer projectId) {
-        List<BranchVO> branches = null;
+        List<BranchVO> branches;
         try {
             branches = seecoderGitlabApi.getProjectBranches(projectId);
         } catch (SeecoderGitlabException e) {

+ 20 - 54
web/src/main/java/cn/seecoder/web/service/impl/bug_list/BugListServiceImpl.java

@@ -67,76 +67,44 @@ public class BugListServiceImpl implements BugListService {
                 .processorId(vo.getProcessorId())
                 .build();
         bugListMapper.insert(po);
-        int bugId = bugListMapper.selectMaxId();
 
         //ANA 日志需要打出新建的bugInfo信息
-//        try{
-//            BugListPO bugPo = bugListMapper.selectById(bugId);
-//            JSONObject object = new JSONObject();
-//            object.put("bug_id",bugPo.getId());
-//            object.put("project_id",bugPo.getProjectId());
-//            object.put("user_id",bugPo.getProcessorId());
-//            object.put("priority",bugPo.getPriority());
-//            object.put("title",bugPo.getTitle());
-//            object.put("description",bugPo.getDescription());
-//            object.put("timeToTake",bugPo.getTimeToTake());
-//            object.put("bug_state",bugPo.getState());
-//
-//            String data = com.alibaba.fastjson.JSONObject.toJSONString(object);
-//            LogTrackingUtil.log(data, OpType.CREATE_OR_MODIFY_BUGLIST);
-//
-//        }catch (Exception e){}
         try{
+            int bugId = bugListMapper.selectMaxId();
+            BugListPO bugPo = bugListMapper.selectById(bugId);
             JSONObject object = new JSONObject();
-//            object.put("bug_id",123);
-            object.put("bug_id",bugId);
-            object.put("project_id",po.getProjectId());
-            object.put("user_id",po.getProcessorId());
-            object.put("priority",po.getPriority());
-            object.put("title",po.getTitle());
-            object.put("description",po.getDescription());
-            object.put("timeToTake",po.getTimeToTake());
-            object.put("bug_state",po.getState());
+            object.put("bug_id",bugPo.getId());
+            object.put("project_id",bugPo.getProjectId());
+            object.put("user_id",bugPo.getProcessorId());
+            object.put("priority",bugPo.getPriority());
+            object.put("title",bugPo.getTitle());
+            object.put("description",bugPo.getDescription());
+            object.put("timeToTake",bugPo.getTimeToTake());
+            object.put("bug_state",bugPo.getState());
 
             String data = com.alibaba.fastjson.JSONObject.toJSONString(object);
             LogTrackingUtil.log(data, OpType.CREATE_OR_MODIFY_BUGLIST);
 
         }catch (Exception e){}
+
     }
 
     @Override
     public List<BugListVO> list(Integer projectId) {
         List<ProjectRelatedPO> related = projectRelatedMapper.selectByProjectId(projectId);
         List<BugListPO> bugs = bugListMapper.selectByProjectId(projectId);
-        // 相关项目的bug一并展示
-//        for (ProjectRelatedPO po:related) {
-//            System.out.println(po.getProjectIdA());
-//            System.out.println(po.getProjectIdB());
-//            if (po.getProjectIdA().intValue() == projectId) {
-//                System.out.println("idA = id");
-//                System.out.println(bugListMapper.selectByProjectId(po.getProjectIdB()).size());
-//                bugs.addAll(bugListMapper.selectByProjectId(po.getProjectIdB()));
-//            } else {
-//                System.out.println("idB = id");
-//                System.out.println(bugListMapper.selectByProjectId(po.getProjectIdA()).size());
-//                bugs.addAll(bugListMapper.selectByProjectId(po.getProjectIdA()));
-//            }
-//        }
-        // 注意:这边判断id是否相等要加 .intValue()
         for (ProjectRelatedPO po : related){
             bugs.addAll(bugListMapper.selectByProjectId(po.getProjectIdA().intValue() != projectId? po.getProjectIdA() : po.getProjectIdB()));
         }
-
-
-        //List<CommitPO> commits = commitMapper.selectByProjectIdAndType(projectId, CommitRelatedEnum.BUG_ID);
-        //Map<Integer, List<CommitPO>> commitsMap = commits.stream().collect(Collectors.groupingBy(CommitPO::getRelatedId));
-        List<Integer> userIds = bugs.stream().map(x -> {
-            Integer userId = x.getProcessorId();
-            return userId != null? userId : -1;
-        }).filter(x -> x!=-1).collect(Collectors.toList());
+        List<Integer> userIds = bugs.stream()
+                .map(x -> {Integer userId = x.getProcessorId();return userId != null? userId : -1;})
+                .filter(x -> x!=-1)
+                .collect(Collectors.toList());
         List<UserPO> users = userIds.size()==0? new ArrayList<>() :userMapper.selectByIds(userIds);
-        Map<Integer, String> usernameMap = users.stream().collect(Collectors.toMap(UserPO::getId, UserPO::getUsername));
-        return bugs.stream().map(x -> new BugListVO(x, usernameMap.getOrDefault(x.getProcessorId(), "no one"))).collect(Collectors.toList());
+        Map<Integer, String> usernameMap = users.stream()
+                .collect(Collectors.toMap(UserPO::getId, UserPO::getUsername));
+        return bugs.stream().map(x -> new BugListVO(x, usernameMap.getOrDefault(x.getProcessorId(), "no one")))
+                .collect(Collectors.toList());
     }
 
 
@@ -204,8 +172,6 @@ public class BugListServiceImpl implements BugListService {
 
     @Override
     public BugListPO getBugById(Integer id) {
-        BugListPO bugListPO = bugListMapper.selectById(id);
-        return bugListPO;
-//        return new BugListVO(bugListPO, userMapper.select(bugListPO.getProcessorId()).getUsername());
+        return bugListMapper.selectById(id);
     }
 }

+ 3 - 19
web/src/main/java/cn/seecoder/web/service/impl/commit/CommitLinkServiceImpl.java

@@ -41,24 +41,13 @@ public class CommitLinkServiceImpl implements CommitLinkService {
     @Override
     public void linkCommitByInfoFromGitlab(GitWebHookVO gitWebHookVO) {
 
-//
-//        List<String> emails = new ArrayList<>();
-//        emails.add(gitWebHookVO.getUser_email());
-//        List<GitlabUserEmailDTO> users;
-//        try {
-//            users = seecoderGitlabApi.findUserByEmails(emails);
-//        } catch (SeecoderGitlabException e) {
-//            throw new ServiceException("统一代码服务出现访问错误,无法正确分析webhook信息");
-//        }
-//        Integer userId = users.size()!=0 ? users.get(0).getUserId() : null;
-
         Integer projectId = gitWebHookVO.getProject_id();
         for (GitWebHookVO.Commit commit: gitWebHookVO.getCommits()){
             if (this.isLinked(commit.getId())){
-                //已经解析过了
                 log.info("Commits 已经解析过了, id: {}", commit.getId());
                 continue;
             }
+
             //ANA 日志需要打出用户的commit信息
             JSONObject object = new JSONObject();
             try{
@@ -69,10 +58,7 @@ public class CommitLinkServiceImpl implements CommitLinkService {
                 object.put("message",commit.getMessage());
             }catch (Exception ignored){}
 
-
             log.info("resolving commit id : {}, title : {}, message : {}", commit.getId(), commit.getTitle(), commit.getMessage());
-            //todo 注意目前分析的是 message
-            // 应该分析 title 还是 message 与学生的提交规范有关
             CommitRule rule = CommitResolver.resolve(commit.getMessage());
             if (rule == null){
                 log.info("Commits 不符合规范, id: {}", commit.getId());
@@ -113,8 +99,7 @@ public class CommitLinkServiceImpl implements CommitLinkService {
         }
     }
 
-    @Override
-    public void saveLinkedCommit(CommitPO po) {
+    private void saveLinkedCommit(CommitPO po) {
 
         //ANA 日志需要打出用户commit的信息
         try{
@@ -134,8 +119,7 @@ public class CommitLinkServiceImpl implements CommitLinkService {
         commitMapper.insert(po);
     }
 
-    @Override
-    public boolean isLinked(String id) {
+    private boolean isLinked(String id) {
         return 1 == commitMapper.isExist(id);
     }
 

+ 10 - 28
web/src/main/java/cn/seecoder/web/service/impl/commit/CommitServiceImpl.java

@@ -1,38 +1,19 @@
 package cn.seecoder.web.service.impl.commit;
 
-import cn.seecoder.api.ApplicationProperties;
-import cn.seecoder.common.util.LogTrackingUtil;
-import cn.seecoder.common.util.OpType;
-import cn.seecoder.web.dao.commit.CommitQualityMapper;
-import cn.seecoder.web.dao.user.UserMapper;
 import cn.seecoder.web.model.enums.CommitCheckResultEnum;
 import cn.seecoder.web.model.enums.CommitRelatedEnum;
-import cn.seecoder.web.model.po.bug_list.BugListPO;
-import cn.seecoder.web.model.po.commit.CommitQualityPO;
-import cn.seecoder.web.model.po.tree.TreeNodePO;
-import cn.seecoder.web.model.vo.commit.CommitQualityVO;
+import cn.seecoder.web.model.po.commit.CommitPO;
 import cn.seecoder.web.model.vo.commit.CommitVO;
-import cn.seecoder.web.model.vo.hook.SonarResultHookVO;
-import cn.seecoder.web.service.bug_list.BugListService;
 import cn.seecoder.web.service.commit.CommitLinkService;
 import cn.seecoder.web.service.commit.CommitQualityService;
-import cn.seecoder.web.service.tree.TreeNodeService;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
+import cn.seecoder.web.service.commit.CommitService;
 import com.nju.edu.gitlab.SeecoderGitlabApi;
 import com.nju.edu.gitlab.vo.DiffVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import cn.seecoder.web.dao.commit.CommitMapper;
-import cn.seecoder.web.model.po.commit.CommitPO;
-import cn.seecoder.web.service.commit.CommitService;
 
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @author PuHong Weng
@@ -45,20 +26,21 @@ public class CommitServiceImpl implements CommitService {
 
     private final SeecoderGitlabApi seecoderGitlabApi;
 
+    private final CommitLinkService commitLinkService;
+
+    private final CommitQualityService commitQualityService;
+
     @Autowired
-    public CommitServiceImpl(SeecoderGitlabApi seecoderGitlabApi) {
+    public CommitServiceImpl(SeecoderGitlabApi seecoderGitlabApi,CommitLinkService commitLinkService,CommitQualityService commitQualityService) {
         this.seecoderGitlabApi = seecoderGitlabApi;
+        this.commitLinkService = commitLinkService;
+        this.commitQualityService = commitQualityService;
     }
 
-    @Autowired
-    private CommitLinkService commitLinkService;
-    @Autowired
-    private CommitQualityService commitQualityService;
-
 
     @Override
     public List<CommitVO> getCommitsByBranchName(Integer projectId, String BranchName) {
-        List<CommitVO> allCommits = new ArrayList<CommitVO>();
+        List<CommitVO> allCommits = new ArrayList<>();
         Map<String, CommitCheckResultEnum> commitsQualityMapByProjectId = commitQualityService.getCommitsQualityMapByProjectId(projectId);
 
         try{

+ 41 - 15
web/src/main/java/cn/seecoder/web/service/impl/project/ProjectServiceImpl.java

@@ -28,7 +28,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Queue;
 import java.util.stream.Collectors;
 
 @Service
@@ -66,21 +68,28 @@ public class ProjectServiceImpl implements ProjectService {
             projects = seecoderGitlabApi.getAllProjectsByUserId(userId);
 
             //同步数据,有可能gitlab那边有的项目我们这边没有
-            List<ProjectPO> pos = projects.stream().filter(x -> projectMapper.getProjectById(x.getProjectId()) == null).map(ProjectPO::new).collect(Collectors.toList());
+            List<ProjectPO> pos = projects.stream()
+                    .filter(x -> projectMapper.getProjectById(x.getProjectId()) == null)
+                    .map(ProjectPO::new)
+                    .collect(Collectors.toList());
+
             if (pos.size() != 0) {
                 for (ProjectPO po : pos) {
                     seecoderGitlabApi.addWebHook(po.getId(), properties.getGitlab().getWebhookProxy(), true, false, false);
-                    log.info("项目Id是{},名称是{}",po.getId(),po.getName());
                     projectMapper.insertProject(po);
-                    log.info("同步成功");
                 }
             }
         } catch (SeecoderGitlabException e) {
             throw new ServiceException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "获取项目列表失败", e);
         }
-        List<Integer> projectIds = projects.stream().map(com.nju.edu.gitlab.vo.ProjectVO::getProjectId).collect(Collectors.toList());
-
-        return projectIds.size() == 0 ? new ArrayList<>() : projectMapper.selectByIds(projectIds).stream().map(ProjectVO::new).collect(Collectors.toList());
+        List<Integer> projectIds = projects.stream()
+                .map(com.nju.edu.gitlab.vo.ProjectVO::getProjectId)
+                .collect(Collectors.toList());
+
+        return projectIds.size() == 0 ? new ArrayList<>() :
+                projectMapper.selectByIds(projectIds).stream()
+                        .map(ProjectVO::new)
+                        .collect(Collectors.toList());
     }
 
     @Override
@@ -94,8 +103,11 @@ public class ProjectServiceImpl implements ProjectService {
         ProjectPO po = new ProjectPO();
         BeanUtils.copyProperties(vo, po);
         try {
-            if(vo.getVisibility()==null) vo.setVisibility("private");
-            com.nju.edu.gitlab.vo.ProjectVO project = seecoderGitlabApi.createPrivateProject(po.getName(), vo.getVisibility().equals("public")?VisibilityForm.PUBLIC:VisibilityForm.PRIVATE, UserService.loginUser().getId());
+            if (vo.getVisibility()==null){
+                vo.setVisibility("private");
+            }
+            com.nju.edu.gitlab.vo.ProjectVO project = seecoderGitlabApi.createPrivateProject
+                    (po.getName(), vo.getVisibility().equals("public")?VisibilityForm.PUBLIC:VisibilityForm.PRIVATE, UserService.loginUser().getId());
             log.info("项目可见性为:{}", vo.getVisibility());
             po.setId(project.getProjectId());
             po.setGitRemoteUrl(project.getWebUrl());
@@ -151,7 +163,6 @@ public class ProjectServiceImpl implements ProjectService {
 
     @Override
     public void addMember(Integer projectId, Integer userId) throws ServiceException {
-//        Integer userId = userMapper.selectIdByPhone(phone);
         if(userId == null){
             throw new ServiceException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "该手机号不存在对应用户");
         }
@@ -222,13 +233,28 @@ public class ProjectServiceImpl implements ProjectService {
 
     @Override
     public List<ProjectVO> getRelatedProjects(Integer projectId) {
-        List<ProjectRelatedPO> projectRelatedPOS = projectRelatedMapper.selectByProjectId(projectId);
+        Queue<Integer> queue=new LinkedList<>();
+        queue.offer(projectId);
         List<Integer> projectIds = new ArrayList<>();
-        for (ProjectRelatedPO projectRelatedPO : projectRelatedPOS) {
-            int projectIdA = projectRelatedPO.getProjectIdA();
-            int projectIdB = projectRelatedPO.getProjectIdB();
-            projectIds.add(projectIdA == projectId ? projectIdB : projectIdA);
+        projectIds.add(projectId);
+        while (!queue.isEmpty()){
+            Integer project=queue.poll();
+            List<ProjectRelatedPO> projectRelatedPOS = projectRelatedMapper.selectByProjectId(project);
+            for (ProjectRelatedPO projectRelatedPO : projectRelatedPOS) {
+                if (!projectIds.contains(projectRelatedPO.getProjectIdA())){
+                    projectIds.add(projectRelatedPO.getProjectIdA());
+                    queue.offer(projectRelatedPO.getProjectIdA());
+                }
+                if (!projectIds.contains(projectRelatedPO.getProjectIdB()){
+                    projectIds.add(projectRelatedPO.getProjectIdB());
+                    queue.offer(projectRelatedPO.getProjectIdB());
+                }
+            }
         }
-        return projectIds.size() == 0 ? new ArrayList<>() : projectMapper.selectByIds(projectIds).stream().map(ProjectVO::new).collect(Collectors.toList());
+        projectIds.remove(0);
+        return projectIds.size() == 0 ? new ArrayList<>() :
+                projectMapper.selectByIds(projectIds).stream()
+                        .map(ProjectVO::new)
+                        .collect(Collectors.toList());
     }
 }

+ 1 - 1
web/src/main/java/cn/seecoder/web/service/impl/sql/SqlServiceImpl.java

@@ -48,7 +48,7 @@ public class SqlServiceImpl implements SqlService {
         }
 
         DeploymentPO deployment = deploymentMapper.selectById(deploymentId);
-        UserService.projectAuthentication(pipelineMapper.selectById(deployment.getPipelineId()).getProjectId());
+       // UserService.projectAuthentication(pipelineMapper.selectById(deployment.getPipelineId()).getProjectId());
         String url = deploymentMapper.selectById(deploymentId).getAccessUrl();
 
         String dbUrl = DB_URL_PREFIX + url + "/" + db + DB_URL_SUFFIX;

+ 21 - 32
web/src/main/java/cn/seecoder/web/service/impl/tree/TreeNodeServiceImpl.java

@@ -36,6 +36,10 @@ public class TreeNodeServiceImpl implements TreeNodeService {
 
     private final CommitMapper commitMapper;
 
+    private final String DEFAULT_EPIC_NODE = "默认战略举措节点";
+
+    private final String DEFAULT_EPIC_DESCRIPTION = "Epic节点\n例如:打造一个学习成果测试及学习交流的平台便于学生更好的开发工作";
+
     private final String DEFAULT_FEATURE_NODE = "默认特性节点";
 
     private final String DEFAULT_FEATURE_DESCRIPTION = "特性(Feature)节点\n例如:提供课堂测验功能便于学生对所学内容及时巩固";
@@ -67,8 +71,8 @@ public class TreeNodeServiceImpl implements TreeNodeService {
                     .startTime(format.format(new Date()))
                     .projectId(projectId)
                     .state(NodeStateEnum.CREATED)
-                    .title("默认战略举措节点")
-                    .description("Epic节点\n例如:打造一个学习成果测试及学习交流的平台便于学生更好的开发工作")
+                    .title(DEFAULT_EPIC_NODE)
+                    .description(DEFAULT_EPIC_DESCRIPTION)
                     .priority(PriorityEnum.MIDDLE)
                     .type(NodeTypeEnum.REQUIREMENT)
                     .timeToTake(0L)
@@ -86,7 +90,6 @@ public class TreeNodeServiceImpl implements TreeNodeService {
         TreeNodePO treeNodePO = new TreeNodePO();
         BeanUtils.copyProperties(treeNodeCreateVO,treeNodePO);
         int res = treeNodeMapper.insertTreeNode(treeNodePO);
-        // TODO:safety check
         if (res <= 0) {
             throw new ServiceException(503,"插入需求节点失败");
         }
@@ -155,8 +158,8 @@ public class TreeNodeServiceImpl implements TreeNodeService {
                 TreeNodePO toDelete = trees.pop();
                 nodes.add(toDelete.getId());
                 treeNodeMapper.deleteTreeNode(toDelete.getId());
-                List<TreeNodePO> childs = treeNodeMapper.getTreeNodesByParentId(toDelete.getId());
-                for (TreeNodePO child : childs){
+                List<TreeNodePO> children = treeNodeMapper.getTreeNodesByParentId(toDelete.getId());
+                for (TreeNodePO child : children){
                     trees.push(child);
                 }
             }
@@ -182,7 +185,7 @@ public class TreeNodeServiceImpl implements TreeNodeService {
     public void insertTreeNodeByFatherNode(int fatherId) throws ServiceException {
         SimpleDateFormat format = DateUtil.getSimpleDateFormat();
         TreeNodePO father = treeNodeMapper.getTreeNodeById(fatherId);
-        if (father.getDeep()==5){
+        if (father.getDeep()==4){
             throw new ServiceException("不能继续创建子节点,深度最大为4");
         }
         NodeTypeEnum nodeTypeEnum = null;
@@ -246,28 +249,6 @@ public class TreeNodeServiceImpl implements TreeNodeService {
         return treeNodeMapper.getTreeNodeById(nodeId);
     }
 
-    /**
-     * 创建一个default的节点
-     */
-    private TreeNodePO getDefaultTreeNodePO() {
-        SimpleDateFormat format = DateUtil.getSimpleDateFormat();
-
-        TreeNodePO treeNodePO = new TreeNodePO();
-        treeNodePO.setTitle("title");
-        treeNodePO.setDescription("description");
-        treeNodePO.setType(NodeTypeEnum.TASK);
-        treeNodePO.setPriority(PriorityEnum.MIDDLE);
-        treeNodePO.setState(NodeStateEnum.CREATED);
-        treeNodePO.setTimeToTake(10L);
-        treeNodePO.setStartTime(format.format(new Date()));
-        treeNodePO.setEndTime(format.format(new Date()));
-        treeNodePO.setLeaf(true);
-        treeNodePO.setProjectId(-1);
-        treeNodePO.setDeep(-1);
-        treeNodePO.setId(1);
-        return treeNodePO;
-    }
-
     @Override
     public void updateNodeState(Integer id, CommitState state) {
         TreeNodePO po = new TreeNodePO();
@@ -294,10 +275,18 @@ public class TreeNodeServiceImpl implements TreeNodeService {
             return new ArrayList<>();
         }
         int projectId = nodesPO.get(0).getProjectId();
-        List<Integer> userIds = nodesPO.stream().filter(x->x.getProcessorId()!=null).map(TreeNodePO::getProcessorId).collect(Collectors.toList());
-        Map<Integer,String> usernameMap = userIds.size() == 0? new HashMap<>() : userMapper.selectByIds(userIds).stream().collect(Collectors.toMap(UserPO::getId, UserPO::getUsername));
+        List<Integer> userIds = nodesPO.stream()
+                .map(TreeNodePO::getProcessorId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        Map<Integer,String> usernameMap = userIds.size() == 0? new HashMap<>() :
+                userMapper.selectByIds(userIds).stream()
+                        .collect(Collectors.toMap(UserPO::getId, UserPO::getUsername));
         List<CommitPO> commits = commitMapper.selectByProjectIdAndType(projectId, CommitRelatedEnum.TREE_ID);
-        Map<Integer, List<CommitPO>> commitsMap = commits.stream().collect(Collectors.groupingBy(CommitPO::getRelatedId));
-        return nodesPO.stream().map(po -> new TreeNodeVO(po,usernameMap.getOrDefault(po.getProcessorId(),"no one"),commitsMap.getOrDefault(po.getId(),new ArrayList<>()))).collect(Collectors.toList());
+        Map<Integer, List<CommitPO>> commitsMap = commits.stream()
+                .collect(Collectors.groupingBy(CommitPO::getRelatedId));
+        return nodesPO.stream()
+                .map(po -> new TreeNodeVO(po,usernameMap.getOrDefault(po.getProcessorId(),"no one"),commitsMap.getOrDefault(po.getId(),new ArrayList<>())))
+                .collect(Collectors.toList());
     }
 }

+ 0 - 1
web/src/main/java/cn/seecoder/web/service/impl/user/UserServiceImpl.java

@@ -81,5 +81,4 @@ public class UserServiceImpl implements UserService, UserDetailsService {
 		return null;
 	}
 
-
 }

+ 9 - 0
web/src/main/java/cn/seecoder/web/service/project/ProjectService.java

@@ -28,10 +28,19 @@ public interface ProjectService {
      */
     ProjectVO createProject(ProjectCreateVO vo) throws ServiceException;
 
+    /**
+     * 通过电话号码添加成员
+    */
     void addMember(Integer projectId, String phone) throws ServiceException;
 
+    /**
+     * 直接添加用户成员
+    */
     void addMember(Integer projectId, Integer userId) throws ServiceException;
 
+    /**
+     * 获得项目成员
+    */
     List<UserVO> getProjectMembers(Integer projectId) throws ServiceException;
 
     /**

+ 6 - 2
web/src/main/java/cn/seecoder/web/service/tree/TreeNodeService.java

@@ -14,8 +14,6 @@ import java.util.List;
 
 public interface TreeNodeService {
 
-//    List<TreeNodeVO> getAllNodes();
-
     /**
      * 根据项目id获取该项目下的treeNode
      * @param projectId
@@ -48,6 +46,9 @@ public interface TreeNodeService {
     void insertTreeNodeByFatherNode(int fatherId) throws ServiceException;
 
 
+    /**
+     * 查找任务类型的node节点
+    */
     List<TreeNodeVO> getNodesWithTaskTypeByProjectId(int projectId);
 
     /**
@@ -57,5 +58,8 @@ public interface TreeNodeService {
      */
     TreeNodePO getNodeByNodeId(int nodeId);
 
+    /**
+     * 更新节点状态
+    */
     void updateNodeState(Integer id, CommitState state);
 }

+ 6 - 29
web/src/main/java/cn/seecoder/web/service/user/UserService.java

@@ -1,25 +1,22 @@
 package cn.seecoder.web.service.user;
 
 
-import cn.seecoder.common.exceptions.AccessDeniedException;
 import cn.seecoder.common.exceptions.ServiceException;
-import cn.seecoder.common.util.SpringUtil;
 import cn.seecoder.web.model.po.user.UserPO;
 import cn.seecoder.web.model.vo.user.GitlabUserCreateVO;
 import cn.seecoder.web.model.vo.user.UserVO;
-import com.nju.edu.gitlab.SeecoderGitlabApi;
-import com.nju.edu.gitlab.SeecoderGitlabException;
-import com.nju.edu.gitlab.vo.ProjectVO;
-import org.apache.http.HttpStatus;
 import org.springframework.security.core.context.SecurityContextHolder;
 
-import java.util.List;
-
 public interface UserService {
 
+    /**
+     * 创建一个gitlab用户
+    */
     UserVO createGitlabUser(GitlabUserCreateVO vo) throws ServiceException;
 
-
+    /**
+     * 获取当前用户信息
+    */
     UserVO getLoginUser();
 
     /**
@@ -29,24 +26,4 @@ public interface UserService {
         return (UserPO) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
     }
 
-    /**
-     * 判断用户是否有权限修改这些流水线配置,用户必须所属这谢谢项目,才具有权限
-     * 防止用户修改提交的参数从而修改其他组的流水线
-     * todo 所有涉及项目、用户的功能都必须查看此用户有无此项目的权限
-     *  但是gitlab那边接口没测所以没有办法
-     */
-    static void projectAuthentication(Integer projectId) throws ServiceException {
-        // UserPO userPO = UserService.loginUser();
-        // SeecoderGitlabApi seecoderGitlabApi = SpringUtil.getBean(SeecoderGitlabApi.class);
-        // try {
-        //     List<ProjectVO> projects = seecoderGitlabApi.getAllProjectsByUserId(userPO.getId());
-        //     if (projects.stream().noneMatch(project -> project.getProjectId()==projectId)){
-        //         throw new AccessDeniedException("您没有操作此项目的权限");
-        //     }
-        // } catch (SeecoderGitlabException e) {
-        //     e.printStackTrace();
-        //     throw new ServiceException(HttpStatus.SC_SERVICE_UNAVAILABLE, e);
-        // }
-
-    }
 }