Browse Source

feat: fork

mjh 4 years ago
parent
commit
68cd2ebc57

+ 2 - 1
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/ProjectService.java

@@ -66,9 +66,10 @@ public interface ProjectService {
      * fork公开项目
      *
      * @param projectId Integer
+     * @param name String
      * @return JSONObject
      */
-    JSONObject forkPublicProject(Integer projectId);
+    JSONObject forkPublicProject(Integer projectId, String name);
 
     /**
      * 查找项目成员

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

@@ -4,9 +4,23 @@ package cn.seecoder.seecoderportalserver.service.subsystem;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 
+/**
+ * @author wind
+ */
 public interface DevcloudService {
+    /**
+     * listProjectsByUserId
+     *
+     * @return JSONArray
+     */
     JSONArray listProjectsByUserId();
 
+    /**
+     * getProjectById
+     *
+     * @param id Integer
+     * @return JSONObject
+     */
     JSONObject getProjectById(Integer id);
 
     /**
@@ -22,4 +36,14 @@ public interface DevcloudService {
      * @return 有id项目信息
      */
     JSONObject createProject(JSONObject project);
+
+
+    /**
+     * forkProject
+     *
+     * @param projectId Integer
+     * @param name String
+     * @return JSONObject
+     */
+    JSONObject forkProject(Integer projectId, String name);
 }

+ 10 - 2
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/ProjectServiceImpl.java

@@ -136,7 +136,7 @@ public class ProjectServiceImpl implements ProjectService {
     }
 
     @Override
-    public JSONObject forkPublicProject(Integer projectId) {
+    public JSONObject forkPublicProject(Integer projectId, String name) {
         // 验证项目存在且公共
         CourseProject courseProject = courseProjectRepository.findById(projectId)
                 .orElseThrow(CustomErrorException::courseProjectNotFound);
@@ -145,7 +145,15 @@ public class ProjectServiceImpl implements ProjectService {
         if(!courseService.checkSelection(SecurityUtils.getCurrentUser().getId(), courseProject.getCourse().getId())){
             throw CustomErrorException.unauthorizedUser();
         }
-        return null;
+        JSONObject devcloudResult = devcloudService.forkProject(projectId, name);
+        log.info("fork project {}", 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);
+        return findProjectById(newProjectId);
     }
 
     @Override

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

@@ -13,6 +13,9 @@ import org.springframework.stereotype.Service;
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * @author wind
+ */
 @Service
 public class DevcloudServiceImpl implements DevcloudService {
     private final String devcloudUri = "https://devcloud-server.seec.seecoder.cn";
@@ -84,7 +87,7 @@ public class DevcloudServiceImpl implements DevcloudService {
 
     @Override
     public JSONObject createProject(JSONObject project) {
-        JSONObject result = null;
+        JSONObject result;
         try {
             result = JSONObject.parseObject(
                     httpService.sendPost(
@@ -103,4 +106,29 @@ public class DevcloudServiceImpl implements DevcloudService {
             throw CustomErrorException.devcloudError(result.toString());
         }
     }
+
+    @Override
+    public JSONObject forkProject(Integer projectId, String name) {
+        JSONObject result;
+        JSONObject requestBody = new JSONObject();
+        requestBody.put("projectId", projectId);
+        requestBody.put("name", name);
+        try {
+            result = JSONObject.parseObject(
+                    httpService.sendPost(
+                            devcloudUri + "/fork",
+                            requestBody,
+                            httpService.getToken()
+                    )
+            );
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        assert result != null;
+        if (result.containsKey("code") && result.getInteger("code") == 200) {
+            return result.getJSONObject("data");
+        } else {
+            throw CustomErrorException.devcloudError(result.toString());
+        }
+    }
 }

+ 2 - 2
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/ProjectController.java

@@ -69,7 +69,7 @@ public class ProjectController {
 
     @ApiOperation(value = "Fork公开项目", httpMethod = "POST")
     @PostMapping("/fork")
-    public OkResponse<JSONObject> forkProject(@RequestParam Integer projectId){
-        return OkResponse.of(projectService.forkPublicProject(projectId));
+    public OkResponse<JSONObject> forkProject(@RequestParam Integer projectId, @RequestParam(defaultValue = "") String name){
+        return OkResponse.of(projectService.forkPublicProject(projectId, name));
     }
 }