Sfoglia il codice sorgente

refactor: group gitlab功能 替换成 seecoder的统一代码服务

370774330@qq.com 5 anni fa
parent
commit
2b96f16e5c

+ 58 - 0
web/src/main/java/seecoder/devcloud/web/controller/user/GroupController.java

@@ -0,0 +1,58 @@
+package seecoder.devcloud.web.controller.user;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import seecoder.devcloud.web.model.vo.Response;
+import seecoder.devcloud.web.service.user.GroupService;
+
+import javax.validation.constraints.Pattern;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/18
+ * @description:
+ */
+@RestController
+@RequestMapping("/groups")
+@Api(tags = "组 api")
+public class GroupController {
+
+    private final GroupService groupService;
+
+    @Autowired
+    public GroupController(GroupService groupService) {
+        this.groupService = groupService;
+    }
+
+    @ApiOperation(value = "创建组", httpMethod = "POST")
+    @ApiImplicitParam(name = "userId",dataType ="string", paramType = "param")
+    @PostMapping()
+    public Response createGroup(@RequestParam("name")
+                                    @Validated
+                                    @Pattern(regexp = "^\\w{3,20}$", message = "组名称只能为长度为3-20且由数字、26个英文字母或者下划线组成的字符串")
+                                            String name){
+        groupService.createGroup(name);
+        return Response.buildSuccess();
+    }
+
+    @ApiOperation(value = "添加组成员", httpMethod = "POST")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "invitedUserId",dataType ="int", paramType = "param"),
+            @ApiImplicitParam(name = "groupId",dataType ="int", paramType = "param")
+    })
+
+    @PostMapping("/members")
+    public Response addMember(@RequestParam("invitedUserId") Integer invitedUserId,
+                              @RequestParam("groupId") Integer groupId){
+        groupService.addMember(invitedUserId, groupId);
+        return Response.buildSuccess();
+    }
+}

+ 1 - 13
web/src/main/java/seecoder/devcloud/web/dao/user/GroupMapper.java

@@ -16,7 +16,7 @@ import seecoder.devcloud.web.model.po.user.Group;
 public interface GroupMapper {
 
     /**
-     * id并非由此后端生成,而是gitlab创建后,将gitlab groupid填入
+     * group id并非由此后端生成,而是gitlab创建后,将gitlab groupid填入
      */
     @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
     int insert(Group group,String... ignoredCols);
@@ -30,16 +30,4 @@ public interface GroupMapper {
     @Select("select * from `group` where name = #{name}")
     Group findGroupByName(String name);
 
-    @Select("select *, id as group_id from `group` where id = #{id}")
-    @Result(column = "group_id", property = "members", many = @Many(select = "seecoder.devcloud.web.dao.user.GroupMemberMapper.selectUsersByGroupId"))
-    Group findWithMembersById(Integer id);
-
-    @Deprecated
-    Group findGroupByShareLink(String shareLink);
-
-
-
-
-
-
 }

+ 1 - 27
web/src/main/java/seecoder/devcloud/web/model/po/user/Group.java

@@ -1,15 +1,10 @@
 package seecoder.devcloud.web.model.po.user;
 
 
-import lombok.Builder;
-import lombok.Data;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import seecoder.devcloud.web.model.enums.GroupType;
-
-import java.util.List;
 
 /**
  * Description:
@@ -25,32 +20,11 @@ import java.util.List;
 public class Group {
 
     /**
-     * id并非由此后端生成,而是gitlab创建后,将gitlab groupid填入
+     * id并非由此后端生成,而是gitlab创建后,将gitlab group id填入
      */
     private Integer id;
 
-    /**
-     * 来源于gitlab
-     */
-    private Integer namespace;
-    /**
-     * 小组类型
-     */
-    private GroupType type;
-
-    /**
-     * 小组的加组链接
-     */
-    private String shareLink;
-
-    /**
-     * 组名
-     */
     private String name;
 
-    /**
-     * 小组成员
-     */
-    private List<User> members;
 
 }

+ 0 - 9
web/src/main/java/seecoder/devcloud/web/model/vo/user/GroupVO.java

@@ -5,9 +5,6 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import seecoder.devcloud.web.model.po.user.Group;
 
