CommentServiceImpl.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package nju.seec.helper.service.impl;
  2. import nju.seec.helper.aspect.auth.LoginUser;
  3. import nju.seec.helper.aspect.message.Message;
  4. import nju.seec.helper.dao.CommentDAO;
  5. import nju.seec.helper.dao.SlideDAO;
  6. import nju.seec.helper.dao.UserDAO;
  7. import nju.seec.helper.dto.comment.CommentDTO;
  8. import nju.seec.helper.entity.Comment;
  9. import nju.seec.helper.entity.Slide;
  10. import nju.seec.helper.enums.ExceptionType;
  11. import nju.seec.helper.enums.MessageType;
  12. import nju.seec.helper.exception.HelperException;
  13. import nju.seec.helper.service.CommentService;
  14. import nju.seec.helper.service.MessageService;
  15. import nju.seec.helper.vo.CommentVO;
  16. import org.springframework.data.domain.Page;
  17. import org.springframework.data.domain.Pageable;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import java.util.stream.Collectors;
  21. /**
  22. * @author cst
  23. */
  24. @Service
  25. public class CommentServiceImpl implements CommentService {
  26. private final CommentDAO commentDAO;
  27. private final SlideDAO slideDAO;
  28. private final UserDAO userDAO;
  29. private final MessageService messageService;
  30. public CommentServiceImpl(CommentDAO commentDAO, SlideDAO slideDAO, UserDAO userDAO, MessageService messageService) {
  31. this.commentDAO = commentDAO;
  32. this.slideDAO = slideDAO;
  33. this.userDAO = userDAO;
  34. this.messageService = messageService;
  35. }
  36. @Message(MessageType.COMMENT_NEW)
  37. @Transactional(rollbackFor = Exception.class)
  38. @Override
  39. public CommentVO createComment(LoginUser user, CommentDTO commentDTO) {
  40. Slide slide = slideDAO.findSlideById(commentDTO.getSlideId());
  41. Comment comment = commentDAO.save(
  42. new Comment()
  43. .setSlideId(slide.getId())
  44. .setPageNumber(commentDTO.getPageNumber())
  45. .setUser(userDAO.findUserById(user.getId()))
  46. .setTitle(commentDTO.getTitle())
  47. .setContent(commentDTO.getContent())
  48. .setShow(commentDTO.getShow())
  49. );
  50. return new CommentVO(comment);
  51. }
  52. @Transactional(rollbackFor = Exception.class)
  53. @Override
  54. public void deleteComment(LoginUser user, Long commentId) {
  55. Comment comment = commentDAO.findCommentById(commentId);
  56. if (!existsDelAuth(user, comment)) {
  57. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权删除该评论");
  58. }
  59. unTopComment(comment);
  60. commentDAO.delete(comment);
  61. }
  62. @Transactional(rollbackFor = Exception.class)
  63. @Override
  64. public void topComment(LoginUser user, Long commentId) {
  65. Comment comment = commentDAO.findCommentById(commentId);
  66. if (!comment.getShow()) {
  67. throw HelperException.of(ExceptionType.FORBIDDEN, "私密评论,无法置顶");
  68. }
  69. if (!existsUpdateAuth(user, comment)) {
  70. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权在该评论区置顶评论");
  71. }
  72. unTopComment(comment);
  73. comment.setTopNumber((int) countTopComments(comment.getSlideId(), comment.getPageNumber()) + 1);
  74. commentDAO.save(comment);
  75. }
  76. private long countTopComments(Long slideId, Integer pageNumber) {
  77. return commentDAO.countBySlideIdAndPageNumberAndTopNumberNot(slideId, pageNumber, 0);
  78. }
  79. @Transactional(rollbackFor = Exception.class)
  80. @Override
  81. public void unTopComment(LoginUser user, Long commentId) {
  82. Comment comment = commentDAO.findCommentById(commentId);
  83. if (!existsUpdateAuth(user, comment)) {
  84. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权在该评论区取消置顶评论");
  85. }
  86. unTopComment(comment);
  87. commentDAO.save(comment);
  88. }
  89. @Transactional(readOnly = true)
  90. @Override
  91. public Page<CommentVO> getCommentsBySlideAndPageNumber(Long slideId, Integer pageNumber, Pageable pageable) {
  92. return commentDAO.findBySlideIdAndPageNumberAndShow(slideId, pageNumber, true, pageable).map(CommentVO::new);
  93. }
  94. @Transactional(readOnly = true)
  95. @Override
  96. public CommentVO getOneComment(LoginUser user, Long commentId) {
  97. Comment comment = commentDAO.findCommentById(commentId);
  98. if (!existsGetAuth(user, comment)) {
  99. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权获取该评论");
  100. }
  101. return new CommentVO(comment);
  102. }
  103. @Transactional(readOnly = true)
  104. @Override
  105. public Page<CommentVO> getSelfCommentsBySlideAndPageNumber(LoginUser user, Long slideId, Integer pageNumber, Boolean show, Pageable pageable) {
  106. return commentDAO.findBySlideIdAndPageNumberAndUserAndShow(slideId, pageNumber, userDAO.findUserById(user.getId()), show, pageable).map(CommentVO::new);
  107. }
  108. @Transactional(rollbackFor = Exception.class)
  109. @Override
  110. public void modifyCommentShow(LoginUser user, Long commentId, Boolean show) {
  111. Comment comment = commentDAO.findCommentById(commentId);
  112. if (comment.getShow().equals(show)) {
  113. return;
  114. }
  115. if (!existsUpdateAuth(user, comment)) {
  116. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权修改该评论的展示状态");
  117. }
  118. unTopComment(comment);
  119. commentDAO.save(comment.setShow(show));
  120. }
  121. @Transactional(readOnly = true)
  122. @Override
  123. public Page<CommentVO> getSelfComments(LoginUser user, String key, Pageable pageable) {
  124. return commentDAO.findByUserIdAndKey(user.getId(), key, pageable).map(CommentVO::new);
  125. }
  126. private void unTopComment(Comment comment) {
  127. Integer topNumber = comment.getTopNumber();
  128. comment.setTopNumber(0);
  129. if (topNumber != 0) {
  130. commentDAO.saveAll(
  131. commentDAO.findBySlideIdAndPageNumberAndTopNumberGreaterThan(comment.getSlideId(), comment.getPageNumber(), topNumber)
  132. .parallelStream()
  133. .peek(topComment -> topComment.setTopNumber(topComment.getTopNumber() - 1))
  134. .collect(Collectors.toList())
  135. );
  136. }
  137. }
  138. @Override
  139. public boolean existsAddAuth(LoginUser user, Comment comment) {
  140. return true;
  141. }
  142. @Override
  143. public boolean existsDelAuth(LoginUser user, Comment comment) {
  144. return comment.getUser().getId().equals(user.getId());
  145. }
  146. @Override
  147. public boolean existsUpdateAuth(LoginUser user, Comment comment) {
  148. return comment.getUser().getId().equals(user.getId())
  149. || slideDAO.findSlideById(comment.getSlideId()).getTeacher().getId().equals(user.getId());
  150. }
  151. @Override
  152. public boolean existsGetAuth(LoginUser user, Comment comment) {
  153. return comment.getShow()
  154. || comment.getUser().getId().equals(user.getId());
  155. }
  156. }