Sfoglia il codice sorgente

feat:组功能迁移完毕

370774330@qq.com 5 anni fa
parent
commit
e163c2cb94

+ 3 - 0
api/src/main/java/seecoder/devcloud/api/gitlab/GitlabApi.java

@@ -24,8 +24,11 @@ public interface GitlabApi {
 	//50 => Owner access # Only valid for groups
 	//50 => Owner access # Only valid for groups
 	GitlabGroup createGroup(String groupName) throws GitLabApiException;
 	GitlabGroup createGroup(String groupName) throws GitLabApiException;
 
 
+
 	void addMemberToGroup(Integer groupId, Integer userId) throws GitLabApiException;
 	void addMemberToGroup(Integer groupId, Integer userId) throws GitLabApiException;
 
 
+	void quitGroup(Integer groupId, Integer userId) throws GitLabApiException;
+
 	Integer addProjectToGroup(Integer groupId, String projectName) throws GitLabApiException;
 	Integer addProjectToGroup(Integer groupId, String projectName) throws GitLabApiException;
 
 
 	/**
 	/**

+ 6 - 0
api/src/main/java/seecoder/devcloud/api/gitlab/impl/GitlabApiImpl.java

@@ -76,6 +76,12 @@ public class GitlabApiImpl implements GitlabApi {
         server.getGroupApi().addMember(groupId, userId, AccessLevel.MASTER);
         server.getGroupApi().addMember(groupId, userId, AccessLevel.MASTER);
     }
     }
 
 
+    @Override
+    public void quitGroup(Integer groupId, Integer userId) throws GitLabApiException {
+        server.getGroupApi().removeMember(groupId,userId);
+    }
+
+
     @Override
     @Override
     public synchronized Integer addProjectToGroup(Integer groupId, String projectName) throws GitLabApiException {
     public synchronized Integer addProjectToGroup(Integer groupId, String projectName) throws GitLabApiException {
         final Project project = server.getProjectApi().createProject(groupId, projectName);
         final Project project = server.getProjectApi().createProject(groupId, projectName);

+ 3 - 2
web/src/main/java/seecoder/devcloud/web/dao/InsertUpdateSqlProvider.java

@@ -25,7 +25,7 @@ public class InsertUpdateSqlProvider {
             map = getFieldsMap(obj, true, false);
             map = getFieldsMap(obj, true, false);
             // 创建 需要赋当前的时间的timestamp字段 在这里排除,否则无法正常赋值
             // 创建 需要赋当前的时间的timestamp字段 在这里排除,否则无法正常赋值
             for (String col: ignoredCols){
             for (String col: ignoredCols){
-                map.remove(col);
+                map.remove(camelCase2Underscore(col));
             }
             }
         } catch (IllegalArgumentException | IllegalAccessException e) {
         } catch (IllegalArgumentException | IllegalAccessException e) {
             throw new RuntimeException(e);
             throw new RuntimeException(e);
@@ -147,7 +147,8 @@ public class InsertUpdateSqlProvider {
         for (String w : s.split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])")) {
         for (String w : s.split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])")) {
             buf.append("_").append(w.toLowerCase());
             buf.append("_").append(w.toLowerCase());
         }
         }
-        return buf.substring(1);
+
+        return "`"+ buf.substring(1) + "`";
     }
     }
 
 
 }
 }

+ 12 - 10
web/src/main/java/seecoder/devcloud/web/dao/user/GroupMapper.java

@@ -5,20 +5,20 @@ package seecoder.devcloud.web.dao.user;
 import org.apache.ibatis.annotations.*;
 import org.apache.ibatis.annotations.*;
 import seecoder.devcloud.web.dao.InsertUpdateSqlProvider;
 import seecoder.devcloud.web.dao.InsertUpdateSqlProvider;
 import seecoder.devcloud.web.po.user.Group;
 import seecoder.devcloud.web.po.user.Group;
+import seecoder.devcloud.web.po.user.User;
 
 
 import java.awt.geom.GeneralPath;
 import java.awt.geom.GeneralPath;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
- * Description:
- *
- * @author xxz
- * Created on 10/30/2018
+ * @author PuHong Weng
+ * @date 2021/3/4
+ * @description:
+ * todo 因为组和gitlab相连,删除组的功能如要实现需要把gitlab资源也删除
  */
  */
 @Mapper
 @Mapper
 public interface GroupMapper {
 public interface GroupMapper {
 
 
-
     /**
     /**
      * id并非由此后端生成,而是gitlab创建后,将gitlab groupid填入
      * id并非由此后端生成,而是gitlab创建后,将gitlab groupid填入
      */
      */
@@ -28,13 +28,15 @@ public interface GroupMapper {
     @UpdateProvider(type= InsertUpdateSqlProvider.class, method="updateById")
     @UpdateProvider(type= InsertUpdateSqlProvider.class, method="updateById")
     int update(Group group);
     int update(Group group);
 
 
-    @Select("select * from group where id = #{id}")
+    @Select("select * from `group` where id = #{id}")
     Group findGroupById(Integer id);
     Group findGroupById(Integer id);
 
 
-    @Select("select * from group where id = #{id}")
-    @Result(column = "id", property = "member",many = @Many(
-            select = ""
-    ))
+    @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);
     Group findWithMembersById(Integer id);
 
 
     @Deprecated
     @Deprecated

+ 7 - 9
web/src/main/java/seecoder/devcloud/web/dao/user/GroupMemberMapper.java

@@ -14,11 +14,11 @@ import java.util.List;
  */
  */
 public interface GroupMemberMapper {
 public interface GroupMemberMapper {
 
 
-    @Insert("insert into group_member (group_id,user_id) values (#{groupId}#{userId}) ")
-    int insert(int groupId,int userId);
+    @Insert("insert into group_member (group_id,user_id) values (#{groupId}, #{userId}) ")
+    int insert(@Param("groupId") int groupId,@Param("userId") int userId);
 
 
     @Delete("delete from group_member where group_id = #{groupId} and user_id = #{userId}")
     @Delete("delete from group_member where group_id = #{groupId} and user_id = #{userId}")
-    int delete(int groupId, int userId);
+    int delete(@Param("groupId") int groupId,@Param("userId")  int userId);
 
 
     @Select("select user_id from group_member where group_id = #{groupId}")
     @Select("select user_id from group_member where group_id = #{groupId}")
     List<Integer> selectUserIdsByGroupId(int groupId);
     List<Integer> selectUserIdsByGroupId(int groupId);
@@ -26,12 +26,10 @@ public interface GroupMemberMapper {
     @Select("select group_id from group_member where user_id = #{userId}")
     @Select("select group_id from group_member where user_id = #{userId}")
     List<Integer> selectGroupIdsByUserId(int groupId);
     List<Integer> selectGroupIdsByUserId(int groupId);
 
 
-    @Select("select user_id from group_member where group_id = #{groupId}")
-    @Result(column = "user_id", one = @One(select = "seecoder.devcloud.web.service.impl.user.findById"))
-    List<User> selectUserByGroupId(int groupId);
-
+    @Select("select u.* from group_member gm, user u where u.id = gm.user_id and gm.group_id = #{groupId}")
+    List<User> selectUsersByGroupId(int groupId);
 
 
-    @Select("select group_id from group_member where user_id = #{userId}")
-    List<Group> selectGroupByUserId(int groupId);
+    @Select("select g.* from group_member gm, group g where g.id = gm.group_id and gm.userId = #{userId}")
+    List<Group> selectGroupsByUserId(int userId);
 
 
 }
 }

+ 1 - 0
web/src/main/java/seecoder/devcloud/web/dao/user/UserMapper.java

@@ -8,6 +8,7 @@ import seecoder.devcloud.web.dao.InsertUpdateSqlProvider;
 import seecoder.devcloud.web.po.user.User;
 import seecoder.devcloud.web.po.user.User;
 
 
 import java.sql.Timestamp;
 import java.sql.Timestamp;
+import java.util.List;
 
 
 
 
 @Mapper
 @Mapper

+ 4 - 0
web/src/main/java/seecoder/devcloud/web/po/user/Group.java

@@ -1,8 +1,10 @@
 package seecoder.devcloud.web.po.user;
 package seecoder.devcloud.web.po.user;
 
 
 
 
+import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 import seecoder.devcloud.web.enums.GroupType;
 import seecoder.devcloud.web.enums.GroupType;
 
 
 import java.util.List;
 import java.util.List;
@@ -16,6 +18,8 @@ import java.util.List;
  */
  */
 @Data
 @Data
 @Builder
 @Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class Group {
 public class Group {
 
 
     /**
     /**

+ 22 - 9
web/src/main/java/seecoder/devcloud/web/service/impl/user/GroupServiceImp.java → web/src/main/java/seecoder/devcloud/web/service/impl/user/GroupServiceImpl.java

@@ -9,6 +9,7 @@ import org.springframework.transaction.annotation.Transactional;
 import seecoder.devcloud.api.gitlab.GitlabApi;
 import seecoder.devcloud.api.gitlab.GitlabApi;
 import seecoder.devcloud.api.gitlab.model.GitlabGroup;
 import seecoder.devcloud.api.gitlab.model.GitlabGroup;
 import seecoder.devcloud.common.exceptions.EntityNotFoundException;
 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.GroupMapper;
 import seecoder.devcloud.web.dao.user.GroupMemberMapper;
 import seecoder.devcloud.web.dao.user.GroupMemberMapper;
 import seecoder.devcloud.web.dao.user.UserMapper;
 import seecoder.devcloud.web.dao.user.UserMapper;
@@ -25,14 +26,14 @@ import java.util.UUID;
 
 
 
 
 @Service
 @Service
-public class GroupServiceImp implements GroupService {
+public class GroupServiceImpl implements GroupService {
     private final GroupMapper groupMapper;
     private final GroupMapper groupMapper;
     private final UserMapper userMapper;
     private final UserMapper userMapper;
     private final GroupMemberMapper groupMemberMapper;
     private final GroupMemberMapper groupMemberMapper;
     private final GitlabApi gitlabApi;
     private final GitlabApi gitlabApi;
 
 
     @Autowired
     @Autowired
-    public GroupServiceImp(GroupMapper groupMapper, UserMapper userMapper, GroupMemberMapper groupMemberMapper, GitlabApi gitlabApi) {
+    public GroupServiceImpl(GroupMapper groupMapper, UserMapper userMapper, GroupMemberMapper groupMemberMapper, GitlabApi gitlabApi) {
         this.groupMapper = groupMapper;
         this.groupMapper = groupMapper;
         this.userMapper = userMapper;
         this.userMapper = userMapper;
         this.groupMemberMapper = groupMemberMapper;
         this.groupMemberMapper = groupMemberMapper;
@@ -41,9 +42,11 @@ public class GroupServiceImp implements GroupService {
 
 
     @Override
     @Override
     @Transactional
     @Transactional
-    public GroupVO createGroup(String name,  Integer userId) throws EntityNotFoundException {
+    public GroupVO createGroup(String name, Integer userId) throws ServiceException {
+        if (groupMapper.findGroupByName(name) != null){
+            throw new ServiceException("您创建的小组名字已被使用!");
+        }
         User user = userMapper.findById(userId);
         User user = userMapper.findById(userId);
-
         List<User> members = new ArrayList<>();
         List<User> members = new ArrayList<>();
         members.add(user);
         members.add(user);
         GitlabGroup gitGroup;
         GitlabGroup gitGroup;
@@ -62,13 +65,13 @@ public class GroupServiceImp implements GroupService {
                 .members(members)
                 .members(members)
                 .build();
                 .build();
         groupMapper.insert(group, "members");
         groupMapper.insert(group, "members");
-        groupMemberMapper.insert(gitGroup.getId(),userId);
+        groupMemberMapper.insert(gitGroup.getId(), userId);
         return new GroupVO(group);
         return new GroupVO(group);
     }
     }
 
 
 
 
     @Override
     @Override
-    @Transactional
+    //@Transactional
     public GroupVO addMember(Integer userId, Integer invitedUserId, Integer groupId) throws EntityNotFoundException {
     public GroupVO addMember(Integer userId, Integer invitedUserId, Integer groupId) throws EntityNotFoundException {
         List<Integer> userIds = groupMemberMapper.selectUserIdsByGroupId(groupId);
         List<Integer> userIds = groupMemberMapper.selectUserIdsByGroupId(groupId);
         if (!userIds.contains(userId)) {
         if (!userIds.contains(userId)) {
@@ -82,11 +85,21 @@ public class GroupServiceImp implements GroupService {
         } catch (GitLabApiException e) {
         } catch (GitLabApiException e) {
             throw new RuntimeException("将成员加入Group时发生异常[" + e.getMessage() + "]");
             throw new RuntimeException("将成员加入Group时发生异常[" + e.getMessage() + "]");
         }
         }
-        groupMemberMapper.insert(groupId,invitedUserId);
-
+        groupMemberMapper.insert(groupId, invitedUserId);
+        Group group = groupMapper.findWithMembersById(groupId);
         return new GroupVO(group);
         return new GroupVO(group);
+    }
+
+    @Override
+    public void quitGroup(Integer groupId, Integer userId) throws ServiceException {
+
+        try {
+            gitlabApi.quitGroup(groupId,userId);
+        } catch (GitLabApiException e) {
+            throw new ServiceException(e.getMessage());
         }
         }
+        groupMemberMapper.delete(groupId,userId);
 
 
     }
     }
-
 }
 }
+

+ 6 - 3
web/src/main/java/seecoder/devcloud/web/service/user/GroupService.java

@@ -2,7 +2,9 @@ package seecoder.devcloud.web.service.user;
 
 
 
 
 
 
+import org.springframework.stereotype.Service;
 import seecoder.devcloud.common.exceptions.EntityNotFoundException;
 import seecoder.devcloud.common.exceptions.EntityNotFoundException;
+import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.vo.user.CustomUserDetails;
 import seecoder.devcloud.web.vo.user.CustomUserDetails;
 import seecoder.devcloud.web.vo.user.GroupVO;
 import seecoder.devcloud.web.vo.user.GroupVO;
 import seecoder.devcloud.web.vo.user.InnerGroupVO;
 import seecoder.devcloud.web.vo.user.InnerGroupVO;
@@ -17,11 +19,12 @@ import java.util.List;
  * @Version 1.0
  * @Version 1.0
  * @Description
  * @Description
  **/
  **/
+@Service
 public interface GroupService {
 public interface GroupService {
 
 
-    GroupVO createGroup(String name,  Integer userId) throws EntityNotFoundException;
+    GroupVO createGroup(String name,  Integer userId) throws ServiceException;
 
 
-    GroupVO addMember(String code, CustomUserDetails userDetails) throws EntityNotFoundException;
+    GroupVO addMember(Integer userId, Integer invitedUserId, Integer groupId)  throws EntityNotFoundException;
 
 
-    GroupVO getGroupsById(Integer groupId);
+    void quitGroup(Integer groupId, Integer userId) throws ServiceException;
 }
 }

+ 31 - 0
web/src/test/java/seecoder/devcloud/web/dao/user/GroupMapperTest.java

@@ -0,0 +1,31 @@
+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
+ * @description:
+ */
+@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;
+
+    @Test
+    void findWithMembersById() {
+        System.out.println(groupMapper.findWithMembersById(47));
+    }
+}

+ 45 - 0
web/src/test/java/seecoder/devcloud/web/dao/user/GroupMemberMapperTest.java

@@ -0,0 +1,45 @@
+package seecoder.devcloud.web.dao.user;
+
+import org.junit.Assert;
+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;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/3/4
+ * @description: 与gitlab交互,没有办法配事务,只能手动测试。mvn test的时候请排除这个类
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@ComponentScan({"seecoder.devcloud.api","seecoder.devcloud.common","seecoder.devcloud.web"})
+@MapperScan(basePackages = {"seecoder.devcloud.web.dao"})
+class GroupMemberMapperTest {
+
+
+    private final GroupMemberMapper groupMemberMapper;
+
+    @Autowired
+    GroupMemberMapperTest(GroupMemberMapper groupMemberMapper) {
+        this.groupMemberMapper = groupMemberMapper;
+    }
+
+
+    @Test
+    void selectUsersByGroupId() {
+        try{
+            System.out.println(groupMemberMapper.selectUsersByGroupId(47));
+        } catch (Exception e){
+            Assert.fail(e.getMessage());
+        }
+
+    }
+
+    @Test
+    void selectGroupsByUserId() {
+    }
+}

+ 111 - 0
web/src/test/java/seecoder/devcloud/web/service/user/GroupServiceTest.java

@@ -0,0 +1,111 @@
+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;
+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 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
+ * @description: 与gitlab交互,没有办法配事务,只能手动测试。mvn test的时候请排除这个类
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@ComponentScan({"seecoder.devcloud.api","seecoder.devcloud.common","seecoder.devcloud.web"})
+@MapperScan(basePackages = {"seecoder.devcloud.web.dao"})
+//@Transactional
+class GroupServiceTest {
+
+    @Autowired
+    GroupService groupService;
+
+    @Autowired
+    UserService userService;
+
+    @Autowired
+    ApplicationProperties properties;
+
+    /**
+     * 注意 GitlabApi 和 GitLabApi 区别
+     * GitlabApi 是我们对 GitLabApi 的一个小封装
+     * 这里作辅助测试用
+     */
+    GitLabApi gitLabApi;
+
+    @BeforeEach
+    void setUp() {
+        gitLabApi = new GitLabApi(properties.getGitlab().getHost(), properties.getGitlab().getToken());
+    }
+
+    @Test
+    void handler(){
+        try {
+            //gitLabApi.getGroupApi().deleteGroup(46);
+            System.out.println(gitLabApi.getGroupApi().getGroups());
+        } catch (GitLabApiException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    @Test
+    void createGroup() {
+        int userId = 36;
+        try {
+            System.out.println(groupService.createGroup("testgroup1",userId));
+        } 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());
+            }
+        }
+    }
+
+    @Test
+    void addMember() {
+        int groupId = 51;
+        int userId = 36;
+        int invitedUserId = 37;
+        try {
+            groupService.addMember(userId, invitedUserId, groupId);
+        } catch (EntityNotFoundException e) {
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+
+    }
+
+
+    @Test
+    void quitGroup() {
+        try {
+            groupService.quitGroup(47,37);
+        } catch (ServiceException serviceException) {
+            serviceException.printStackTrace();
+            Assert.fail(serviceException.getMessage());
+        }
+    }
+}

+ 5 - 5
web/src/test/java/seecoder/devcloud/web/service/user/UserServiceTest.java

@@ -51,9 +51,9 @@ class UserServiceTest {
     @Test
     @Test
     void register() {
     void register() {
         RegisterVO registerVO = RegisterVO.builder()
         RegisterVO registerVO = RegisterVO.builder()
-                .username("wphwphtest")
-                .password("wphwphtest")
-                .email("370774330@qq.com")
+                .username("gfygfytest")
+                .password("gfygfytest")
+                .email("308213885@qq.com")
                 .nickname("kennyday")
                 .nickname("kennyday")
                 .build();
                 .build();
         try {
         try {
@@ -67,8 +67,8 @@ class UserServiceTest {
     @Test
     @Test
     void delete() {
     void delete() {
         try {
         try {
-            //userService.delete(33);
-            gitLabApi.getUserApi().deleteUser(35);
+            userService.delete(36);
+            //gitLabApi.getUserApi().deleteUser(35);
             System.out.println(gitLabApi.getUserApi().getActiveUsers().stream().map(AbstractUser::getId).collect(Collectors.toList()));
             System.out.println(gitLabApi.getUserApi().getActiveUsers().stream().map(AbstractUser::getId).collect(Collectors.toList()));
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();