CourseFileServiceImpl.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package nju.seec.helper.service.impl;
  2. import cn.hutool.core.util.StrUtil;
  3. import lombok.SneakyThrows;
  4. import nju.seec.helper.aspect.auth.LoginUser;
  5. import nju.seec.helper.dao.CourseDAO;
  6. import nju.seec.helper.dao.CourseFileDAO;
  7. import nju.seec.helper.dto.coursefile.CourseFileDTO;
  8. import nju.seec.helper.entity.Course;
  9. import nju.seec.helper.entity.CourseFile;
  10. import nju.seec.helper.enums.ExceptionType;
  11. import nju.seec.helper.exception.HelperException;
  12. import nju.seec.helper.service.CourseFileService;
  13. import nju.seec.helper.service.CourseService;
  14. import nju.seec.helper.util.OssUtils;
  15. import nju.seec.helper.vo.CourseFileVO;
  16. import org.springframework.data.domain.Page;
  17. import org.springframework.data.domain.Pageable;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import org.springframework.web.multipart.MultipartFile;
  21. import java.io.File;
  22. /**
  23. * @author cst
  24. */
  25. @Service
  26. public class CourseFileServiceImpl implements CourseFileService {
  27. private static final String COURSE_FILE_STORE_DIR = "course_file";
  28. private final CourseDAO courseDAO;
  29. private final CourseFileDAO courseFileDAO;
  30. private final CourseService courseService;
  31. private final OssUtils ossUtils;
  32. public CourseFileServiceImpl(CourseDAO courseDAO, CourseFileDAO courseFileDAO, CourseService courseService, OssUtils ossUtils) {
  33. this.courseDAO = courseDAO;
  34. this.courseFileDAO = courseFileDAO;
  35. this.courseService = courseService;
  36. this.ossUtils = ossUtils;
  37. }
  38. @Transactional(rollbackFor = Exception.class)
  39. @SneakyThrows
  40. @Override
  41. public void uploadCourseFile(LoginUser user, CourseFileDTO courseFileDTO) {
  42. Course course = courseDAO.findCourseById(courseFileDTO.getCourseId());
  43. MultipartFile file = courseFileDTO.getFile();
  44. String fileName = file.getOriginalFilename();
  45. String objectName = getCourseFileObjectName(course.getId(), fileName);
  46. CourseFile courseFile = new CourseFile()
  47. .setCourseId(course.getId())
  48. .setTeacherId(user.getId())
  49. .setFileName(fileName)
  50. .setObjectName(objectName);
  51. if (!existsAddAuth(user, courseFile)) {
  52. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权上传该附件");
  53. }
  54. if (courseFileDAO.existsByCourseIdAndFileName(courseFileDTO.getCourseId(), fileName)) {
  55. throw HelperException.of(ExceptionType.CONFLICT, "该课程已有同名附件");
  56. }
  57. courseFileDAO.save(courseFile);
  58. ossUtils.upload(objectName, file.getInputStream());
  59. }
  60. @Transactional(rollbackFor = Exception.class)
  61. @Override
  62. public void deleteCourseFile(LoginUser user, Long courseFileId) {
  63. CourseFile courseFile = courseFileDAO.findCourseFileById(courseFileId);
  64. if (!existsDelAuth(user, courseFile)) {
  65. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权删除该附件");
  66. }
  67. courseFileDAO.delete(courseFile);
  68. ossUtils.delete(courseFile.getObjectName());
  69. }
  70. @Transactional(readOnly = true)
  71. @Override
  72. public Page<CourseFileVO> getCourseFilesByCourse(LoginUser user, Long courseId, String key, Pageable pageable) {
  73. if (!courseService.existsGetAuth(user, courseDAO.findCourseById(courseId))) {
  74. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该课程的附件");
  75. }
  76. return courseFileDAO.findByCourseIdAndFileNameContains(courseId, key, pageable).map(CourseFileVO::new);
  77. }
  78. @Transactional(readOnly = true)
  79. @Override
  80. public String getCourseFileUrl(LoginUser user, Long courseFileId) {
  81. CourseFile courseFile = courseFileDAO.findCourseFileById(courseFileId);
  82. if (!existsGetAuth(user, courseFile)) {
  83. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权获取该附件的链接");
  84. }
  85. return ossUtils.getUrl(courseFile.getObjectName());
  86. }
  87. private String getCourseFileObjectName(Long courseId, String fileName) {
  88. return StrUtil.join(File.separator, COURSE_FILE_STORE_DIR, courseId, fileName);
  89. }
  90. @Override
  91. public boolean existsAddAuth(LoginUser user, CourseFile courseFile) {
  92. return courseDAO.findCourseById(courseFile.getCourseId()).getTeacher().getId().equals(user.getId());
  93. }
  94. @Override
  95. public boolean existsDelAuth(LoginUser user, CourseFile courseFile) {
  96. return courseFile.getTeacherId().equals(user.getId());
  97. }
  98. @Override
  99. public boolean existsUpdateAuth(LoginUser user, CourseFile courseFile) {
  100. return courseFile.getTeacherId().equals(user.getId());
  101. }
  102. @Override
  103. public boolean existsGetAuth(LoginUser user, CourseFile courseFile) {
  104. return courseService.existsGetAuth(user, courseDAO.findCourseById(courseFile.getCourseId()));
  105. }
  106. }