Browse Source

fix: fork & addMember

mjh 4 years ago
parent
commit
1c26a61c46

+ 4 - 1
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/GroupService.java

@@ -5,6 +5,7 @@ import cn.seecoder.seecoderportalcommon.vo.dto.GroupDTO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupMemberVO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupRuleVO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupVO;
+import cn.seecoder.seecoderportalserver.web.rest.errors.CustomErrorException;
 
 import java.util.List;
 
@@ -44,13 +45,15 @@ public interface GroupService {
      */
     GroupDTO addGroupMember(GroupMemberVO groupMemberVO);
 
+
     /**
      * 查找某个课程小组
      *
      * @param courseId Long
      * @return GroupDTO
+     * @throws CustomErrorException Exception
      */
-    GroupDTO findGroup(Long courseId);
+    GroupDTO findGroup(Long courseId) throws CustomErrorException;
 
     /**
      * 查找课程下的全部小组

+ 26 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/subsystem/DevcloudService.java

@@ -48,4 +48,30 @@ public interface DevcloudService {
      * @return JSONObject
      */
     JSONObject forkProject(Integer projectId, String name);
+
+    /**
+     * getProjectVisibility
+     *
+     * @param projectId Integer
+     * @return JSONObject
+     */
+    JSONObject getProjectVisibility(Integer projectId);
+
+    /**
+     * setProjectVisibility
+     *
+     * @param projectId Integer
+     * @param visibility String
+     * @return JSONObject
+     */
+    JSONObject setProjectVisibility(Integer projectId, String visibility);
+
+    /**
+     * addMember
+     *
+     * @param projectId Integer
+     * @param phone String
+     * @return JSONObject
+     */
+    JSONObject addMember(Integer projectId, String phone);
 }

+ 1 - 1
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/GroupServiceImpl.java

@@ -109,7 +109,7 @@ public class GroupServiceImpl implements GroupService {
     }
 
     @Override
