ソースを参照

Merge branch 'feature/hzq' of WuLinYang/SEEC-Gitlab into master

HeZhiQian 4 年 前
コミット
cc2f55098c

+ 8 - 0
seecoder-gitlab-client/src/main/java/com.nju.edu.gitlab/SeecoderGitlabApi.java

@@ -6,6 +6,7 @@ import com.nju.edu.gitlab.dto.project.VisibilityForm;
 import com.nju.edu.gitlab.vo.*;
 import com.nju.edu.gitlab.vo.commit.CommitVO;
 import org.gitlab4j.api.GitLabApiException;
+import org.gitlab4j.api.models.User;
 
 
 import java.util.List;
@@ -17,10 +18,14 @@ public interface SeecoderGitlabApi{
 
     public boolean changePassword(int userId,String password) throws SeecoderGitlabException;
 
+    public boolean changeUserName(int userId, String password, String username) throws SeecoderGitlabException;
+
     public boolean deleteUser(int userId) throws SeecoderGitlabException;
 
     public String getUserEmail(int userId) throws SeecoderGitlabException;
 
+    public User getUserByUserName(String userName) throws  SeecoderGitlabException;
+
     public GitlabGroup createGroup(String groupName) throws SeecoderGitlabException;
 
     public boolean addMember(int groupId, int userId, AccessLevelForm accessLevel) throws SeecoderGitlabException;
@@ -29,6 +34,7 @@ public interface SeecoderGitlabApi{
 
     public ProjectVO createPrivateProject(String projectName,VisibilityForm visibility, Integer userId) throws SeecoderGitlabException;
 
+    public boolean deleteProject(int projectId) throws SeecoderGitlabException;
 
     public Integer forkProject(int projectId, int userId) throws SeecoderGitlabException;
 
@@ -55,4 +61,6 @@ public interface SeecoderGitlabApi{
     public List<ProjectVO> getAllProjectsByUserId(int userId) throws SeecoderGitlabException;
 
     public List<Integer> getJoinedUserByProject(int projectId) throws SeecoderGitlabException;
+
+    public List<String> getFilePaths(int projectId, String basePath, String branch) throws SeecoderGitlabException;
 }

+ 188 - 86
seecoder-gitlab-client/src/main/java/com.nju.edu.gitlab/SeecoderGitlabClient.java

@@ -2,7 +2,6 @@ package com.nju.edu.gitlab;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.nju.edu.gitlab.dto.*;
@@ -15,6 +14,7 @@ import com.nju.edu.gitlab.dto.project.VisibilityForm;
 import com.nju.edu.gitlab.vo.*;
 import com.nju.edu.gitlab.vo.commit.CommitVO;
 import org.gitlab4j.api.GitLabApiException;
+import org.gitlab4j.api.models.User;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import okhttp3.*;
@@ -32,7 +32,7 @@ import java.util.stream.Collectors;
 
 import static com.nju.edu.gitlab.SeecoderGitlabException.BIZ_ERROR_CODE;
 
-public class SeecoderGitlabClient implements SeecoderGitlabApi{
+public class SeecoderGitlabClient implements SeecoderGitlabApi {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
@@ -40,12 +40,12 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
     private String host;
     private String token;
 
-    public SeecoderGitlabClient(String host,String token){
-        this.token=token;
-        this.host=host;
-        this.client=new OkHttpClient.Builder()
+    public SeecoderGitlabClient(String host, String token) {
+        this.token = token;
+        this.host = host;
+        this.client = new OkHttpClient.Builder()
                 .connectTimeout(60, TimeUnit.SECONDS)
-                .writeTimeout(60,TimeUnit.SECONDS)
+                .writeTimeout(60, TimeUnit.SECONDS)
                 .retryOnConnectionFailure(true)
                 .build();
     }
@@ -65,7 +65,7 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             if (typeReference == null) {
                 return null;
             }
-            if (node.get("res")!=null)
+            if (node.get("res") != null)
                 return objectMapper.readValue(node.get("res").traverse(), typeReference);
             else
                 throw SeecoderGitlabException.NOT_FOUND_ERROR;
@@ -87,24 +87,25 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
     }
 
     @Override
-    public GitlabUserVO createGitlabUser(int userId,String username, String password, String email) throws SeecoderGitlabException {
+    public GitlabUserVO createGitlabUser(int userId, String username, String password, String email) throws SeecoderGitlabException {
         try {
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            GitlabUserDTO gitlabUserDTO=GitlabUserDTO.builder()
-                                                    .userId(userId)
-                                                    .email(email)
-                                                    .password(password)
-                                                    .username(username)
-                                                    .build();
+            GitlabUserDTO gitlabUserDTO = GitlabUserDTO.builder()
+                    .userId(userId)
+                    .email(email)
+                    .password(password)
+                    .username(username)
+                    .build();
             builder = builder
                     .url(host + "/api/user/")
                     .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(gitlabUserDTO)));
             Request request = builder.build();
             final Call call = client.newCall(request);
             Response response = call.execute();
-            GitlabUserVO gitlabUserVO = processResponse(objectMapper, response, new TypeReference<GitlabUserVO>() {});
+            GitlabUserVO gitlabUserVO = processResponse(objectMapper, response, new TypeReference<GitlabUserVO>() {
+            });
             return gitlabUserVO;
         } catch (JsonProcessingException e) {
             logger.error("JSON writeValueAsString error", e);
@@ -121,17 +122,46 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            ChangePasswordDTO changePasswordDTO=ChangePasswordDTO.builder()
-                                                                .password(password)
-                                                                .userId(userId)
-                                                                .build();
+            ChangePasswordDTO changePasswordDTO = ChangePasswordDTO.builder()
+                    .password(password)
+                    .userId(userId)
+                    .build();
             builder = builder
                     .url(host + "/api/user/changePassword")
                     .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(changePasswordDTO)));
             Request request = builder.build();
             final Call call = client.newCall(request);
             Response response = call.execute();
-            return processResponse(objectMapper, response, new TypeReference<Boolean>() {});
+            return processResponse(objectMapper, response, new TypeReference<Boolean>() {
+            });
+        } catch (JsonProcessingException e) {
+            logger.error("JSON writeValueAsString error", e);
+            throw SeecoderGitlabException.JSON_ERROR;
+        } catch (IOException e) {
+            logger.error("IOException", e);
+            throw SeecoderGitlabException.IO_ERROR;
+        }
+    }
+
+    @Override
+    public boolean changeUserName(int userId, String password, String username) throws SeecoderGitlabException {
+        try {
+            ObjectMapper objectMapper = new ObjectMapper();
+            Request.Builder builder = new Request.Builder()
+                    .addHeader("Authorization", token);
+            ChangeUserNameDTO changeUserNameDTO = ChangeUserNameDTO.builder()
+                    .userId(userId)
+                    .username(username)
+                    .password(password)
+                    .build();
+            builder = builder
+                    .url(host + "/api/user/changeUserName")
+                    .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(changeUserNameDTO)));
+            Request request = builder.build();
+            final Call call = client.newCall(request);
+            Response response = call.execute();
+            return processResponse(objectMapper, response, new TypeReference<Boolean>() {
+            });
         } catch (JsonProcessingException e) {
             logger.error("JSON writeValueAsString error", e);
             throw SeecoderGitlabException.JSON_ERROR;
@@ -148,7 +178,7 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
             builder = builder
-                    .url(host + "/api/user/"+userId)
+                    .url(host + "/api/user/" + userId)
                     .delete();
             Request request = builder.build();
             final Call call = client.newCall(request);
@@ -172,12 +202,36 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
             builder = builder
-                    .url(host + "/api/user/"+userId+"/email")
+                    .url(host + "/api/user/" + userId + "/email")
+                    .get();
+            Request request = builder.build();
+            final Call call = client.newCall(request);
+            Response response = call.execute();
+            return processResponse(objectMapper, response, new TypeReference<String>() {
+            });
+        } catch (JsonProcessingException e) {
+            logger.error("JSON writeValueAsString error", e);
+            throw SeecoderGitlabException.JSON_ERROR;
+        } catch (IOException e) {
+            logger.error("IOException", e);
+            throw SeecoderGitlabException.IO_ERROR;
+        }
+    }
+
+    @Override
+    public User getUserByUserName(String userName) throws SeecoderGitlabException {
+        try {
+            ObjectMapper objectMapper = new ObjectMapper();
+            Request.Builder builder = new Request.Builder()
+                    .addHeader("Authorization", token);
+            builder = builder
+                    .url(host + "/api/user/getByUserName?userName=" + userName)
                     .get();
             Request request = builder.build();
             final Call call = client.newCall(request);
             Response response = call.execute();
-            return processResponse(objectMapper, response, new TypeReference<String>() {});
+            return processResponse(objectMapper, response, new TypeReference<User>() {
+            });
         } catch (JsonProcessingException e) {
             logger.error("JSON writeValueAsString error", e);
             throw SeecoderGitlabException.JSON_ERROR;
@@ -217,12 +271,12 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            AccessLevel accessLevel=AccessLevel.forValue(accessLevelForm.value);
-            GroupMemberDTO groupMemberDTO=GroupMemberDTO.builder()
-                                                        .accessLevel(accessLevel)
-                                                        .userId(userId)
-                                                        .groupId(groupId)
-                                                        .build();
+            AccessLevel accessLevel = AccessLevel.forValue(accessLevelForm.value);
+            GroupMemberDTO groupMemberDTO = GroupMemberDTO.builder()
+                    .accessLevel(accessLevel)
+                    .userId(userId)
+                    .groupId(groupId)
+                    .build();
             builder = builder
                     .url(host + "/api/group/addMember")
                     .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(groupMemberDTO)));
