Procházet zdrojové kódy

feat: 增加私密评论功能

ChenSiTong před 6 roky
rodič
revize
f3fef31fd7

+ 1 - 1
pom.xml

@@ -10,7 +10,7 @@
     </parent>
     <groupId>cn.seecoder</groupId>
     <artifactId>helper-backend</artifactId>
-    <version>4.0.0</version>
+    <version>4.0.2</version>
     <packaging>jar</packaging>
     <name>helper</name>
     <description>backend</description>

+ 24 - 0
src/main/java/nju/seec/helper/controller/CommentController.java

@@ -13,11 +13,14 @@ import org.springframework.data.web.PageableDefault;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * 评论
  *
  * @author cst
  */
+@Validated
 @RestController
 @RequestMapping("/api/comment")
 public class CommentController {
@@ -88,4 +91,25 @@ public class CommentController {
     public CommentVO getOneComment(LoginUser user, @PathVariable Long commentId) {
         return commentService.getOneComment(user, commentId);
     }
+
+    /**
+     * 取得自己某一页的评论
+     */
+    @Auth(roles = {UserType.TEACHER, UserType.STUDENT}, message = "获取自己的评论")
+    @GetMapping("/slide/{slideId}/self")
+    public PageResponse<CommentVO> getSelfComments(LoginUser user,
+                                                   @PathVariable Long slideId,
+                                                   @RequestParam(required = false, defaultValue = "1") Integer pageNumber,
+                                                   @RequestParam(required = false, defaultValue = "true") Boolean show,
+                                                   @PageableDefault(Integer.MAX_VALUE) Pageable pageable) {
+        return PageResponse.of(commentService.getSelfCommentsBySlideAndPageNumber(user, slideId, pageNumber, show, pageable));
+    }
+
+    @Auth(roles = {UserType.TEACHER, UserType.STUDENT}, message = "修改评论展示状态")
+    @PutMapping("/{commentId}/show")
+    public void modifyCommentShow(LoginUser user,
+                                  @PathVariable Long commentId,
+                                  @NotNull(message = "缺少展示状态") Boolean show) {
+        commentService.modifyCommentShow(user, commentId, show);
+    }
 }

+ 22 - 1
src/main/java/nju/seec/helper/dao/CommentDAO.java

@@ -1,6 +1,7 @@
 package nju.seec.helper.dao;
 
 import nju.seec.helper.entity.Comment;
+import nju.seec.helper.entity.User;
 import nju.seec.helper.enums.ExceptionType;
 import nju.seec.helper.exception.HelperException;
 import org.springframework.data.domain.Page;
@@ -37,10 +38,18 @@ public interface CommentDAO extends JpaRepository<Comment, Long>, JpaSpecificati
      */
     long countBySlideIdAndPageNumberAndTopNumberNot(Long slideId, Integer pageNumber, Integer topNumber);
 
+    /**
+     * 根据课件ID、页码、置顶指数检索
+     *
+     * @param slideId
+     * @param pageNumber
+     * @param topNumber
+     * @return
+     */
     List<Comment> findBySlideIdAndPageNumberAndTopNumberGreaterThan(Long slideId, Integer pageNumber, Integer topNumber);
 
     /**
-     * 根据课件ID、页码、是否展示获取
+     * 根据课件ID、页码、是否展示检索
      *
      * @param slideId
      * @param pageNumber
@@ -49,4 +58,16 @@ public interface CommentDAO extends JpaRepository<Comment, Long>, JpaSpecificati
      * @return
      */
     Page<Comment> findBySlideIdAndPageNumberAndShow(Long slideId, Integer pageNumber, Boolean show, Pageable pageable);
+
+    /**
+     * 根据课件ID、页码、用户ID、是否展示检索
+     *
+     * @param slideId
+     * @param pageNumber
+     * @param user
+     * @param show
+     * @param pageable
+     * @return
+     */
+    Page<Comment> findBySlideIdAndPageNumberAndUserAndShow(Long slideId, Integer pageNumber, User user, Boolean show, Pageable pageable);
 }

