QuestionServiceImpl.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package nju.seec.helper.service.impl;
  2. import nju.seec.helper.api.BokApi;
  3. import nju.seec.helper.aspect.auth.LoginUser;
  4. import nju.seec.helper.dao.QuestionRecordDAO;
  5. import nju.seec.helper.dao.QuizDAO;
  6. import nju.seec.helper.dao.UserDAO;
  7. import nju.seec.helper.dto.question.BaseQuestionDTO;
  8. import nju.seec.helper.entity.QuestionRecord;
  9. import nju.seec.helper.entity.Quiz;
  10. import nju.seec.helper.enums.ExceptionType;
  11. import nju.seec.helper.enums.QuizState;
  12. import nju.seec.helper.enums.UserType;
  13. import nju.seec.helper.exception.HelperException;
  14. import nju.seec.helper.service.QuestionService;
  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 BokApi bokApi;
  38. @Autowired
  39. public QuestionServiceImpl(QuizDAO quizDAO
  40. , UserDAO userDAO
  41. , QuestionRecordDAO questionRecordDAO, BokApi bokApi) {
  42. this.quizDAO = quizDAO;
  43. this.userDAO = userDAO;
  44. this.questionRecordDAO = questionRecordDAO;
  45. this.bokApi = bokApi;
  46. }
  47. @Override
  48. public Page<BaseQuestionVO> getQuestions(LoginUser user, String stem, Pageable pageable) {
  49. return bokApi.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 bokApi.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 bokApi.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(bokApi.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 = bokApi.createQuestion(questionId, baseQuestionDTO);
  83. questionRecordDAO.save(new QuestionRecord()
  84. .setTeacher(userDAO.findUserById(user.getId()))
  85. .setQuestionId(bokQuestion.getId()));
  86. return BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true);
  87. }
  88. @Transactional(readOnly = true)
  89. @Override
  90. public BaseQuestionVO modifyQuestion(LoginUser user, String questionId, BaseQuestionDTO baseQuestionDTO) {
  91. QuestionRecord questionRecord = questionRecordDAO.findByTeacherAndQuestionId(userDAO.findUserById(user.getId()), questionId)
  92. .orElseThrow(() -> HelperException.of(ExceptionType.FORBIDDEN, "您无权修改该问题"));
  93. BokQuestion bokQuestion = bokApi.modifyQuestion(questionId, baseQuestionDTO);
  94. questionRecordDAO.save(questionRecord);
  95. return BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true);
  96. }
  97. @Transactional(rollbackFor = Exception.class)
  98. @Override
  99. public void deleteQuestion(LoginUser user, String questionId) {
  100. QuestionRecord questionRecord = questionRecordDAO.findByTeacherAndQuestionId(userDAO.findUserById(user.getId()), questionId)
  101. .orElseThrow(() -> HelperException.of(ExceptionType.FORBIDDEN, "您无权删除该问题"));
  102. bokApi.deleteQuestion(questionId);
  103. questionRecordDAO.delete(questionRecord);
  104. }
  105. @Transactional(readOnly = true)
  106. @Override
  107. public Page<BaseQuestionVO> getCreatedQuestions(LoginUser user, Pageable pageable) {
  108. Page<String> questionIdPage = questionRecordDAO.findQuestionIdsByTeacher(userDAO.findUserById(user.getId()), pageable);
  109. return new PageImpl<>(
  110. bokApi.bokFindByIdIn(questionIdPage.getContent())
  111. .stream()
  112. .map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true))
  113. .collect(Collectors.toList())
  114. , pageable
  115. , questionIdPage.getTotalElements()
  116. );
  117. }
  118. @Transactional(readOnly = true)
  119. @Override
  120. public Set<String> getIdsOfCreatedQuestions(LoginUser user) {
  121. return questionRecordDAO.findQuestionIdsByTeacher(userDAO.findUserById(user.getId()));
  122. }
  123. }