package nju.seec.helper.service.impl; import cn.hutool.core.util.StrUtil; import lombok.SneakyThrows; import nju.seec.helper.aspect.auth.LoginUser; import nju.seec.helper.dao.CourseDAO; import nju.seec.helper.dao.CourseFileDAO; import nju.seec.helper.dto.coursefile.CourseFileDTO; import nju.seec.helper.entity.Course; import nju.seec.helper.entity.CourseFile; import nju.seec.helper.enums.ExceptionType; import nju.seec.helper.exception.HelperException; import nju.seec.helper.service.CourseFileService; import nju.seec.helper.service.CourseService; import nju.seec.helper.util.OssUtils; import nju.seec.helper.vo.CourseFileVO; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.File; /** * @author cst */ @Service public class CourseFileServiceImpl implements CourseFileService { private static final String COURSE_FILE_STORE_DIR = "course_file"; private final CourseDAO courseDAO; private final CourseFileDAO courseFileDAO; private final CourseService courseService; private final OssUtils ossUtils; public CourseFileServiceImpl(CourseDAO courseDAO, CourseFileDAO courseFileDAO, CourseService courseService, OssUtils ossUtils) { this.courseDAO = courseDAO; this.courseFileDAO = courseFileDAO; this.courseService = courseService; this.ossUtils = ossUtils; } @Transactional(rollbackFor = Exception.class) @SneakyThrows @Override public void uploadCourseFile(LoginUser user, CourseFileDTO courseFileDTO) { Course course = courseDAO.findCourseById(courseFileDTO.getCourseId()); MultipartFile file = courseFileDTO.getFile(); String fileName = file.getOriginalFilename(); String objectName = getCourseFileObjectName(course.getId(), fileName); CourseFile courseFile = new CourseFile() .setCourseId(course.getId()) .setTeacherId(user.getId()) .setFileName(fileName) .setObjectName(objectName); if (!existsAddAuth(user, courseFile)) { throw HelperException.of(ExceptionType.FORBIDDEN, "您无权上传该附件"); } if (courseFileDAO.existsByCourseIdAndFileName(courseFileDTO.getCourseId(), fileName)) { throw HelperException.of(ExceptionType.CONFLICT, "该课程已有同名附件"); } courseFileDAO.save(courseFile); ossUtils.upload(objectName, file.getInputStream()); } @Transactional(rollbackFor = Exception.class) @Override public void deleteCourseFile(LoginUser user, Long courseFileId) { CourseFile courseFile = courseFileDAO.findCourseFileById(courseFileId); if (!existsDelAuth(user, courseFile)) { throw HelperException.of(ExceptionType.FORBIDDEN, "您无权删除该附件"); } courseFileDAO.delete(courseFile); ossUtils.delete(courseFile.getObjectName()); } @Transactional(readOnly = true) @Override public Page getCourseFilesByCourse(LoginUser user, Long courseId, String key, Pageable pageable) { if (!courseService.existsGetAuth(user, courseDAO.findCourseById(courseId))) { throw HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该课程的附件"); } return courseFileDAO.findByCourseIdAndFileNameContains(courseId, key, pageable).map(CourseFileVO::new); } @Transactional(readOnly = true) @Override public String getCourseFileUrl(LoginUser user, Long courseFileId) { CourseFile courseFile = courseFileDAO.findCourseFileById(courseFileId); if (!existsGetAuth(user, courseFile)) { throw HelperException.of(ExceptionType.FORBIDDEN, "您无权获取该附件的链接"); } return ossUtils.getUrl(courseFile.getObjectName()); } private String getCourseFileObjectName(Long courseId, String fileName) { return StrUtil.join(File.separator, COURSE_FILE_STORE_DIR, courseId, fileName); } @Override public boolean existsAddAuth(LoginUser user, CourseFile courseFile) { return courseDAO.findCourseById(courseFile.getCourseId()).getTeacher().getId().equals(user.getId()); } @Override public boolean existsDelAuth(LoginUser user, CourseFile courseFile) { return courseFile.getTeacherId().equals(user.getId()); } @Override public boolean existsUpdateAuth(LoginUser user, CourseFile courseFile) { return courseFile.getTeacherId().equals(user.getId()); } @Override public boolean existsGetAuth(LoginUser user, CourseFile courseFile) { return courseService.existsGetAuth(user, courseDAO.findCourseById(courseFile.getCourseId())); } }