|
|
@@ -13,6 +13,7 @@ import nju.seec.helper.dto.slide.SlideStateDTO;
|
|
|
import nju.seec.helper.dto.user.LoginUser;
|
|
|
import nju.seec.helper.entity.Course;
|
|
|
import nju.seec.helper.entity.Slide;
|
|
|
+import nju.seec.helper.service.CourseService;
|
|
|
import nju.seec.helper.service.MessageService;
|
|
|
import nju.seec.helper.service.QuizService;
|
|
|
import nju.seec.helper.service.SlideService;
|
|
|
@@ -57,8 +58,9 @@ public class SlideServiceImpl implements SlideService {
|
|
|
private final RedisCacheUtils cacheUtils;
|
|
|
|
|
|
private final MessageService messageService;
|
|
|
+ private final CourseService courseService;
|
|
|
|
|
|
- public SlideServiceImpl(CourseDAO courseDAO, SlideDAO slideDAO, ChooseDAO chooseDAO, UserDAO userDAO, FileUtils fileUtils, RedisCacheUtils cacheUtils, MessageService messageService, QuizService quizService) {
|
|
|
+ public SlideServiceImpl(CourseDAO courseDAO, SlideDAO slideDAO, ChooseDAO chooseDAO, UserDAO userDAO, FileUtils fileUtils, RedisCacheUtils cacheUtils, MessageService messageService, QuizService quizService, CourseService courseService) {
|
|
|
this.courseDAO = courseDAO;
|
|
|
this.slideDAO = slideDAO;
|
|
|
this.chooseDAO = chooseDAO;
|
|
|
@@ -67,6 +69,7 @@ public class SlideServiceImpl implements SlideService {
|
|
|
this.cacheUtils = cacheUtils;
|
|
|
this.messageService = messageService;
|
|
|
this.quizService = quizService;
|
|
|
+ this.courseService = courseService;
|
|
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@@ -215,27 +218,37 @@ public class SlideServiceImpl implements SlideService {
|
|
|
|
|
|
@Transactional(readOnly = true)
|
|
|
@Override
|
|
|
- public Page<SlideVO> teacherGetSlidesByCourse(LoginUser teacher, Long courseId, String key, Pageable pageable) {
|
|
|
- return findByCourseIdAndTeacherIdAndKey(courseId, teacher.getId(), key, pageable).map(SlideVO::new);
|
|
|
+ public Page<SlideVO> getSlidesByCourse(LoginUser user, Long courseId, String key, Pageable pageable) {
|
|
|
+ if (!courseService.existsCourseResourcesGetAuth(user, courseId)) {
|
|
|
+ throw HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该课程的课件");
|
|
|
+ }
|
|
|
+ switch (user.getType()) {
|
|
|
+ case TEACHER:
|
|
|
+ return teacherGetSlidesByCourse(courseId, key, pageable);
|
|
|
+ case STUDENT:
|
|
|
+ return studentGetSlidesByCourse(courseId, key, pageable);
|
|
|
+ default:
|
|
|
+ return Page.empty();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- private static final Set<SlideState> STATES_NOT_GET_BY_STUDENT_SET = ImmutableSet.of(SlideState.DRAFT);
|
|
|
+ private Page<SlideVO> teacherGetSlidesByCourse(Long courseId, String key, Pageable pageable) {
|
|
|
+ return findByCourseIdAndKey(courseId, key, pageable).map(SlideVO::new);
|
|
|
+ }
|
|
|
|
|
|
- @Transactional(readOnly = true)
|
|
|
- @Override
|
|
|
- public Page<SlideVO> studentGetSlidesByCourse(LoginUser student, Long courseId, String key, Pageable pageable) {
|
|
|
- if (!chooseDAO.existsByStudentIdAndCourseId(student.getId(), courseId)) {
|
|
|
- throw HelperException.of(ExceptionType.FORBIDDEN, "你无权查看该课程下的课件");
|
|
|
- }
|
|
|
+ private static final Set<SlideState> STATES_NOT_GET_BY_STUDENT_SET = ImmutableSet.of(SlideState.DRAFT);
|
|
|
|
|
|
- return findByCourseIdAndKeyAndStateNotInAndKey(courseId, STATES_NOT_GET_BY_STUDENT_SET, key, pageable).map(SlideVO::new);
|
|
|
+ private Page<SlideVO> studentGetSlidesByCourse(Long courseId, String key, Pageable pageable) {
|
|
|
+ return findByCourseIdAndKeyAndStateNotIn(courseId, STATES_NOT_GET_BY_STUDENT_SET, key, pageable).map(SlideVO::new);
|
|
|
}
|
|
|
|
|
|
@Transactional(readOnly = true)
|
|
|
@Override
|
|
|
public String getSlideUrl(LoginUser user, Long slideId) {
|
|
|
Slide slide = slideDAO.findSlideById(slideId);
|
|
|
- checkDataAccessAuth(user, slide);
|
|
|
+ if (!courseService.existsCourseResourcesGetAuth(user, slide.getCourse().getId())) {
|
|
|
+ throw HelperException.of(ExceptionType.FORBIDDEN, "您无权获取该课件的链接");
|
|
|
+ }
|
|
|
|
|
|
String url = cacheUtils.get(Consts.SLIDE_URL_CACHE_NAME, slide.getObjectName());
|
|
|
if (url != null) {
|
|
|
@@ -250,7 +263,9 @@ public class SlideServiceImpl implements SlideService {
|
|
|
@Override
|
|
|
public SlideVO getOneSlide(LoginUser user, Long slideId) {
|
|
|
Slide slide = slideDAO.findSlideById(slideId);
|
|
|
- checkDataAccessAuth(user, slide);
|
|
|
+ if (!courseService.existsCourseResourcesGetAuth(user, slide.getCourse().getId())) {
|
|
|
+ throw HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该课件");
|
|
|
+ }
|
|
|
return new SlideVO(slide);
|
|
|
}
|
|
|
|
|
|
@@ -263,17 +278,16 @@ public class SlideServiceImpl implements SlideService {
|
|
|
pageable);
|
|
|
}
|
|
|
|
|
|
- private Page<Slide> findByCourseIdAndTeacherIdAndKey(Long courseId, Long teacherId, String key, Pageable pageable) {
|
|
|
+ private Page<Slide> findByCourseIdAndKey(Long courseId, String key, Pageable pageable) {
|
|
|
return slideDAO.findAll(
|
|
|
(Specification<Slide>) (root, query, cb) -> cb.and(
|
|
|
- cb.equal(root.get("teacher").get("id"), teacherId),
|
|
|
cb.equal(root.get("course").get("id"), courseId),
|
|
|
cb.equal(root.get("deleteAt"), 0L),
|
|
|
cb.like(root.get("name"), StringUtils.keyPattern(key))),
|
|
|
pageable);
|
|
|
}
|
|
|
|
|
|
- private Page<Slide> findByCourseIdAndKeyAndStateNotInAndKey(Long courseId, Set<SlideState> exclusiveStates, String key, Pageable pageable) {
|
|
|
+ private Page<Slide> findByCourseIdAndKeyAndStateNotIn(Long courseId, Set<SlideState> exclusiveStates, String key, Pageable pageable) {
|
|
|
return slideDAO.findAll(
|
|
|
(Specification<Slide>) (root, query, cb) -> cb.and(
|
|
|
cb.equal(root.get("course").get("id"), courseId),
|
|
|
@@ -283,24 +297,4 @@ public class SlideServiceImpl implements SlideService {
|
|
|
),
|
|
|
pageable);
|
|
|
}
|
|
|
-
|
|
|
- private void checkDataAccessAuth(LoginUser user, Slide slide) {
|
|
|
- HelperException forbiddenEx = HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该课件");
|
|
|
-
|
|
|
- switch (user.getType()) {
|
|
|
- case TEACHER:
|
|
|
- if (!slide.getTeacher().getId().equals(user.getId())) {
|
|
|
- throw forbiddenEx;
|
|
|
- }
|
|
|
- break;
|
|
|
- case STUDENT:
|
|
|
- if (!chooseDAO.existsByStudentIdAndCourseId(user.getId(), slide.getCourse().getId())
|
|
|
- || slide.getState() == SlideState.DRAFT) {
|
|
|
- throw forbiddenEx;
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- throw forbiddenEx;
|
|
|
- }
|
|
|
- }
|
|
|
}
|