-import java.util.List;
-import java.util.stream.Collectors;
-
 /**
  * @EnumName GroupVO
  * @PackageName com.moekr.moocoder.logic.Serializer
@@ -22,16 +19,10 @@ import java.util.stream.Collectors;
 public class GroupVO {
     private Integer id;
     private String name;
-    private String code;
-    private List<UserVO> members;
 
     public GroupVO(Group group) {
         this.id=group.getId();
         this.name=group.getName();
-        this.code=group.getShareLink();
-        this.members=group.getMembers().stream()
-                .map(UserVO::new)
-                .collect(Collectors.toList());
     }
 
 }

+ 20 - 5
web/src/main/java/seecoder/devcloud/web/service/impl/project/ProjectServiceImpl.java

@@ -1,22 +1,32 @@
 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.project.VisibilityForm;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.dao.project.ProjectMapper;
 import seecoder.devcloud.web.model.po.project.Project;
-import seecoder.devcloud.web.service.project.ProjectService;
-import seecoder.devcloud.web.model.vo.Response;
 import seecoder.devcloud.web.model.vo.project.ProjectVO;
+import seecoder.devcloud.web.service.project.ProjectService;
 
 import java.util.List;
 import java.util.stream.Collectors;
 
 @Service
 public class ProjectServiceImpl implements ProjectService {
-    @Autowired
-    ProjectMapper projectMapper;
 
+    private final ProjectMapper projectMapper;
+
+    private final SeecoderGitlabApi seecoderGitlabApi;
+
+    @Autowired
+    public ProjectServiceImpl(ProjectMapper projectMapper, SeecoderGitlabApi seecoderGitlabApi) {
+        this.projectMapper = projectMapper;
+        this.seecoderGitlabApi = seecoderGitlabApi;
+    }
 
     @Override
     public List<ProjectVO> listProjectsByGroupId(int groupId) {
@@ -41,8 +51,13 @@ public class ProjectServiceImpl implements ProjectService {
     public ProjectVO createProject(ProjectVO projectVO) {
         Project project = new Project();
         BeanUtils.copyProperties(projectVO,project);
-
+        try {
+            seecoderGitlabApi.createProject(projectVO.getName(), VisibilityForm.PRIVATE);
+        } catch (SeecoderGitlabException e) {
+            throw new ServiceException("Error: 创建项目是时发生异常[" + e.getMessage() + "]");
+        }
         projectMapper.insertProject(project);
+
         // TODO:在对应的gitlab仓库中注册WEBHOOK
         return new ProjectVO(project);
 

+ 38 - 45
web/src/main/java/seecoder/devcloud/web/service/impl/user/GroupServiceImpl.java

@@ -1,29 +1,25 @@
 package seecoder.devcloud.web.service.impl.user;
 
 
+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.vo.GitlabGroup;
 import lombok.extern.slf4j.Slf4j;
-import org.gitlab4j.api.GitLabApiException;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import seecoder.devcloud.api.gitlab.GitlabApi;
-import seecoder.devcloud.api.gitlab.model.GitlabGroup;
 import seecoder.devcloud.common.exceptions.EntityNotFoundException;
 import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.dao.user.GroupMapper;
 import seecoder.devcloud.web.dao.user.GroupMemberMapper;
-import seecoder.devcloud.web.model.enums.GroupType;
 import seecoder.devcloud.web.model.po.user.Group;
 import seecoder.devcloud.web.model.po.user.User;
-import seecoder.devcloud.web.service.user.GroupService;
 import seecoder.devcloud.web.model.vo.user.GroupVO;
+import seecoder.devcloud.web.service.user.GroupService;
 import seecoder.devcloud.web.service.user.UserService;
 
-import java.util.ArrayList;
 import java.util.List;
-import java.util.UUID;
 
 
 @Service
@@ -31,78 +27,75 @@ import java.util.UUID;
 public class GroupServiceImpl implements GroupService {
     private final GroupMapper groupMapper;
     private final GroupMemberMapper groupMemberMapper;
-    private final GitlabApi gitlabApi;
+
+    private final SeecoderGitlabApi seecoderGitlabApi;
+
+    private final String GROUP_NAME_PREFIX = "DEVCLOUD_";
 
     @Autowired
-    public GroupServiceImpl(GroupMapper groupMapper, GroupMemberMapper groupMemberMapper, GitlabApi gitlabApi) {
+    public GroupServiceImpl(GroupMapper groupMapper, GroupMemberMapper groupMemberMapper, SeecoderGitlabApi seecoderGitlabApi) {
         this.groupMapper = groupMapper;
         this.groupMemberMapper = groupMemberMapper;
-        this.gitlabApi = gitlabApi;
+        this.seecoderGitlabApi = seecoderGitlabApi;
     }
 
     @Override
     @Transactional
-    public GroupVO createGroup(String name, Integer userId) throws ServiceException {
+    public GroupVO createGroup(String name) throws ServiceException {
         if (groupMapper.findGroupByName(name) != null){
             throw new ServiceException("您创建的小组名字已被使用!");
         }
         User user = UserService.loginUser();
-        List<User> members = new ArrayList<>();
-        members.add(user);
-        GitlabGroup gitGroup;
+        GitlabGroup gitlabGroup = null;
         try {
-            gitGroup = gitlabApi.createGroup(name);
-            gitlabApi.addMemberToGroup(gitGroup.getId(), user.getId());
-        } catch (GitLabApiException e) {
-            log.error(e.getMessage(), e);
-            throw new RuntimeException("创建Group时发生异常[" + e.getMessage() + "]");
+            gitlabGroup = seecoderGitlabApi.createGroup(GROUP_NAME_PREFIX + name);
+            seecoderGitlabApi.addMember(gitlabGroup.getGroupId(), user.getId(), AccessLevelForm.MASTER);
+        } catch (SeecoderGitlabException e) {
+            throw new ServiceException("Error: 创建Group时发生异常[" + e.getMessage() + "]");
         }
         Group group = Group.builder()
-                .id(gitGroup.getId())
+                .id(gitlabGroup.getGroupId())
                 .name(name)
-                .namespace(gitGroup.getNamespace())
-                .shareLink(UUID.randomUUID().toString().replace("-", ""))
-                .type(GroupType.GROUP)
-                .members(members)
                 .build();
-        groupMapper.insert(group, "members");
-        groupMemberMapper.insert(gitGroup.getId(), userId);
+        groupMapper.insert(group);
+        groupMemberMapper.insert(gitlabGroup.getGroupId(), user.getId());
         return new GroupVO(group);
     }
 
 
     @Override
     //@Transactional
-    public GroupVO addMember(Integer userId, Integer invitedUserId, Integer groupId) throws EntityNotFoundException {
+    public void addMember(Integer invitedUserId, Integer groupId) throws EntityNotFoundException {
+        //当前登陆的用户id
+        int userId = UserService.loginUser().getId();
+
+        //只有在组内的用户才能邀请
         List<Integer> userIds = groupMemberMapper.selectUserIdsByGroupId(groupId);
         if (!userIds.contains(userId)) {
-            throw new EntityNotFoundException("小组邀请发生错误,用户没有权限!");
+            throw new EntityNotFoundException("Error: 小组邀请发生错误,用户没有权限!");
         }
         if (userIds.contains(invitedUserId)) {
-            throw new RuntimeException("邀请的用户已经加入小组!");
+            throw new RuntimeException("Error: 邀请的用户已经加入小组!");
         }
         try {
-            gitlabApi.addMemberToGroup(groupId, invitedUserId);
-        } catch (GitLabApiException e) {
-            log.error(e.getMessage(), e);
-            throw new RuntimeException("将成员加入Group时发生异常[" + e.getMessage() + "]");
+            seecoderGitlabApi.addMember(groupId, invitedUserId, AccessLevelForm.MASTER);
+        } catch (SeecoderGitlabException e) {
+            throw new ServiceException("Error: 将成员加入Group时发生异常[" + e.getMessage() + "]");
         }
         groupMemberMapper.insert(groupId, invitedUserId);
-        Group group = groupMapper.findWithMembersById(groupId);
-        return new GroupVO(group);
+        //Group group = groupMapper.findWithMembersById(groupId);
     }
 
     @Override
     public void quitGroup(Integer groupId, Integer userId) throws ServiceException {
 
-        try {
-            gitlabApi.quitGroup(groupId,userId);
-        } catch (GitLabApiException e) {
-            log.error(e.getMessage(), e);
-            throw new ServiceException(e.getMessage());
-        }
-        groupMemberMapper.delete(groupId,userId);
-
+//        try {
+//            gitlabApi.quitGroup(groupId,userId);
+//        } catch (GitLabApiException e) {
+//            log.error(e.getMessage(), e);
+//            throw new ServiceException(e.getMessage());
+//        }
+//        groupMemberMapper.delete(groupId,userId);
     }
 }
 

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

@@ -33,7 +33,9 @@ public interface ProjectService {
 
     /**
      * 删除项目,懒删除
+     * todo 目前统一代码服务没有提供对应接口,此方法过期,待统一代码服务api更新后再补回
      */
