QuestionServiceImpl.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package nju.seec.helper.service.impl;
  2. import nju.seec.helper.dao.QuestionRecordDAO;
  3. import nju.seec.helper.dao.QuizDAO;
  4. import nju.seec.helper.dao.UserDAO;
  5. import nju.seec.helper.dto.question.BaseQuestionDTO;
  6. import nju.seec.helper.aspect.auth.LoginUser;
  7. import nju.seec.helper.entity.QuestionRecord;
  8. import nju.seec.helper.entity.Quiz;
  9. import nju.seec.helper.service.QuestionService;
  10. import nju.seec.helper.util.BokUtil;
  11. import nju.seec.helper.util.enums.ExceptionType;
  12. import nju.seec.helper.util.enums.QuizState;
  13. import nju.seec.helper.util.enums.UserType;
  14. import nju.seec.helper.util.exception.HelperException;
  15. import nju.seec.helper.vo.question.BaseQuestionVO;
  16. import nju.seec.helper.vo.question.BokQuestion;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.data.domain.Page;
  19. import org.springframework.data.domain.PageImpl;
  20. import org.springframework.data.domain.Pageable;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.transaction.annotation.Transactional;
  23. import java.util.List;
  24. import java.util.Set;
  25. import java.util.UUID;
  26. import java.util.stream.Collectors;
  27. /**
  28. * @author xst
  29. * <p>
  30. * updated by cst
  31. */
  32. @Service
  33. public class QuestionServiceImpl implements QuestionService {
  34. private final QuizDAO quizDAO;
  35. private final UserDAO userDAO;
  36. private final QuestionRecordDAO questionRecordDAO;
  37. private final BokUtil bokUtil;
  38. @Autowired
  39. public QuestionServiceImpl(QuizDAO quizDAO
  40. , UserDAO userDAO
  41. , QuestionRecordDAO questionRecordDAO, BokUtil bokUtil) {
  42. this.quizDAO = quizDAO;
  43. this.userDAO = userDAO;
  44. this.questionRecordDAO = questionRecordDAO;
  45. this.bokUtil = bokUtil;
  46. }
  47. @Override
  48. public Page<BaseQuestionVO> getQuestions(LoginUser user, String stem, Pageable pageable) {
  49. return bokUtil.bokFindByStemLike(stem, pageable).map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true));
  50. }
  51. @Transactional(readOnly = true)
  52. @Override
  53. public List<BaseQuestionVO> getQuestionsByQuiz(LoginUser user, Long quizId) {
  54. Quiz quiz = quizDAO.findQuizById(quizId);
  55. List<String> questionIds = quiz.getQuestions();
  56. return bokUtil.bokFindByIdIn(questionIds)
  57. .stream()
  58. .map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, quiz.getState() == QuizState.CLOSED || user.getType() == UserType.TEACHER))
  59. .collect(Collectors.toList());
  60. }
  61. @Transactional(readOnly = true)
  62. @Override
  63. public List<BaseQuestionVO> getQuestionsByQuiz(Quiz quiz) {
  64. List<String> questionIds = quiz.getQuestions();
  65. return bokUtil.bokFindByIdIn(questionIds)
  66. .stream()
  67. .map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true))
  68. .collect(Collectors.toList());
  69. }
  70. @Override
  71. public BaseQuestionVO getOneQuestion(LoginUser user, String questionId) {
  72. return BaseQuestionVO.convertBokQuestionToVO(bokUtil.bokFindById(questionId), true);
  73. }
  74. @Transactional(rollbackFor = Exception.class)
  75. @Override
  76. public BaseQuestionVO createQuestion(LoginUser user, BaseQuestionDTO baseQuestionDTO) {
  77. String questionId;
  78. do {
  79. // 保证不产生重复QuestionId
  80. questionId = UUID.randomUUID().toString().replaceAll("-", "");
  81. } while (questionRecordDAO.existsByQuestionId(questionId));
  82. BokQuestion bokQuestion = bokUtil.createQuestion(questionId, baseQuestionDTO);
  83. QuestionRecord questionRecord = new QuestionRecord()
  84. .setTeacher(userDAO.findUserById(user.getId()))
  85. .setQuestionId(bokQuestion.getId());
  86. questionRecordDAO.save(questionRecord);
  87. return BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true);
  88. }
  89. @Transactional(readOnly = true)
  90. @Override
  91. public BaseQuestionVO modifyQuestion(LoginUser user, String questionId, BaseQuestionDTO baseQuestionDTO) {
  92. QuestionRecord questionRecord = questionRecordDAO.findByTeacherAndQuestionId(userDAO.findUserById(user.getId()), questionId)
  93. .orElseThrow(() -> HelperException.of(ExceptionType.FORBIDDEN, "您无权修改该问题"));
  94. BokQuestion bokQuestion = bokUtil.modifyQuestion(questionId, baseQuestionDTO);
  95. questionRecordDAO.save(questionRecord);
  96. return BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true);
  97. }
  98. @Transactional(rollbackFor = Exception.class)
  99. @Override
  100. public void deleteQuestion(LoginUser user, String questionId) {
  101. QuestionRecord questionRecord = questionRecordDAO.findByTeacherAndQuestionId(userDAO.findUserById(user.getId()), questionId)
  102. .orElseThrow(() -> HelperException.of(ExceptionType.FORBIDDEN, "您无权删除该问题"));
  103. bokUtil.deleteQuestion(questionId);
  104. questionRecordDAO.delete(questionRecord);
  105. }
  106. @Transactional(readOnly = true)
  107. @Override
  108. public Page<BaseQuestionVO> getCreatedQuestions(LoginUser user, Pageable pageable) {
  109. Page<String> questionIdPage = questionRecordDAO
  110. .findQuestionIdsByTeacher(userDAO.findUserById(user.getId()), pageable);
  111. return new PageImpl<>(
  112. bokUtil.bokFindByIdIn(questionIdPage.getContent())
  113. .stream()
  114. .map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true))
  115. .collect(Collectors.toList())
  116. , pageable
  117. , questionIdPage.getTotalElements()
  118. );
  119. }
  120. @Transactional(readOnly = true)
  121. @Override
  122. public Set<String> getIdsOfCreatedQuestions(LoginUser user) {
  123. return questionRecordDAO.findQuestionIdsByTeacher(userDAO.findUserById(user.getId()));
  124. }
  125. }