CommentServiceImpl.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package nju.seec.helper.service.impl;
  2. import nju.seec.helper.dao.CommentDAO;
  3. import nju.seec.helper.dao.SlideDAO;
  4. import nju.seec.helper.dao.UserDAO;
  5. import nju.seec.helper.dto.CommentDTO;
  6. import nju.seec.helper.dto.LoginUser;
  7. import nju.seec.helper.entity.Comment;
  8. import nju.seec.helper.entity.Slide;
  9. import nju.seec.helper.service.CommentService;
  10. import nju.seec.helper.service.MessageService;
  11. import nju.seec.helper.service.util.AuthUtils;
  12. import nju.seec.helper.util.enums.MessageType;
  13. import nju.seec.helper.vo.CommentVO;
  14. import org.springframework.data.domain.Page;
  15. import org.springframework.data.domain.Pageable;
  16. import org.springframework.data.jpa.domain.Specification;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.transaction.annotation.Transactional;
  19. import java.util.Collections;
  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. @Transactional(rollbackFor = Exception.class)
  37. @Override
  38. public CommentVO createComment(LoginUser user, CommentDTO commentDTO) {
  39. Comment comment = new Comment()
  40. .setSlideId(commentDTO.getSlideId())
  41. .setPageNumber(commentDTO.getPageNumber())
  42. .setUser(userDAO.findUserById(user.getId()))
  43. .setTitle(commentDTO.getTitle())
  44. .setContent(commentDTO.getContent());
  45. comment = commentDAO.save(comment);
  46. // 增加通知
  47. Slide slide = slideDAO.findSlideById(comment.getSlideId());
  48. if (!user.getId().equals(slide.getTeacher().getId())) {
  49. messageService.createMessage(Collections.singleton(slide.getTeacher().getId()), MessageType.COMMENT_NEW, String.format("课程 [%s] 的课件 [%s] 在第%d页有新评论", slide.getCourse().getName(), slide.getName(), comment.getPageNumber()), slide.getId());
  50. }
  51. return new CommentVO(comment);
  52. }
  53. @Transactional(rollbackFor = Exception.class)
  54. @Override
  55. public void removeComment(LoginUser user, Long commentId) {
  56. Comment comment = commentDAO.findCommentById(commentId);
  57. AuthUtils.checkDataAuth(user.getId(), comment.getUser().getId(), "您无权删除该评论");
  58. unTopComment(comment);
  59. commentDAO.deleteById(commentId);
  60. }
  61. @Transactional(rollbackFor = Exception.class)
  62. @Override
  63. public void topComment(LoginUser user, Long commentId) {
  64. Comment comment = commentDAO.findCommentById(commentId);
  65. AuthUtils.checkDataAuth(user.getId(), slideDAO.findSlideById(comment.getSlideId()).getTeacher().getId(), "您无权在该评论区置顶评论");
  66. unTopComment(comment);
  67. comment.setTopNumber((int) countTopComments(comment.getSlideId(), comment.getPageNumber()) + 1);
  68. commentDAO.save(comment);
  69. }
  70. @Transactional(rollbackFor = Exception.class)
  71. @Override
  72. public void unTopComment(LoginUser user, Long commentId) {
  73. Comment comment = commentDAO.findCommentById(commentId);
  74. AuthUtils.checkDataAuth(user.getId(), slideDAO.findSlideById(comment.getSlideId()).getTeacher().getId(), "您无权在该评论区取消置顶评论");
  75. unTopComment(comment);
  76. commentDAO.save(comment);
  77. }
  78. @Transactional(readOnly = true)
  79. @Override
  80. public Page<CommentVO> getCommentsBySlideAndPageNumber(Long slideId, Integer pageNumber, Pageable pageable) {
  81. return findBySlideIdAndPageNumber(slideId, pageNumber, pageable).map(CommentVO::new);
  82. }
  83. @Transactional(readOnly = true)
  84. @Override
  85. public CommentVO getOneComment(Long commentId) {
  86. return new CommentVO(commentDAO.findCommentById(commentId));
  87. }
  88. private void unTopComment(Comment comment) {
  89. Integer topNumber = comment.getTopNumber();
  90. comment.setTopNumber(0);
  91. decTopNumber(comment.getSlideId(), comment.getPageNumber(), topNumber);
  92. }
  93. long countTopComments(Long slideId, Integer pageNumber) {
  94. return commentDAO.count(
  95. (Specification<Comment>) (root, query, cb) -> cb.and(
  96. cb.equal(root.get("slideId"), slideId),
  97. cb.equal(root.get("pageNumber"), pageNumber),
  98. cb.notEqual(root.get("topNumber"), 0)));
  99. }
  100. Page<Comment> findBySlideIdAndPageNumber(Long slideId, Integer pageNumber, Pageable pageable) {
  101. return commentDAO.findAll(
  102. (Specification<Comment>) (root, query, cb) -> cb.and(
  103. cb.equal(root.get("slideId"), slideId),
  104. cb.equal(root.get("pageNumber"), pageNumber)),
  105. pageable);
  106. }
  107. void decTopNumber(Long slideId, Integer pageNumber, Integer topNumber) {
  108. commentDAO.saveAll(
  109. commentDAO
  110. .findAll((Specification<Comment>) (root, query, cb) -> cb.and(
  111. cb.equal(root.get("slideId"), slideId),
  112. cb.equal(root.get("pageNumber"), pageNumber),
  113. cb.gt(root.get("topNumber"), topNumber)))
  114. .parallelStream()
  115. .peek(comment -> comment.setTopNumber(comment.getTopNumber() - 1))
  116. .collect(Collectors.toSet()));
  117. }
  118. }