Explorar o código

feat: 添加了 fork 功能

刘一也 %!s(int64=4) %!d(string=hai) anos
pai
achega
fd1f60ae54

+ 21 - 0
web/src/main/java/cn/seecoder/web/controller/fork/ForkController.java

@@ -0,0 +1,21 @@
+package cn.seecoder.web.controller.fork;
+
+import cn.seecoder.web.model.vo.fork.ForkVO;
+import cn.seecoder.web.service.fork.ForkService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/fork")
+@RequiredArgsConstructor
+public class ForkController {
+    private final ForkService forkService;
+
+    @PostMapping
+    public ForkVO forkProject(@RequestBody ForkVO forkVO) {
+        return forkService.forkProject(forkVO.getProjectId());
+    }
+}

+ 14 - 0
web/src/main/java/cn/seecoder/web/model/vo/fork/ForkVO.java

@@ -0,0 +1,14 @@
+package cn.seecoder.web.model.vo.fork;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ForkVO {
+    Integer projectId;
+}

+ 7 - 0
web/src/main/java/cn/seecoder/web/service/fork/ForkService.java

@@ -0,0 +1,7 @@
+package cn.seecoder.web.service.fork;
+
+import cn.seecoder.web.model.vo.fork.ForkVO;
+
+public interface ForkService {
+    public ForkVO forkProject(int projectId);
+}

+ 57 - 0
web/src/main/java/cn/seecoder/web/service/fork/impl/ForkServiceImpl.java

@@ -0,0 +1,57 @@
+package cn.seecoder.web.service.fork.impl;
+
+import cn.seecoder.api.ApplicationProperties;
+import cn.seecoder.web.dao.project.ProjectMapper;
+import cn.seecoder.web.model.po.project.ProjectPO;
+import cn.seecoder.web.model.po.user.UserPO;
+import cn.seecoder.web.model.vo.fork.ForkVO;
+import cn.seecoder.web.service.fork.ForkService;
+import com.nju.edu.gitlab.SeecoderGitlabApi;
+import com.nju.edu.gitlab.SeecoderGitlabException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+@RequiredArgsConstructor
+@Service
+public class ForkServiceImpl implements ForkService {
+    private final SeecoderGitlabApi gitlabApi;
+    private final ProjectMapper projectMapper;
+    private final ApplicationProperties properties;
+
+    @Override
+    public ForkVO forkProject(int projectId) {
+        UserPO principal = (UserPO) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        Integer userId = principal.getId();
+        try {
+            Integer newProjectId = gitlabApi.forkProject(projectId, userId);
+            List<com.nju.edu.gitlab.vo.ProjectVO> allProjects = gitlabApi.getAllProjectsByUserId(userId);
+            com.nju.edu.gitlab.vo.ProjectVO newProject = null;
+            for (com.nju.edu.gitlab.vo.ProjectVO project: allProjects) {
+                if (Objects.equals(project.getProjectId(), newProjectId)) {
+                    newProject = project;
+                    break;
+                }
+            }
+            if (newProject == null) {
+                return null;
+            }
+            ProjectPO projectPO = new ProjectPO(newProjectId,
+                    newProject.getProjectName(),
+                    newProject.getWebUrl(),
+                    "");
+            projectMapper.insertProject(projectPO);
+            gitlabApi.addWebHook(projectPO.getId(),
+                    properties.getGitlab().getWebhookProxy(),
+                    true,
+                    false,
+                    false);
+            return new ForkVO(newProjectId);
+        } catch (SeecoderGitlabException e) {
+            return null;
+        }
+    }
+}