-    public GroupDTO findGroup(Long courseId) {
+    public GroupDTO findGroup(Long courseId) throws CustomErrorException{
         DomainUserDetails user = SecurityUtils.getCurrentUser();
         if (!courseService.checkSelection(user.getId(), courseId)) {
             throw CustomErrorException.courseSelectionNotFound();

+ 34 - 6
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/ProjectServiceImpl.java

@@ -1,11 +1,13 @@
 package cn.seecoder.seecoderportalserver.serviceImpl;
 
 import cn.seecoder.seecoderportalcommon.vo.UserRole;
+import cn.seecoder.seecoderportalcommon.vo.UserVO;
 import cn.seecoder.seecoderportalserver.domain.CourseProject;
 import cn.seecoder.seecoderportalserver.mapper.CourseMapper;
 import cn.seecoder.seecoderportalserver.repository.CourseProjectRepository;
 import cn.seecoder.seecoderportalserver.security.SecurityUtils;
 import cn.seecoder.seecoderportalserver.service.CourseService;
+import cn.seecoder.seecoderportalserver.service.GroupService;
 import cn.seecoder.seecoderportalserver.service.ProjectService;
 import cn.seecoder.seecoderportalserver.service.subsystem.DevcloudService;
 import cn.seecoder.seecoderportalserver.web.rest.errors.CustomErrorException;
@@ -16,6 +18,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
@@ -24,17 +27,19 @@ import java.util.List;
  */
 @Service
 public class ProjectServiceImpl implements ProjectService {
-    private final static Logger log = LoggerFactory.getLogger(GroupServiceImpl.class);
+    private final static Logger log = LoggerFactory.getLogger(ProjectServiceImpl.class);
     private final DevcloudService devcloudService;
     private final CourseService courseService;
     private final CourseMapper courseMapper;
     private final CourseProjectRepository courseProjectRepository;
+    private final GroupService groupService;
 
-    public ProjectServiceImpl(DevcloudService devcloudService, CourseService courseService, CourseMapper courseMapper, CourseProjectRepository courseProjectRepository) {
+    public ProjectServiceImpl(DevcloudService devcloudService, CourseService courseService, CourseMapper courseMapper, CourseProjectRepository courseProjectRepository, GroupService groupService) {
         this.devcloudService = devcloudService;
         this.courseService = courseService;
         this.courseMapper = courseMapper;
         this.courseProjectRepository = courseProjectRepository;
+        this.groupService = groupService;
     }
 
     @Override
@@ -115,13 +120,12 @@ public class ProjectServiceImpl implements ProjectService {
     @Transactional(rollbackFor = RuntimeException.class)
     public JSONObject createProject(JSONObject project) {
         JSONObject devcloudResult = devcloudService.createProject(project);
-        log.info("new project {}", devcloudResult);
+        log.info("devcloudService.createProject: {}", devcloudResult);
         CourseProject courseProject = new CourseProject();
         courseProject.setProjectId(devcloudResult.getInteger("id"));
         courseProject.setCourse(courseMapper.courseVOToCourse(courseService.findCourseById(project.getLong("courseId"))));
         courseProject.setPublic(project.getBoolean("isPublic"));
         courseProjectRepository.save(courseProject);
-        log.info("new course project relation {}", courseProject);
         return devcloudResult;
     }
 
@@ -130,6 +134,13 @@ public class ProjectServiceImpl implements ProjectService {
     public Boolean switchCourseProjectState(Integer projectId) {
         CourseProject courseProject = courseProjectRepository.findById(projectId)
                 .orElseThrow(CustomErrorException::courseProjectNotFound);
+        JSONObject devcloudRes;
+        if (courseProject.getPublic()) {
+            devcloudRes = devcloudService.setProjectVisibility(projectId, "PRIVATE");
+        } else {
+            devcloudRes = devcloudService.setProjectVisibility(projectId, "PUBLIC");
+        }
+        log.info("devcloudService.setProjectVisibility: {}", devcloudRes);
         courseProject.setPublic(!courseProject.getPublic());
         courseProjectRepository.save(courseProject);
         return courseProject.getPublic();
@@ -146,13 +157,26 @@ public class ProjectServiceImpl implements ProjectService {
             throw CustomErrorException.unauthorizedUser();
         }
         JSONObject devcloudResult = devcloudService.forkProject(projectId, name);
-        log.info("fork project {}", devcloudResult);
+        log.info("devcloudService.forkProject: {}", devcloudResult);
         Integer newProjectId = devcloudResult.getInteger("projectId");
         courseProject.setProjectId(newProjectId);
         courseProject.setCourse(courseMapper.courseVOToCourse(courseService.findCourseById(courseProject.getCourse().getId())));
         courseProject.setPublic(false);
         courseProjectRepository.save(courseProject);
-        log.info("new course project relation {}", courseProject);
+        // 若当前用户已组队,则将队友添加到当前项目当中
+        List<UserVO> members;
+        try {
+            members = groupService.findGroup(courseProject.getCourse().getId()).getMembers();
+        }catch (CustomErrorException e){
+            members = new ArrayList<>();
+        }
+        if(members.size() != 0){
+            for(UserVO member: members){
+                if(!member.getPhone().equals(SecurityUtils.getCurrentUser().getPhone())){
+                    this.addProjectMember(newProjectId, member.getPhone());
+                }
+            }
+        }
         return findProjectById(newProjectId);
     }
 
@@ -160,4 +184,8 @@ public class ProjectServiceImpl implements ProjectService {
     public JSONArray findProjectMembers(Integer projectId) {
         return devcloudService.getProjectMembers(projectId);
     }
+
+    private void addProjectMember(Integer projectId, String phone){
+        JSONObject devcloudRes = devcloudService.addMember(projectId, phone);
+    }
 }

+ 70 - 1
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/subsystem/DevcloudServiceImpl.java

@@ -25,6 +25,7 @@ public class DevcloudServiceImpl implements DevcloudService {
     private final static Logger log = LoggerFactory.getLogger(DevcloudServiceImpl.class);
 
     private final String devcloudUri = "https://devcloud-server.seec.seecoder.cn";
+    private final String seecoderGitlabServerUri = "https://seecoder-gitlab-server.seec.seecoder.cn";
     private final HttpService httpService;
 
     public DevcloudServiceImpl(HttpService httpService) {this.httpService = httpService;}
@@ -137,7 +138,75 @@ public class DevcloudServiceImpl implements DevcloudService {
                 throw CustomErrorException.devcloudError(result.toString());
             }
         } catch (NullPointerException e) {
-            throw CustomErrorException.devcloudError(null);
+            throw CustomErrorException.devcloudError("devcloud result = NULL!");
+        }
+    }
+
+    @Override
+    public JSONObject addMember(Integer projectId, String phone) {
+        JSONObject result;
+        JSONObject requestBody = new JSONObject();
+        requestBody.put("projectId", String.valueOf(projectId));
+        requestBody.put("phone", phone);
+        try {
+            result = JSONObject.parseObject(
+                    httpService.sendPost(
+                            devcloudUri + "/project/members",
+                            requestBody,
+                            httpService.getToken()
+                    )
+            );
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        log.info("{}", result);
+        try {
+            if (result.containsKey("code") && result.getInteger("code") == 200) {
+                return result.getJSONObject("data");
+            } else {
+                throw CustomErrorException.devcloudError(result.toString());
+            }
+        } catch (NullPointerException e) {
+            throw CustomErrorException.devcloudError("devcloud result = NULL!");
+        }
+    }
+
+    @Override
+    public JSONObject getProjectVisibility(Integer projectId) {
+        JSONObject result = null;
+        List<NameValuePair> params = new ArrayList<>();
+        params.add(new BasicNameValuePair("projectId", String.valueOf(projectId)));
+        try {
+            result = JSON.parseObject(
+                    httpService.sendGet(
+                            seecoderGitlabServerUri + "/api/project/visibility",
+                            params,
+                            httpService.getToken()
+                    )
+            );
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    @Override
+    public JSONObject setProjectVisibility(Integer projectId, String visibility) {
+        JSONObject result;
+        JSONObject requestBody = new JSONObject();
+        requestBody.put("projectId", projectId);
+        requestBody.put("visibility", visibility);
+        try {
+            result = JSONObject.parseObject(
+                    httpService.sendPut(
+                            seecoderGitlabServerUri + "/api/project/visibility",
+                            requestBody,
+                            httpService.getToken()
+                    )
+            );
+            return result;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
         }
     }
 }