+    @Deprecated
     void deleteProject(int projectId);
 
 }

+ 9 - 2
web/src/main/java/seecoder/devcloud/web/service/user/GroupService.java

@@ -18,9 +18,16 @@ import seecoder.devcloud.web.model.vo.user.GroupVO;
 @Service
 public interface GroupService {
 
-    GroupVO createGroup(String name,  Integer userId) throws ServiceException;
+    /**
+     * 创建组,组的名字前面会加上 GROUP_NAME_PREFIX = "DEVCLOUD_" 的前缀
+     */
+    GroupVO createGroup(String name) throws ServiceException;
 
-    GroupVO addMember(Integer userId, Integer invitedUserId, Integer groupId)  throws EntityNotFoundException;
+    void addMember(Integer invitedUserId, Integer groupId)  throws EntityNotFoundException;
 
+    /**
+     * todo 目前统一代码服务没有提供对应接口,此方法过期,待统一代码服务api更新后再补回
+     */
+    @Deprecated
     void quitGroup(Integer groupId, Integer userId) throws ServiceException;
 }

+ 1 - 1
web/src/main/java/seecoder/devcloud/web/service/user/UserService.java

@@ -10,7 +10,7 @@ public interface UserService {
     UserVO getLoginUser();
 
     /**
-     * 用于内部获取登🦌用户PO
+     * 用于内部获取登用户PO
      */
     static User loginUser(){
         return (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

+ 1 - 4
web/src/main/resources/SQLscripts/group.sql

@@ -2,9 +2,6 @@ create table if not exists devcloud.`group`
 (
     id         int                      not null
         primary key,
-    name       varchar(23) charset utf8 not null,
-    namespace  int                      not null,
-    share_link varchar(63)              not null,
-    type       varchar(15) charset utf8 null
+    name       varchar(23) charset utf8 not null
 );
 

+ 0 - 3
web/src/main/resources/SQLscripts/group_member.sql

@@ -4,8 +4,5 @@ create table if not exists devcloud.group_member
     user_id  int not null,
     constraint group_member_group_id_fk
         foreign key (group_id) references devcloud.`group` (id)
-            on delete cascade,
-    constraint group_member_user_id_fk
-        foreign key (user_id) references devcloud.user (id)
             on delete cascade
 );

+ 4 - 9
web/src/test/java/seecoder/devcloud/web/dao/user/GroupMapperTest.java

@@ -1,15 +1,11 @@
 package seecoder.devcloud.web.dao.user;
 
-import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.annotation.ComponentScan;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import static org.junit.jupiter.api.Assertions.*;
-
 /**
  * @author PuHong Weng
  * @date 2021/3/4
@@ -17,15 +13,14 @@ import static org.junit.jupiter.api.Assertions.*;
  */
 @RunWith(SpringRunner.class)
 @SpringBootTest
-@ComponentScan({"seecoder.devcloud.api","seecoder.devcloud.common","seecoder.devcloud.web"})
 @MapperScan(basePackages = {"seecoder.devcloud.web.dao"})
 class GroupMapperTest {
 
     @Autowired
-    private GroupMapper groupMapper;
+    private final GroupMapper groupMapper;
 
-    @Test
-    void findWithMembersById() {
-        System.out.println(groupMapper.findWithMembersById(47));
+    GroupMapperTest(GroupMapper groupMapper) {
+        this.groupMapper = groupMapper;
     }
+
 }

+ 3 - 18
web/src/test/java/seecoder/devcloud/web/service/user/GroupServiceTest.java

@@ -2,7 +2,6 @@ package seecoder.devcloud.web.service.user;
 
 import org.gitlab4j.api.GitLabApi;
 import org.gitlab4j.api.GitLabApiException;
-import org.gitlab4j.api.models.Group;
 import org.junit.Assert;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -16,11 +15,6 @@ import seecoder.devcloud.api.ApplicationProperties;
 import seecoder.devcloud.common.exceptions.EntityNotFoundException;
 import seecoder.devcloud.common.exceptions.ServiceException;
 
-import javax.transaction.Transactional;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.*;
-
 /**
  * @author PuHong Weng
  * @date 2021/3/4
@@ -69,18 +63,9 @@ class GroupServiceTest {
     void createGroup() {
         int userId = 36;
         try {
-            System.out.println(groupService.createGroup("testgroup1",userId));
+            System.out.println(groupService.createGroup("test"));
         } catch (Exception e) {
-            e.printStackTrace();
-            try {
-                List<Group> groups = gitLabApi.getGroupApi().getGroups();
-                Group group = groups.get(groups.size()-1);
-                gitLabApi.getGroupApi().deleteGroup(group.getId());
-            } catch (GitLabApiException gitLabApiException) {
-                System.out.println(gitLabApiException.getMessage());
-            }finally {
-                Assert.fail(e.getMessage());
-            }
+            Assert.fail(e.getMessage());
         }
     }
 
@@ -90,7 +75,7 @@ class GroupServiceTest {
         int userId = 36;
         int invitedUserId = 37;
         try {
-            groupService.addMember(userId, invitedUserId, groupId);
+            groupService.addMember(invitedUserId, groupId);
         } catch (EntityNotFoundException e) {
             e.printStackTrace();
             Assert.fail(e.getMessage());