@@ -247,11 +301,11 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            Visibility visibility=Visibility.valueOf(visibilityForm.toString());
-            ProjectDTO projectDTO= ProjectDTO.builder()
-                                            .projectName(projectName)
-                                            .visibility(visibility)
-                                            .build();
+            Visibility visibility = Visibility.valueOf(visibilityForm.toString());
+            ProjectDTO projectDTO = ProjectDTO.builder()
+                    .projectName(projectName)
+                    .visibility(visibility)
+                    .build();
             builder = builder
                     .url(host + "/api/project/")
                     .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(projectDTO)));
@@ -275,8 +329,8 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            Visibility visibility=Visibility.valueOf(visibilityForm.toString());
-            ProjectDTO projectDTO= ProjectDTO.builder()
+            Visibility visibility = Visibility.valueOf(visibilityForm.toString());
+            ProjectDTO projectDTO = ProjectDTO.builder()
                     .projectName(projectName)
                     .visibility(visibility)
                     .userId(userId)
@@ -298,6 +352,30 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
         }
     }
 
+    @Override
+    public boolean deleteProject(int projectId) throws SeecoderGitlabException {
+        try {
+            ObjectMapper objectMapper = new ObjectMapper();
+            Request.Builder builder = new Request.Builder()
+                    .addHeader("Authorization", token);
+            builder = builder
+                    .url(host + "/api/project/" + projectId)
+                    .delete();
+            Request request = builder.build();
+            final Call call = client.newCall(request);
+            Response response = call.execute();
+            boolean isDeleted = processResponse(objectMapper, response, new TypeReference<Boolean>() {
+            });
+            return isDeleted;
+        } catch (JsonProcessingException e) {
+            logger.error("JSON writeValueAsString error", e);
+            throw SeecoderGitlabException.JSON_ERROR;
+        } catch (IOException e) {
+            logger.error("IOException", e);
+            throw SeecoderGitlabException.IO_ERROR;
+        }
+    }
+
 
     @Override
     public Integer forkProject(int projectId, int userId) throws SeecoderGitlabException {
@@ -305,7 +383,7 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            UserForkDTO userForkDTO= UserForkDTO.builder()
+            UserForkDTO userForkDTO = UserForkDTO.builder()
                     .projectId(projectId)
                     .userId(userId)
                     .build();
@@ -333,7 +411,7 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            GroupForkDTO groupForkDTO= GroupForkDTO.builder()
+            GroupForkDTO groupForkDTO = GroupForkDTO.builder()
                     .projectId(projectId)
                     .groupId(groupId)
                     .build();
@@ -362,13 +440,13 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
             builder = builder
-                    .url(host + "/api/project/compare?projectId="+projectId+"&fromBash="+fromBash+"&toBash="+toBash)
+                    .url(host + "/api/project/compare?projectId=" + projectId + "&fromBash=" + fromBash + "&toBash=" + toBash)
                     .get();
             Request request = builder.build();
             final Call call = client.newCall(request);
             Response response = call.execute();
-            Set<DiffVO> diffVOSet= new HashSet<>();
-            diffVOSet=processResponse(objectMapper, response, new TypeReference<Set<DiffVO>>() {
+            Set<DiffVO> diffVOSet = new HashSet<>();
+            diffVOSet = processResponse(objectMapper, response, new TypeReference<Set<DiffVO>>() {
             });
             return diffVOSet;
         } catch (JsonProcessingException e) {
@@ -386,13 +464,13 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            WebHookDTO webHookDTO= WebHookDTO.builder()
-                                    .projectId(projectId)
-                                    .url(url)
-                                    .doIssueEvents(doIssueEvents)
-                                    .doPushEvents(doPushEvents)
-                                    .doMergeRequestsEvents(doMergeRequestsEvents)
-                                    .build();
+            WebHookDTO webHookDTO = WebHookDTO.builder()
+                    .projectId(projectId)
+                    .url(url)
+                    .doIssueEvents(doIssueEvents)
+                    .doPushEvents(doPushEvents)
+                    .doMergeRequestsEvents(doMergeRequestsEvents)
+                    .build();
             builder = builder
                     .url(host + "/api/project/webhook")
                     .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(webHookDTO)));
@@ -439,12 +517,12 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            ProjectFileDTO projectFileDTO=ProjectFileDTO.builder()
-                                                    .path(path)
-                                                    .branch(branch)
-                                                    .build();
+            ProjectFileDTO projectFileDTO = ProjectFileDTO.builder()
+                    .path(path)
+                    .branch(branch)
+                    .build();
             builder = builder
-                    .url(host + "/api/project/"+projectId+"/getFile")
+                    .url(host + "/api/project/" + projectId + "/getFile")
                     .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(projectFileDTO)));
             Request request = builder.build();
             final Call call = client.newCall(request);
