|
|
@@ -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();
|