SlideServiceImpl.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package nju.seec.helper.service.impl;
  2. import com.google.common.collect.ImmutableSet;
  3. import com.google.common.io.Files;
  4. import lombok.SneakyThrows;
  5. import nju.seec.helper.aspect.auth.LoginUser;
  6. import nju.seec.helper.dao.ChooseDAO;
  7. import nju.seec.helper.dao.CourseDAO;
  8. import nju.seec.helper.dao.SlideDAO;
  9. import nju.seec.helper.dao.UserDAO;
  10. import nju.seec.helper.dto.slide.SlideDTO;
  11. import nju.seec.helper.dto.slide.SlideFileDTO;
  12. import nju.seec.helper.dto.slide.SlideStateDTO;
  13. import nju.seec.helper.entity.Course;
  14. import nju.seec.helper.entity.Slide;
  15. import nju.seec.helper.enums.ExceptionType;
  16. import nju.seec.helper.enums.MessageType;
  17. import nju.seec.helper.enums.SlideState;
  18. import nju.seec.helper.exception.HelperException;
  19. import nju.seec.helper.service.CourseService;
  20. import nju.seec.helper.service.MessageService;
  21. import nju.seec.helper.service.QuizService;
  22. import nju.seec.helper.service.SlideService;
  23. import nju.seec.helper.service.util.OssObjectUrlUtils;
  24. import nju.seec.helper.util.OssUtils;
  25. import nju.seec.helper.util.file.FileInfo;
  26. import nju.seec.helper.util.file.FileUtils;
  27. import nju.seec.helper.vo.SlideVO;
  28. import org.springframework.dao.DataIntegrityViolationException;
  29. import org.springframework.data.domain.Page;
  30. import org.springframework.data.domain.Pageable;
  31. import org.springframework.stereotype.Service;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import org.springframework.web.multipart.MultipartFile;
  34. import java.io.File;
  35. import java.util.Set;
  36. /**
  37. * @author cst
  38. */
  39. @Service
  40. public class SlideServiceImpl implements SlideService {
  41. private static final String SLIDE_STORE_DIR = "slide";
  42. private final CourseDAO courseDAO;
  43. private final SlideDAO slideDAO;
  44. private final ChooseDAO chooseDAO;
  45. private final UserDAO userDAO;
  46. private final OssUtils ossUtils;
  47. private final OssObjectUrlUtils ossObjectUrlUtils;
  48. private final QuizService quizService;
  49. private final MessageService messageService;
  50. private final CourseService courseService;
  51. public SlideServiceImpl(CourseDAO courseDAO, SlideDAO slideDAO, ChooseDAO chooseDAO, UserDAO userDAO, OssUtils ossUtils, OssObjectUrlUtils ossObjectUrlUtils, QuizService quizService, MessageService messageService, CourseService courseService) {
  52. this.courseDAO = courseDAO;
  53. this.slideDAO = slideDAO;
  54. this.chooseDAO = chooseDAO;
  55. this.userDAO = userDAO;
  56. this.ossUtils = ossUtils;
  57. this.ossObjectUrlUtils = ossObjectUrlUtils;
  58. this.quizService = quizService;
  59. this.messageService = messageService;
  60. this.courseService = courseService;
  61. }
  62. @Transactional(rollbackFor = Exception.class)
  63. @SneakyThrows
  64. @Override
  65. public SlideVO createSlide(LoginUser teacher, SlideDTO slideDTO) {
  66. Course course = courseDAO.findCourseById(slideDTO.getCourseId());
  67. Slide slide = new Slide()
  68. .setCourse(course)
  69. .setTeacher(userDAO.findUserById(teacher.getId()))
  70. .setName(slideDTO.getName())
  71. .setState(slideDTO.getState());
  72. if (!existsAddAuth(teacher, slide)) {
  73. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权创建该课件");
  74. }
  75. try {
  76. MultipartFile file = slideDTO.getFile();
  77. FileInfo fileInfo = getFileInfo(file);
  78. slide.setPages(fileInfo.getPages());
  79. slide.setObjectName("temp");
  80. slide = slideDAO.save(slide);
  81. String objectName = getObjectName(slide.getId(), slide.getName(), fileInfo.getExtension());
  82. slide.setObjectName(objectName);
  83. slide = slideDAO.save(slide);
  84. ossUtils.upload(objectName, file.getInputStream());
  85. return new SlideVO(slide);
  86. } catch (DataIntegrityViolationException e) {
  87. throw HelperException.of(ExceptionType.CONFLICT, "创建失败,请检查课件信息是否正确且不与已有课件冲突");
  88. }
  89. }
  90. @Transactional(rollbackFor = Exception.class)
  91. @Override
  92. public SlideVO modifySlide(LoginUser user, Long slideId, SlideDTO slideDTO) {
  93. Slide slide = slideDAO.findSlideById(slideId);
  94. if (!existsUpdateAuth(user, slide)) {
  95. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权修改该课件");
  96. }
  97. try {
  98. slide.setName(slideDTO.getName());
  99. String oldObjectName = slide.getObjectName();
  100. String newObjectName = getObjectName(slide.getId(), slide.getName(), Files.getFileExtension(oldObjectName));
  101. slide.setObjectName(newObjectName);
  102. slide = slideDAO.save(slide);
  103. if (!oldObjectName.equals(newObjectName)) {
  104. ossUtils.copy(oldObjectName, newObjectName);
  105. ossUtils.delete(oldObjectName);
  106. }
  107. return new SlideVO(slide);
  108. } catch (DataIntegrityViolationException e) {
  109. throw HelperException.of(ExceptionType.CONFLICT, "修改失败,请检查课件信息是否正确且不与已有课件冲突");
  110. }
  111. }
  112. @Transactional(rollbackFor = Exception.class)
  113. @Override
  114. public void modifySlideState(LoginUser user, Long slideId, SlideStateDTO slideStateDTO) {
  115. Slide slide = slideDAO.findSlideById(slideId);
  116. if (!existsUpdateAuth(user, slide)) {
  117. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权修改该课件状态");
  118. }
  119. slide.setState(slideStateDTO.getState());
  120. slide = slideDAO.save(slide);
  121. // 增加通知
  122. if (slide.getState() == SlideState.IN_CLASS) {
  123. Set<Long> studentIds = chooseDAO.findStudentIdsByCourseId(slide.getCourse().getId());
  124. messageService.createMessage(studentIds, MessageType.SLIDE_IN_CLASS, String.format("[%s] - [%s] 已开课", slide.getCourse().getName(), slide.getName()), slide.getId());
  125. }
  126. // 修改Slide状态同时推进quiz状态
  127. quizService.modifyQuizState(slide);
  128. }
  129. @Transactional(rollbackFor = Exception.class)
  130. @SneakyThrows
  131. @Override
  132. public void modifySlideFile(LoginUser user, Long slideId, SlideFileDTO slideFileDTO) {
  133. Slide slide = slideDAO.findSlideById(slideId);
  134. if (!existsUpdateAuth(user, slide)) {
  135. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权修改该课件文件");
  136. }
  137. MultipartFile file = slideFileDTO.getFile();
  138. FileInfo fileInfo = getFileInfo(file);
  139. slide.setPages(fileInfo.getPages());
  140. String oldObjectName = slide.getObjectName();
  141. String newObjectName = getObjectName(slide.getId(), slide.getName(), fileInfo.getExtension());
  142. slide.setObjectName(newObjectName);
  143. slideDAO.save(slide);
  144. ossUtils.upload(newObjectName, file.getInputStream());
  145. if (!oldObjectName.equals(newObjectName)) {
  146. ossUtils.delete(oldObjectName);
  147. }
  148. }
  149. @Transactional(rollbackFor = Exception.class)
  150. @Override
  151. public void deleteSlide(LoginUser user, Long slideId) {
  152. Slide slide = slideDAO.findSlideById(slideId);
  153. if (!existsDelAuth(user, slide)) {
  154. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权删除该课件");
  155. }
  156. slide.setDeleteAt(System.currentTimeMillis());
  157. slideDAO.save(slide);
  158. }
  159. @SneakyThrows
  160. private FileInfo getFileInfo(MultipartFile file) {
  161. return FileUtils.getFileInfo(file);
  162. }
  163. private String getObjectName(Long slideId, String slideName, String extension) {
  164. return SLIDE_STORE_DIR + File.separator + slideId + File.separator + slideName + "." + extension;
  165. }
  166. @Transactional(readOnly = true)
  167. @Override
  168. public Page<SlideVO> teacherGetSlides(LoginUser teacher, String key, Pageable pageable) {
  169. return slideDAO.findByTeacherAndNameContains(userDAO.findUserById(teacher.getId()), key, pageable).map(SlideVO::new);
  170. }
  171. private static final Set<SlideState> STATES_NOT_GET_BY_STUDENT_SET = ImmutableSet.of(SlideState.DRAFT);
  172. @Transactional(readOnly = true)
  173. @Override
  174. public Page<SlideVO> getSlidesByCourse(LoginUser user, Long courseId, String key, Pageable pageable) {
  175. Course course = courseDAO.findCourseById(courseId);
  176. if (!courseService.existsGetAuth(user, course)) {
  177. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该课程的课件");
  178. }
  179. switch (user.getType()) {
  180. case TEACHER:
  181. return slideDAO.findByCourseAndNameContains(course, key, pageable).map(SlideVO::new);
  182. case STUDENT:
  183. return slideDAO.findByCourseAndStateNotInAndNameContains(course, STATES_NOT_GET_BY_STUDENT_SET, key, pageable).map(SlideVO::new);
  184. default:
  185. return Page.empty();
  186. }
  187. }
  188. @Transactional(readOnly = true)
  189. @Override
  190. public String getSlideUrl(LoginUser user, Long slideId) {
  191. Slide slide = slideDAO.findSlideById(slideId);
  192. if (!existsGetAuth(user, slide)) {
  193. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权获取该课件的链接");
  194. }
  195. return ossObjectUrlUtils.getUrl(slide.getObjectName());
  196. }
  197. @Transactional(readOnly = true)
  198. @Override
  199. public SlideVO getOneSlide(LoginUser user, Long slideId) {
  200. Slide slide = slideDAO.findSlideById(slideId);
  201. if (!existsGetAuth(user, slide)) {
  202. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该课件");
  203. }
  204. return new SlideVO(slide);
  205. }
  206. @Override
  207. public boolean existsAddAuth(LoginUser user, Slide slide) {
  208. return slide.getCourse().getTeacher().getId().equals(user.getId());
  209. }
  210. @Override
  211. public boolean existsDelAuth(LoginUser user, Slide slide) {
  212. return slide.getTeacher().getId().equals(user.getId());
  213. }
  214. @Override
  215. public boolean existsUpdateAuth(LoginUser user, Slide slide) {
  216. return slide.getTeacher().getId().equals(user.getId());
  217. }
  218. @Override
  219. public boolean existsGetAuth(LoginUser user, Slide slide) {
  220. return courseService.existsGetAuth(user, courseDAO.findCourseById(slide.getCourse().getId()));
  221. }
  222. }