Ver Fonte

feat: seecoder-gitlab 对接

370774330@qq.com há 5 anos atrás
pai
commit
d9dd7a1219

+ 3 - 3
web/src/main/java/seecoder/devcloud/web/controller/project/ProjectController.java

@@ -36,7 +36,7 @@ public class ProjectController {
     @ApiOperation(value = "根据user获取Project列表", httpMethod = "GET")
     @GetMapping("/listByUser/{userId}")
     @ApiImplicitParam(value = "userId",dataType ="int", paramType = "path")
-    public Response<List<ProjectVO>> listProjectsByUserId(@PathVariable("userId")int userId){
+    public Response<List<ProjectVO>> listProjectsByUserId(@PathVariable("userId")int userId) throws ServiceException {
         return Response.buildSuccess(projectService.listProjectsByUserId(userId));
     }
 
@@ -57,7 +57,7 @@ public class ProjectController {
     @ApiOperation(value = "获取一个项目所有成员信息", httpMethod = "GET")
     @GetMapping("/members")
     @ApiImplicitParam(name = "projectId", dataType = "int", paramType = "query")
-    public Response<List<UserVO>> getProjectMember(@RequestParam("projectId") Integer projectId){
+    public Response<List<UserVO>> getProjectMember(@RequestParam("projectId") Integer projectId) throws ServiceException {
         return Response.buildSuccess(projectService.getProjectMembers(projectId));
     }
 
@@ -67,7 +67,7 @@ public class ProjectController {
             @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){
+    public Response addMember(@RequestParam("projectId") Integer projectId,@RequestParam("userId") Integer userId) throws ServiceException {
         projectService.addMember(projectId, userId);
         return Response.buildSuccess();
     }

+ 10 - 5
web/src/main/java/seecoder/devcloud/web/dao/project/ProjectMapper.java

@@ -1,12 +1,11 @@
 package seecoder.devcloud.web.dao.project;
 
-import org.apache.ibatis.annotations.InsertProvider;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Select;
-import org.apache.ibatis.annotations.UpdateProvider;
+import org.apache.ibatis.annotations.*;
 import seecoder.devcloud.web.dao.provider.GeneralInsertUpdateSqlProvider;
 import seecoder.devcloud.web.model.po.project.ProjectPO;
 
+import java.util.List;
+
 @Mapper
 public interface ProjectMapper {
 
@@ -19,5 +18,11 @@ public interface ProjectMapper {
     @Select("select * from project where id=#{projectId}")
     ProjectPO getProjectById(int projectId);
 
-
+    @Select("<script>" +
+            "SELECT * " +
+            "   FROM project" +
+            "   WHERE id in" +
+            "   <foreach collection='ids' open='(' item='id' separator=',' close=')'> #{id}</foreach>" +
+            "</script>")
+    List<ProjectPO> selectByIds(@Param("ids") List<Integer> ids);
 }

+ 2 - 0
web/src/main/java/seecoder/devcloud/web/model/po/project/ProjectPO.java

@@ -20,4 +20,6 @@ public class ProjectPO {
     private String name;
     private String gitRemoteUrl;
     private String description;
+
+
 }

+ 54 - 17
web/src/main/java/seecoder/devcloud/web/service/impl/project/ProjectServiceImpl.java

@@ -2,18 +2,23 @@ package seecoder.devcloud.web.service.impl.project;
 
 import com.nju.edu.gitlab.SeecoderGitlabApi;
 import com.nju.edu.gitlab.SeecoderGitlabException;
+import com.nju.edu.gitlab.dto.member.AccessLevelForm;
 import com.nju.edu.gitlab.dto.project.VisibilityForm;
+import org.apache.http.HttpStatus;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import seecoder.devcloud.api.ApplicationProperties;
 import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.dao.project.ProjectMapper;
+import seecoder.devcloud.web.dao.user.UserMapper;
 import seecoder.devcloud.web.model.po.project.ProjectPO;
+import seecoder.devcloud.web.model.po.user.UserPO;
 import seecoder.devcloud.web.model.vo.project.ProjectCreateVO;
 import seecoder.devcloud.web.model.vo.project.ProjectVO;
 import seecoder.devcloud.web.model.vo.user.UserVO;
 import seecoder.devcloud.web.service.project.ProjectService;
+import seecoder.devcloud.web.service.user.UserService;
 
 import java.util.List;
 import java.util.stream.Collectors;
@@ -23,23 +28,31 @@ public class ProjectServiceImpl implements ProjectService {
 
     private final ProjectMapper projectMapper;
 
+    private final UserMapper userMapper;
+
     private final SeecoderGitlabApi seecoderGitlabApi;
 
     private final ApplicationProperties properties;
 
     @Autowired
-    public ProjectServiceImpl(ProjectMapper projectMapper, SeecoderGitlabApi seecoderGitlabApi, ApplicationProperties properties) {
+    public ProjectServiceImpl(ProjectMapper projectMapper, UserMapper userMapper, SeecoderGitlabApi seecoderGitlabApi, ApplicationProperties properties) {
         this.projectMapper = projectMapper;
+        this.userMapper = userMapper;
         this.seecoderGitlabApi = seecoderGitlabApi;
         this.properties = properties;
     }
 
     @Override
     // TODO:该方法待测试
-    public List<ProjectVO> listProjectsByUserId(int userId) {
-        List<ProjectPO> projectPOS = null;
-        //todo 改成从gitlab读取
-        return projectPOS.stream().map(ProjectVO::new).collect(Collectors.toList());
+    public List<ProjectVO> listProjectsByUserId(int userId) throws ServiceException {
+        List<com.nju.edu.gitlab.vo.ProjectVO> projects = null;
+        try {
+            projects = seecoderGitlabApi.getAllProjectsByUserId(userId);
+        } 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 projectMapper.selectByIds(projectIds).stream().map(ProjectVO::new).collect(Collectors.toList());
     }
 
     @Override
@@ -53,9 +66,9 @@ public class ProjectServiceImpl implements ProjectService {
         ProjectPO po = new ProjectPO();
         BeanUtils.copyProperties(vo,po);
         try {
-            //todo 创建完项目还要设置url
-            int projectId = seecoderGitlabApi.createProject(po.getName(), VisibilityForm.PRIVATE);
-            po.setId(projectId);
+            com.nju.edu.gitlab.vo.ProjectVO project = seecoderGitlabApi.createProject(po.getName(), VisibilityForm.PRIVATE);
+            po.setId(project.getProjectId());
+            po.setGitRemoteUrl(project.getWebUrl());
         } catch (SeecoderGitlabException e) {
             throw new ServiceException("创建项目时发生异常[project id:"+po.getId()+", " + e.getMessage() + "]", e);
         }
@@ -70,15 +83,23 @@ public class ProjectServiceImpl implements ProjectService {
     }
 
     @Override
-    public void addMember(Integer projectId, Integer userId) {
-        //todo gitlab项目加权限
-
+    public void addMember(Integer projectId, Integer userId) throws ServiceException {
+        try {
+            seecoderGitlabApi.addAuthorization(projectId,userId, AccessLevelForm.MASTER);
+        } catch (Exception e) {
+            throw  new ServiceException(HttpStatus.SC_INTERNAL_SERVER_ERROR,"添加项目权限失败",e);
+        }
     }
 
     @Override
-    public List<UserVO> getProjectMembers(Integer projectId) {
-        //todo 调用gitlab
-        return null;
+    public List<UserVO> getProjectMembers(Integer projectId) throws ServiceException {
+        List<Integer> userIds = null;
+        try {
+            userIds = seecoderGitlabApi.getJoinedUserByProject(projectId);
+        } catch (SeecoderGitlabException e) {
+            throw new ServiceException(HttpStatus.SC_INTERNAL_SERVER_ERROR,"获取项目成员失败",e);
+        }
+        return userMapper.selectByIds(userIds).stream().map(UserVO::new).collect(Collectors.toList());
     }
 
     @Override
@@ -87,9 +108,25 @@ public class ProjectServiceImpl implements ProjectService {
     }
 
     @Override
-    public void refresh() {
+    public void refresh() throws ServiceException {
+        UserPO user = UserService.loginUser();
+        List<com.nju.edu.gitlab.vo.ProjectVO> projects = null;
+        try {
+            projects = seecoderGitlabApi.getAllProjectsByUserId(user.getId());
+        } catch (SeecoderGitlabException e) {
+            throw new ServiceException(HttpStatus.SC_INTERNAL_SERVER_ERROR,"获取项目列表失败",e);
+        }
+        for (com.nju.edu.gitlab.vo.ProjectVO p : projects){
+            if (projectMapper.getProjectById(p.getProjectId())==null){
+                ProjectPO po = new ProjectPO();
+                po.setId(p.getProjectId());
+                po.setGitRemoteUrl(p.getWebUrl());
+                po.setDescription("");
+                //todo 项目名待返回
+                projectMapper.insertProject(po);
+            }
+
+        }
 
-        //todo 获取项目存储
-        projectMapper.insertProject(null);
     }
 }

+ 4 - 4
web/src/main/java/seecoder/devcloud/web/service/project/ProjectService.java

@@ -13,7 +13,7 @@ public interface ProjectService {
      * 根据user找Project
      * @return
      */
-    List<ProjectVO> listProjectsByUserId(int userId);
+    List<ProjectVO> listProjectsByUserId(int userId) throws ServiceException;
 
     /**
      * 获取project
@@ -35,10 +35,10 @@ public interface ProjectService {
     @Deprecated
     void deleteProject(int projectId);
 
-    void addMember(Integer projectId, Integer userId);
+    void addMember(Integer projectId, Integer userId) throws ServiceException;
 
-    List<UserVO> getProjectMembers(Integer projectId);
+    List<UserVO> getProjectMembers(Integer projectId) throws ServiceException;
 
-    void refresh();
+    void refresh() throws ServiceException;
     //todo refresh 同步软工二信息
 }