@@ -466,12 +544,12 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            ProjectRawFileDTO projectFileDTO=ProjectRawFileDTO.builder()
-                                                .commitOrBranchName(commitOrBranchName)
-                                                .path(path)
-                                                .build();
+            ProjectRawFileDTO projectFileDTO = ProjectRawFileDTO.builder()
+                    .commitOrBranchName(commitOrBranchName)
+                    .path(path)
+                    .build();
             builder = builder
-                    .url(host + "/api/project/"+projectId+"/getRawFile")
+                    .url(host + "/api/project/" + projectId + "/getRawFile")
                     .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(projectFileDTO)));
             Request request = builder.build();
             final Call call = client.newCall(request);
@@ -493,20 +571,20 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            List<CommitAction> actionList=actions.stream().map(action-> new CommitAction()
-                                .withAction(CommitAction.Action.forValue(action.getAction().toString()))
-                                .withEncoding(CommitAction.Encoding.forValue(action.getEncoding().toString()))
-                                .withFilePath(action.getFilepath())
-                                .withContent(action.getContent())).collect(Collectors.toList());
-            CommitDTO commitDTO=CommitDTO.builder()
-                                        .branch(branch)
-                                        .commitMessage(commitMessage)
-                                        .email(email)
-                                        .username(username)
-                                        .actions(actionList)
-                                        .build();
+            List<CommitAction> actionList = actions.stream().map(action -> new CommitAction()
+                    .withAction(CommitAction.Action.forValue(action.getAction().toString()))
+                    .withEncoding(CommitAction.Encoding.forValue(action.getEncoding().toString()))
+                    .withFilePath(action.getFilepath())
+                    .withContent(action.getContent())).collect(Collectors.toList());
+            CommitDTO commitDTO = CommitDTO.builder()
+                    .branch(branch)
+                    .commitMessage(commitMessage)
+                    .email(email)
+                    .username(username)
+                    .actions(actionList)
+                    .build();
             builder = builder
