Forráskód Böngészése

feat:增加了组队邀请功能

DingXiaoYu 3 éve
szülő
commit
b9d555603b

+ 2 - 1
seecoder-portal-common/src/main/java/cn/seecoder/seecoderportalcommon/vo/ActionType.java

@@ -1,7 +1,8 @@
 package cn.seecoder.seecoderportalcommon.vo;
 
 public enum ActionType {
-    COMMENT("COMMENT");
+    COMMENT("COMMENT"),
+    INVITATION("INVITATION");
 
     private final String type;
 

+ 2 - 1
seecoder-portal-common/src/main/java/cn/seecoder/seecoderportalcommon/vo/ObjectType.java

@@ -5,7 +5,8 @@ public enum ObjectType {
     ANNOUNCEMENT("ANNOUNCEMENT"),
     HOMEWORK("HOMEWORK"),
     EXAM("EXAM"),
-    COMMENT("COMMENT");
+    COMMENT("COMMENT"),
+    INVITATION("INVITATION");
 
     private final String type;
 

+ 3 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/repository/MessageRepository.java

@@ -22,4 +22,7 @@ public interface MessageRepository extends JpaRepository<Message, Long> {
     List<Message> findMessagesByTargetIdAndCreatedAtIsBetweenAndStateNot(@NotNull Long targetId, @NotNull OffsetDateTime createdAt, @NotNull OffsetDateTime createdAt2, @NotNull ObjectState state);
 
     Optional<Message> findFirstMessageByTargetIdOrderByCreatedAt(@NotNull Long targetId);
+
+    List<Message> findMessagesByActionTypeAndMntId(@NotNull ActionType actionType, @NotNull Long mntId);
+
 }

+ 10 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/GroupService.java

@@ -45,6 +45,14 @@ public interface GroupService {
      */
     GroupDTO addGroupMember(GroupMemberVO groupMemberVO);
 
+    /**
+     * 发送组队邀请
+     *
+     * @param groupMemberVO
+     * @return
+     */
+    GroupDTO sendInvitation(GroupMemberVO groupMemberVO);
+
 
     /**
      * 查找某个课程小组
@@ -62,4 +70,6 @@ public interface GroupService {
      * @return List
      */
     List<GroupDTO> findAllGroupsByCourse(Long courseId);
+
+
 }

+ 2 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/service/MessageService.java

@@ -22,4 +22,6 @@ public interface MessageService {
     JSONObject findViewByMessage(Long id);
 
     String readMessage(Long id, Long userId);
+
+    List<MessageVO> findUnreadInvitationsByUser(Long id);
 }

+ 53 - 1
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/GroupServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.seecoder.seecoderportalserver.serviceImpl;
 
+import cn.seecoder.seecoderportalcommon.vo.*;
 import cn.seecoder.seecoderportalcommon.vo.dto.GroupDTO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupMemberVO;
 import cn.seecoder.seecoderportalcommon.vo.group.GroupRuleVO;
@@ -17,6 +18,7 @@ import cn.seecoder.seecoderportalserver.security.DomainUserDetails;
 import cn.seecoder.seecoderportalserver.security.SecurityUtils;
 import cn.seecoder.seecoderportalserver.service.CourseService;
 import cn.seecoder.seecoderportalserver.service.GroupService;
+import cn.seecoder.seecoderportalserver.service.MessageService;
 import cn.seecoder.seecoderportalserver.service.UserService;
 import cn.seecoder.seecoderportalserver.web.rest.errors.CustomErrorException;
 import org.postgresql.util.PSQLException;
@@ -25,6 +27,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.OffsetDateTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -43,8 +46,9 @@ public class GroupServiceImpl implements GroupService {
     private final GroupMemberMapper groupMemberMapper;
     private final CourseService courseService;
     private final UserService userService;
+    private final MessageService messageService;
 
-    public GroupServiceImpl(GroupRepository groupRepository, GroupMapper groupMapper, GroupRuleRepository groupRuleRepository, GroupRuleMapper groupRuleMapper, GroupMemberRepository groupMemberRepository, GroupMemberMapper groupMemberMapper, CourseService courseService, UserService userService) {
+    public GroupServiceImpl(GroupRepository groupRepository, GroupMapper groupMapper, GroupRuleRepository groupRuleRepository, GroupRuleMapper groupRuleMapper, GroupMemberRepository groupMemberRepository, GroupMemberMapper groupMemberMapper, CourseService courseService, UserService userService, MessageService messageService) {
         this.groupRepository = groupRepository;
         this.groupMapper = groupMapper;
         this.groupRuleRepository = groupRuleRepository;
@@ -53,6 +57,7 @@ public class GroupServiceImpl implements GroupService {
         this.groupMemberMapper = groupMemberMapper;
         this.courseService = courseService;
         this.userService = userService;
+        this.messageService = messageService;
     }
 
     @Override
@@ -90,6 +95,12 @@ public class GroupServiceImpl implements GroupService {
         Long courseId = groupMemberVO.getCourseId();
         Long userId = groupMemberVO.getUserId();
         String tableName = getGroupMemberTableName(courseId);
+        //对应前端,这里传入的组号并非真的是组号,而是发起者的id
+        try {
+            groupMemberVO.setGroupId(groupMemberRepository.findByUserId(tableName,groupMemberVO.getGroupId()).getGroupId());
+        }catch (Exception e){
+            throw new RuntimeException();
+        }
         // 验证选课
         if (!courseService.checkSelection(userId, courseId)) {
             throw CustomErrorException.courseSelectionNotFound();
@@ -117,6 +128,47 @@ public class GroupServiceImpl implements GroupService {
         return generateGroupDTO(courseId, group);
     }
 
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public GroupDTO sendInvitation(GroupMemberVO groupMemberVO) {
+        Long courseId = groupMemberVO.getCourseId();
+        Long userId = groupMemberVO.getUserId();
+        String tableName = getGroupMemberTableName(courseId);
+        // 验证选课
+        if (!courseService.checkSelection(userId, courseId)) {
+            throw CustomErrorException.courseSelectionNotFound();
+        }
+        // 验证尚未加入小组
+        try {
+            if (groupMemberRepository.findByUserId(tableName, userId) != null) {
+                throw CustomErrorException.groupMemberAlreadyExists();
+            }
+        } catch (PSQLException e) {
+            throw new RuntimeException(e);
+        }
+        // 验证小组未满员
+        GroupRule groupRule = groupRuleRepository.findByCourse_Id(courseId)
+                .orElseThrow(CustomErrorException::groupRuleNotFound);
+        int currentSize = groupMemberRepository.findByGroupId(tableName, groupMemberVO.getGroupId()).size();
+        if (currentSize == groupRule.getMaxSize()) {
+            throw CustomErrorException.groupAlreadyMaxSize();
+        }
+        //发送邀请
+        MessageVO messageVO=new MessageVO();
+        DomainUserDetails user = SecurityUtils.getCurrentUser();
+        messageVO.setContent(user.getName()+"邀请您加入他的小组。");
+        messageVO.setCreatedAt(OffsetDateTime.now());
+        messageVO.setState(ObjectState.NORMAL);
+        messageVO.setActionType(ActionType.INVITATION);
+        messageVO.setMntId(groupMemberVO.getUserId());
+        messageVO.setSender(new UserVOSimplified());
+        messageVO.setTargetType(ObjectType.INVITATION);
+        messageVO.setTargetId(groupMemberVO.getCourseId());
+        messageService.create(messageVO,user.getId());
+        Group group = groupRepository.findGroupById(getGroupTableName(courseId), groupMemberVO.getGroupId());
+        return generateGroupDTO(courseId, group);
+    }
+
     @Override
     public GroupDTO findGroup(Long courseId) throws CustomErrorException {
         DomainUserDetails user = SecurityUtils.getCurrentUser();

+ 32 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/serviceImpl/MessageServiceImpl.java

@@ -207,6 +207,7 @@ public class MessageServiceImpl implements MessageService {
             case ANNOUNCEMENT:
             case EXAM:
             case HOMEWORK:
+            case INVITATION:
             default:
                 break;
         }
@@ -220,4 +221,35 @@ public class MessageServiceImpl implements MessageService {
         messageRecordRepository.save(record);
         return "消息阅读完成";
     }
+
+    @Override
+    public List<MessageVO> findUnreadInvitationsByUser(Long id) {
+        List<MessageVO> result = new ArrayList<>();
+        if (userService.isStudent(userService.findUserById(id).getRole())){
+            for (Message message : messageRepository
+                    .findMessagesByActionTypeAndMntId(ActionType.INVITATION,id)) {
+                result.add(messageMapper.toMessageVO(message));
+            }
+        }
+        result = result.stream()
+                .filter(messageVO -> {
+                    MessageRecord record = messageRecordRepository
+                            .findById(new MessageRecordKey(
+                                    messageVO.getId(),
+                                    id)).orElse(null);
+                    if (record == null) {
+                        messageRecordRepository.save(
+                                new MessageRecord(messageVO.getId(),
+                                        id,
+                                        OffsetDateTime.now(),
+                                        false,
+                                        null));
+                        return true;
+                    } else {
+                        return !record.getState();
+                    }
+                })
+                .collect(Collectors.toList());
+        return result;
+    }
 }

+ 5 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/GroupController.java

@@ -42,6 +42,11 @@ public class GroupController {
         return OkResponse.of(groupService.addGroupMember(groupMemberVO));
     }
 
+    @PostMapping("/invite")
+    public OkResponse<GroupDTO> sendInvitation(@RequestBody GroupMemberVO groupMemberVO){
+        return OkResponse.of(groupService.sendInvitation(groupMemberVO));
+    }
+
     @GetMapping
     public OkResponse<GroupDTO> findGroup(@RequestParam Long courseId){
         return OkResponse.of(groupService.findGroup(courseId));

+ 5 - 0
seecoder-portal-server/src/main/java/cn/seecoder/seecoderportalserver/web/rest/MessageController.java

@@ -58,4 +58,9 @@ public class MessageController {
     public OkResponse<String> readMessage(@RequestBody MessageVO messageVO) {
         return OkResponse.of(messageService.readMessage(messageVO.getId(), SecurityUtils.getCurrentUser().getId()));
     }
+
+    @PutMapping("/getInvitations")
+    public OkResponse<List<MessageVO>> findUnreadInvitationsByUser(){
+        return OkResponse.of(messageService.findUnreadInvitationsByUser(SecurityUtils.getCurrentUser().getId()));
+    }
 }