+ 21 - 0
src/main/java/nju/seec/helper/service/CommentService.java

@@ -62,4 +62,25 @@ public interface CommentService extends AuthService<Comment> {
      * @return
      */
     CommentVO getOneComment(LoginUser user, Long commentId);
+
+    /**
+     * 取得自己的评论
+     *
+     * @param user
+     * @param slideId
+     * @param pageNumber
+     * @param show
+     * @param pageable
+     * @return
+     */
+    Page<CommentVO> getSelfCommentsBySlideAndPageNumber(LoginUser user, Long slideId, Integer pageNumber, Boolean show, Pageable pageable);
+
+    /**
+     * 修改评论展示状态
+     *
+     * @param user
+     * @param commentId
+     * @param show
+     */
+    void modifyCommentShow(LoginUser user, Long commentId, Boolean show);
 }

+ 0 - 8
src/main/java/nju/seec/helper/service/MessageService.java

@@ -31,14 +31,6 @@ public interface MessageService {
      */
     void deleteMessages(LoginUser user, MessageDTO messageDTO);
 
-    /**
-     * 删除关联消息
-     *
-     * @param refId
-     * @param messageType
-     */
-    void deleteMessages(Long refId, MessageType messageType);
-
     /**
      * 设置消息已阅
      *

+ 31 - 3
src/main/java/nju/seec/helper/service/impl/CommentServiceImpl.java

@@ -79,6 +79,10 @@ public class CommentServiceImpl implements CommentService {
     public void topComment(LoginUser user, Long commentId) {
         Comment comment = commentDAO.findCommentById(commentId);
 
+        if (!comment.getShow()) {
+            throw HelperException.of(ExceptionType.FORBIDDEN, "私密评论,无法置顶");
+        }
+
         if (!existsUpdateAuth(user, comment)) {
             throw HelperException.of(ExceptionType.FORBIDDEN, "您无权在该评论区置顶评论");
         }
@@ -117,12 +121,35 @@ public class CommentServiceImpl implements CommentService {
         Comment comment = commentDAO.findCommentById(commentId);
 
         if (!existsGetAuth(user, comment)) {
-            throw HelperException.of(ExceptionType.FORBIDDEN, "您无权参考该评论");
+            throw HelperException.of(ExceptionType.FORBIDDEN, "您无权获取该评论");
         }
 
         return new CommentVO(comment);
     }
 
+    @Transactional(readOnly = true)
+    @Override
+    public Page<CommentVO> getSelfCommentsBySlideAndPageNumber(LoginUser user, Long slideId, Integer pageNumber, Boolean show, Pageable pageable) {
+        return commentDAO.findBySlideIdAndPageNumberAndUserAndShow(slideId, pageNumber, userDAO.findUserById(user.getId()), show, pageable).map(CommentVO::new);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void modifyCommentShow(LoginUser user, Long commentId, Boolean show) {
+        Comment comment = commentDAO.findCommentById(commentId);
+
+        if (comment.getShow().equals(show)) {
+            return;
+        }
+
+        if (!existsUpdateAuth(user, comment)) {
+            throw HelperException.of(ExceptionType.FORBIDDEN, "您无权修改该评论的展示状态");
+        }
+
+        unTopComment(comment);
+        commentDAO.save(comment.setShow(show));
+    }
+
     private void unTopComment(Comment comment) {
         Integer topNumber = comment.getTopNumber();
         comment.setTopNumber(0);
@@ -130,7 +157,7 @@ public class CommentServiceImpl implements CommentService {
             commentDAO.saveAll(
                     commentDAO.findBySlideIdAndPageNumberAndTopNumberGreaterThan(comment.getSlideId(), comment.getPageNumber(), topNumber)
                             .parallelStream()
-                            .peek(topComment -> topComment.setTopNumber(comment.getTopNumber() - 1))
+                            .peek(topComment -> topComment.setTopNumber(topComment.getTopNumber() - 1))
                             .collect(Collectors.toList())
             );
         }
@@ -148,7 +175,8 @@ public class CommentServiceImpl implements CommentService {
 
     @Override
     public boolean existsUpdateAuth(LoginUser user, Comment comment) {
-        return slideDAO.findSlideById(comment.getSlideId()).getTeacher().getId().equals(user.getId());
+        return comment.getUser().getId().equals(user.getId())
+                || slideDAO.findSlideById(comment.getSlideId()).getTeacher().getId().equals(user.getId());
     }
 
     @Override

+ 0 - 2
src/main/java/nju/seec/helper/service/impl/CourseFileServiceImpl.java

@@ -102,8 +102,6 @@ public class CourseFileServiceImpl implements CourseFileService {
     public String getCourseFileUrl(LoginUser user, Long courseFileId) {
         CourseFile courseFile = courseFileDAO.findCourseFileById(courseFileId);
 
-        System.currentTimeMillis();
-
         if (!existsGetAuth(user, courseFile)) {
             throw HelperException.of(ExceptionType.FORBIDDEN, "您无权获取该附件的链接");
         }

+ 0 - 6
src/main/java/nju/seec/helper/service/impl/MessageServiceImpl.java

@@ -45,12 +45,6 @@ public class MessageServiceImpl implements MessageService {
         messageDAO.deleteByToUserIdAndIdIn(user.getId(), messageDTO.getIds());
     }
 
-    @Async
-    @Override
-    public void deleteMessages(Long refId, MessageType messageType) {
-        messageDAO.deleteByRefIdAndType(refId, messageType);
-    }
-
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void readMessages(LoginUser user, MessageDTO messageDTO) {

+ 0 - 1
src/main/java/nju/seec/helper/service/impl/NoticeServiceImpl.java

@@ -89,7 +89,6 @@ public class NoticeServiceImpl implements NoticeService {
             throw HelperException.of(ExceptionType.FORBIDDEN, "您无权删除该公告");
         }
         noticeDAO.delete(notice);
-        messageService.deleteMessages(noticeId, MessageType.NOTICE_NEW);
     }
 
     @Transactional(readOnly = true)

+ 0 - 1
src/main/java/nju/seec/helper/service/impl/QuizServiceImpl.java

@@ -143,7 +143,6 @@ public class QuizServiceImpl implements QuizService {
         }
         quiz.setDeleteAt(System.currentTimeMillis());
         quizDAO.save(quiz);
-        messageService.deleteMessages(quizId, MessageType.QUIZ_NEW);
     }
 
     private static final Set<QuizState> STATES_NOT_GET_BY_STUDENT_SET = ImmutableSet.of(QuizState.NOT_STARTED);

+ 1 - 2
src/main/java/nju/seec/helper/service/impl/ReplyServiceImpl.java

@@ -12,7 +12,6 @@ import nju.seec.helper.entity.Reply;
 import nju.seec.helper.entity.Slide;
 import nju.seec.helper.enums.ExceptionType;
 import nju.seec.helper.enums.MessageType;
-import nju.seec.helper.enums.UserType;
 import nju.seec.helper.exception.HelperException;
 import nju.seec.helper.service.MessageService;
 import nju.seec.helper.service.ReplyService;
@@ -87,7 +86,7 @@ public class ReplyServiceImpl implements ReplyService {
 
     @Override
     public boolean existsAddAuth(LoginUser user, Reply reply) {
-        return user.getType() == UserType.TEACHER;
+        return slideDAO.findSlideById(reply.getComment().getSlideId()).getTeacher().getId().equals(user.getId());
     }
 
     @Override

+ 0 - 1
src/main/java/nju/seec/helper/service/impl/SlideServiceImpl.java

@@ -188,7 +188,6 @@ public class SlideServiceImpl implements SlideService {
 
         slide.setDeleteAt(System.currentTimeMillis());
         slideDAO.save(slide);
-        messageService.deleteMessages(slideId, MessageType.SLIDE_IN_CLASS);
     }
 
     @SneakyThrows