-                    .url(host + "/api/project/"+projectId+"/commit")
+                    .url(host + "/api/project/" + projectId + "/commit")
                     .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), objectMapper.writeValueAsString(commitDTO)));
             Request request = builder.build();
             final Call call = client.newCall(request);
@@ -529,13 +607,13 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
             builder = builder
-                    .url(host + "/api/project/"+projectId+"/commit/"+commitHash)
+                    .url(host + "/api/project/" + projectId + "/commit/" + commitHash)
                     .get();
             Request request = builder.build();
             final Call call = client.newCall(request);
             Response response = call.execute();
-            List<CommitVO> commitVOList=new ArrayList<>();
-            commitVOList=processResponse(objectMapper, response, new TypeReference<List<CommitVO>>() {
+            List<CommitVO> commitVOList = new ArrayList<>();
+            commitVOList = processResponse(objectMapper, response, new TypeReference<List<CommitVO>>() {
             });
             return commitVOList;
         } catch (JsonProcessingException e) {
@@ -554,13 +632,13 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
             builder = builder
-                    .url(host + "/api/project/"+projectId+"/branches")
+                    .url(host + "/api/project/" + projectId + "/branches")
                     .get();
             Request request = builder.build();
             final Call call = client.newCall(request);
             Response response = call.execute();
-            List<BranchVO> branchVOList=new ArrayList<>();
-            branchVOList=processResponse(objectMapper, response, new TypeReference<List<BranchVO>>() {
+            List<BranchVO> branchVOList = new ArrayList<>();
+            branchVOList = processResponse(objectMapper, response, new TypeReference<List<BranchVO>>() {
             });
             return branchVOList;
         } catch (JsonProcessingException e) {
@@ -578,8 +656,8 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             ObjectMapper objectMapper = new ObjectMapper();
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
-            AccessLevel accessLevel=AccessLevel.forValue(accessLevelForm.value);
-            UpdateMemberDTO updateMemberDTO=UpdateMemberDTO.builder()
+            AccessLevel accessLevel = AccessLevel.forValue(accessLevelForm.value);
+            UpdateMemberDTO updateMemberDTO = UpdateMemberDTO.builder()
                     .accessLevel(accessLevel)
                     .userId(userId)
                     .projectId(projectId)
@@ -609,13 +687,14 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
             builder = builder
-                    .url(host + "/api/project/allProjects/"+userId)
+                    .url(host + "/api/project/allProjects/" + userId)
                     .get();
             Request request = builder.build();
             final Call call = client.newCall(request);
             Response response = call.execute();
-            List<ProjectVO> projectVOList=new ArrayList<>();
-            projectVOList=processResponse(objectMapper, response, new TypeReference<List<ProjectVO>>() {});
+            List<ProjectVO> projectVOList = new ArrayList<>();
+            projectVOList = processResponse(objectMapper, response, new TypeReference<List<ProjectVO>>() {
+            });
             return projectVOList;
         } catch (JsonProcessingException e) {
             logger.error("JSON writeValueAsString error", e);
@@ -633,13 +712,13 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             Request.Builder builder = new Request.Builder()
                     .addHeader("Authorization", token);
             builder = builder
-                    .url(host + "/api/project/projectMembers/"+projectId)
+                    .url(host + "/api/project/projectMembers/" + projectId)
                     .get();
             Request request = builder.build();
             final Call call = client.newCall(request);
             Response response = call.execute();
-            List<Integer> userList=new ArrayList<>();
-            userList=processResponse(objectMapper, response, new TypeReference<List<Integer>>() {
+            List<Integer> userList = new ArrayList<>();
+            userList = processResponse(objectMapper, response, new TypeReference<List<Integer>>() {
             });
             return userList;
         } catch (JsonProcessingException e) {
@@ -650,4 +729,27 @@ public class SeecoderGitlabClient implements SeecoderGitlabApi{
             throw SeecoderGitlabException.IO_ERROR;
         }
     }
+
+    @Override
+    public List<String> getFilePaths(int projectId, String basePath, String branch) throws SeecoderGitlabException {
+        try {
+            ObjectMapper objectMapper = new ObjectMapper();
+            Request.Builder builder = new Request.Builder()
+                    .addHeader("Authorization", token);
+            builder = builder
+                    .url(host + String.format("/api/project/filePaths?projectId=%d&&basePath=%s&&branch=%s", projectId, basePath, branch))
+                    .get();
+            Request request = builder.build();
+            final Call call = client.newCall(request);
+            Response response = call.execute();
+            return processResponse(objectMapper, response, new TypeReference<List<String>>() {
+            });
+        } catch (JsonProcessingException e) {
+            logger.error("JSON writeValueAsString error", e);
+            throw SeecoderGitlabException.JSON_ERROR;
+        } catch (IOException e) {
+            logger.error("IOException", e);
+            throw SeecoderGitlabException.IO_ERROR;
+        }
+    }
 }

+ 16 - 0
seecoder-gitlab-common/src/main/java/com/nju/edu/gitlab/dto/ChangeUserNameDTO.java

@@ -0,0 +1,16 @@
+package com.nju.edu.gitlab.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ChangeUserNameDTO {
+    private int userId;
+    private String password;
+    private String username;
+}

+ 18 - 10
seecoder-gitlab-server/src/main/java/com/nju/edu/gitlab/controller/GitlabProjectController.java

@@ -48,7 +48,7 @@ public class GitlabProjectController {
     public Response compareProject(@RequestParam Integer projectId,
                                    @RequestParam String fromBash,
                                    @RequestParam String toBash) throws GitLabApiException {
-        return new ResourceResponse(projectService.compare(projectId,fromBash,toBash));
+        return new ResourceResponse(projectService.compare(projectId, fromBash, toBash));
     }
 
     @PostMapping("/webhook")
@@ -62,32 +62,32 @@ public class GitlabProjectController {
     }
 
     @DeleteMapping("/{projectId}")
-    public Response deleteProject(@PathVariable(name = "projectId") Integer projectId){
-        return new EmptyResponse();
+    public Response deleteProject(@PathVariable(name = "projectId") Integer projectId) throws GitLabApiException {
+        return new ResourceResponse(projectService.deleteProject(projectId));
     }
 
     @PostMapping("/{projectId}/getFile")
     public Response getProjectFile(@PathVariable(name = "projectId") Integer projectId,
                                    @RequestBody ProjectFileDTO projectFileDTO) throws UnsupportedEncodingException, GitLabApiException {
-        return new ResourceResponse(projectService.getProjectFile(projectId,projectFileDTO));
+        return new ResourceResponse(projectService.getProjectFile(projectId, projectFileDTO));
     }
 
     @PostMapping("/{projectId}/getRawFile")
     public Response getProjectRawFile(@PathVariable(name = "projectId") Integer projectId,
                                       @RequestBody ProjectRawFileDTO projectRawFileDTO) throws GitLabApiException, IOException {
-        return new ResourceResponse(projectService.getProjectRawFile(projectId,projectRawFileDTO));
+        return new ResourceResponse(projectService.getProjectRawFile(projectId, projectRawFileDTO));
     }
 
     @PostMapping("/{projectId}/commit")
     public Response createCommit(@PathVariable(name = "projectId") Integer projectId,
                                  @RequestBody CommitDTO commitDTO) throws GitLabApiException {
-        return new ResourceResponse(projectService.createCommit(projectId,commitDTO));
+        return new ResourceResponse(projectService.createCommit(projectId, commitDTO));
     }
 
     @GetMapping("{projectId}/commit/{commitHash}")
     public Response getAllCommitMessage(@PathVariable(name = "projectId") Integer projectId,
                                         @PathVariable(name = "commitHash") String commitHash) throws GitLabApiException {
-        return new ResourceResponse(projectService.getAllCommitMessage(projectId,commitHash));
+        return new ResourceResponse(projectService.getAllCommitMessage(projectId, commitHash));
     }
 
     @GetMapping("/{projectId}/branches")
@@ -96,17 +96,25 @@ public class GitlabProjectController {
     }
 
     @PostMapping("/updateMember")
-    public Response updateMember(@RequestBody UpdateMemberDTO updateMemberDTO) throws GitLabApiException{
+    public Response updateMember(@RequestBody UpdateMemberDTO updateMemberDTO) throws GitLabApiException {
         return new ResourceResponse(projectService.addAuthorization(updateMemberDTO));
     }
 
     @GetMapping("/allProjects/{userId}")
-    public Response getAllProjectsByUserId(@PathVariable(name = "userId")int userId) throws GitLabApiException{
+    public Response getAllProjectsByUserId(@PathVariable(name = "userId") int userId) throws GitLabApiException {
         return new ResourceResponse(projectService.getAllProjectByUserId(userId));
     }
 
     @GetMapping("/projectMembers/{projectId}")
-    public Response getMembers(@PathVariable(name = "projectId")int projectId) throws GitLabApiException{
+    public Response getMembers(@PathVariable(name = "projectId") int projectId) throws GitLabApiException {
         return new ResourceResponse(projectService.getProjectJoinedUserId(projectId));
     }
+
+    @GetMapping("/filePaths")
+    public Response getFilePaths(
+            @RequestParam(value = "projectId") Integer projectId,
+            @RequestParam(value = "basePath") String basePath,
+            @RequestParam(value = "branch") String branch) throws GitLabApiException {
+        return new ResourceResponse(projectService.getFilePaths(projectId, basePath, branch));
+    }
 }

+ 11 - 0
seecoder-gitlab-server/src/main/java/com/nju/edu/gitlab/controller/GitlabUserController.java

@@ -1,5 +1,6 @@
 package com.nju.edu.gitlab.controller;
 
+import com.nju.edu.gitlab.dto.ChangeUserNameDTO;
 import com.nju.edu.gitlab.service.api.UserService;
 import com.nju.edu.gitlab.dto.ChangePasswordDTO;
 import com.nju.edu.gitlab.dto.GitlabUserDTO;
@@ -30,6 +31,11 @@ public class GitlabUserController {
         return new ResourceResponse(userService.changePassword(changePasswordDTO));
     }
 
+    @PostMapping("/changeUserName")
+    public Response changeUserName(@RequestBody ChangeUserNameDTO changeUserNameDTO) throws GitLabApiException {
+        return new ResourceResponse(userService.changeUserName(changeUserNameDTO));
+    }
+
     @DeleteMapping("/{userId}")
     public Response deleteUser(@PathVariable(name = "userId") Integer userId) throws GitLabApiException {
         return new ResourceResponse(userService.deleteUser(userId));
@@ -39,4 +45,9 @@ public class GitlabUserController {
     public Response getUserEmail(@PathVariable(name = "userId") Integer userId) throws GitLabApiException {
         return new ResourceResponse(userService.getUserEmail(userId));
     }
+
+    @GetMapping("/getByUserName")
+    public Response getUserByUserName(@RequestParam(name = "userName") String userName) throws GitLabApiException {
+        return new ResourceResponse(userService.findByUsername(userName));
+    }
 }

+ 4 - 0
seecoder-gitlab-server/src/main/java/com/nju/edu/gitlab/service/api/ProjectService.java

@@ -26,6 +26,8 @@ public interface ProjectService {
      */
     public ProjectVO createPrivateProject(ProjectDTO projectDTO) throws GitLabApiException;
 
+    public boolean deleteProject(Integer projectId) throws  GitLabApiException;
+
     public Integer forkProject(UserForkDTO userForkDTO) throws GitLabApiException;
 
     public Integer forkGroupProject(GroupForkDTO groupForkDTO) throws GitLabApiException;
@@ -51,4 +53,6 @@ public interface ProjectService {
     public List<ProjectVO> getAllProjectByUserId(int userId) throws GitLabApiException;
 
     public List<Integer> getProjectJoinedUserId(int projectId) throws GitLabApiException;
+
+    public List<String> getFilePaths(int projectId, String basePath, String branch) throws GitLabApiException;
 }

+ 3 - 0
seecoder-gitlab-server/src/main/java/com/nju/edu/gitlab/service/api/UserService.java

@@ -1,5 +1,6 @@
 package com.nju.edu.gitlab.service.api;
 
+import com.nju.edu.gitlab.dto.ChangeUserNameDTO;
 import com.nju.edu.gitlab.vo.GitlabUserVO;
 import com.nju.edu.gitlab.dto.ChangePasswordDTO;
 import com.nju.edu.gitlab.dto.GitlabUserDTO;
@@ -12,6 +13,8 @@ public interface UserService {
 
     public boolean changePassword(ChangePasswordDTO changePasswordDTO) throws GitLabApiException;
 
+    public boolean changeUserName(ChangeUserNameDTO changeUserNameDTO) throws GitLabApiException;
+
     public boolean deleteUser(int userId) throws GitLabApiException;
 
     public User findByUsername(String username) throws GitLabApiException;

+ 25 - 0
seecoder-gitlab-server/src/main/java/com/nju/edu/gitlab/service/impl/ProjectServiceImpl.java

@@ -14,6 +14,8 @@ import com.nju.edu.gitlab.vo.commit.CommitVO;
 import com.nju.edu.gitlab.vo.DiffVO;
 import org.gitlab4j.api.GitLabApi;
 import org.gitlab4j.api.GitLabApiException;
+import org.gitlab4j.api.Pager;
+import org.gitlab4j.api.RepositoryApi;
 import org.gitlab4j.api.models.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -69,6 +71,12 @@ public class ProjectServiceImpl implements ProjectService {
                 .build();
     }
 
+    @Override
+    public boolean deleteProject(Integer projectId) throws GitLabApiException {
+        gitlabApi.getProjectApi().deleteProject(projectId);
+        return true;
+    }
+
     @Override
     public Integer forkProject(UserForkDTO userForkDTO) throws GitLabApiException {
         int userId=userForkDTO.getUserId();
@@ -267,6 +275,23 @@ public class ProjectServiceImpl implements ProjectService {
                 .collect(Collectors.toList());
     }
 
+    @Override
+    public List<String> getFilePaths(int projectId, String basePath, String branch) throws GitLabApiException {
+        RepositoryApi repositoryApi = gitlabApi.getRepositoryApi();
+        List<TreeItem> treeItems = new ArrayList<>();
+        Pager<TreeItem> tree = repositoryApi.getTree(projectId, basePath, branch, true, 100);
+        for (int page = 1; page <= tree.getTotalPages(); page++) {
+            treeItems.addAll(tree.page(page));
+        }
+        List<String> filePaths = new ArrayList<>();
+        for (TreeItem item : treeItems) {
+            if (TreeItem.Type.BLOB.equals(item.getType())) {
+                filePaths.add(item.getPath());
+            }
+        }
+        return filePaths;
+    }
+
     private BranchVO castBranchToVO(Branch branch) {
         return BranchVO.builder()
                 .commit(castCommitToVO(branch.getCommit(),branch.getName()))

+ 23 - 13
seecoder-gitlab-server/src/main/java/com/nju/edu/gitlab/service/impl/UserServiceImpl.java

@@ -1,5 +1,6 @@
 package com.nju.edu.gitlab.service.impl;
 
+import com.nju.edu.gitlab.dto.ChangeUserNameDTO;
 import com.nju.edu.gitlab.entity.GitlabUser;
 import com.nju.edu.gitlab.repository.GitlabUserRepository;
 import com.nju.edu.gitlab.service.api.UserService;
@@ -28,8 +29,8 @@ public class UserServiceImpl implements UserService {
     @Autowired
     public UserServiceImpl(GitlabUserRepository gitlabUserRepository, ApplicationProperties properties) {
         this.gitlabUserRepository = gitlabUserRepository;
-        this.gitlabHost=properties.getHost();
-        this.token= properties.getToken();
+        this.gitlabHost = properties.getHost();
+        this.token = properties.getToken();
         this.gitlabApi = new GitLabApi(this.gitlabHost, this.token);
     }
 
@@ -37,24 +38,24 @@ public class UserServiceImpl implements UserService {
     public synchronized GitlabUserVO createGitlabUser(GitlabUserDTO gitlabUserDTO) throws GitLabApiException {
         int userId = gitlabUserDTO.getUserId();
         check(userId);
-        String username=gitlabUserDTO.getUsername();
-        String password=gitlabUserDTO.getPassword();
-        String email= gitlabUserDTO.getEmail();
-        User user=new User();
+        String username = gitlabUserDTO.getUsername();
+        String password = gitlabUserDTO.getPassword();
+        String email = gitlabUserDTO.getEmail();
+        User user = new User();
         user.setName(username);
         user.setUsername(username);
         user.setEmail(email);
         user.setSkipConfirmation(true);
-        user= gitlabApi.getUserApi().createUser(user, password, 1000);
+        user = gitlabApi.getUserApi().createUser(user, password, 1000);
         GitlabUser gitlabUser = new GitlabUser();
         gitlabUser.setUserId(userId);
         gitlabUser.setGitlabUserId(user.getId());
         gitlabUser.setNamespaceId(fetchNameSpaceId(username));
         gitlabUser.setToken(createToken(user.getId()));
 
-        gitlabUser=gitlabUserRepository.save(gitlabUser);
+        gitlabUser = gitlabUserRepository.save(gitlabUser);
 
-        if (gitlabUser!=null) {
+        if (gitlabUser != null) {
             GitlabUserVO gitlabUserVO = new GitlabUserVO();
             gitlabUserVO.setUserId(userId);
             gitlabUserVO.setGitlabUserId(gitlabUser.getGitlabUserId());
@@ -72,10 +73,19 @@ public class UserServiceImpl implements UserService {
 
     @Override
     public synchronized boolean changePassword(ChangePasswordDTO changePasswordDTO) throws GitLabApiException {
-        int userId=changePasswordDTO.getUserId();
-        String password=changePasswordDTO.getPassword();
-        User user=gitlabApi.getUserApi().getUser(userId);
-        gitlabApi.getUserApi().modifyUser(user,password,1000);
+        int userId = changePasswordDTO.getUserId();
+        String password = changePasswordDTO.getPassword();
+        User user = gitlabApi.getUserApi().getUser(userId);
+        gitlabApi.getUserApi().modifyUser(user, password, 1000);
+        return true;
+    }
+
+    @Override
+    public boolean changeUserName(ChangeUserNameDTO changeUserNameDTO) throws GitLabApiException {
+        User user = gitlabApi.getUserApi().getUser(changeUserNameDTO.getUserId());
+        user.setUsername(changeUserNameDTO.getUsername());
+        user.setName(changeUserNameDTO.getUsername());
+        gitlabApi.getUserApi().modifyUser(user, changeUserNameDTO.getPassword(), 1000);
         return true;
     }