Ver Fonte

refactor: 重构course,slide,course_file接口

ChenSiTong há 6 anos atrás
pai
commit
d39169f072

+ 1 - 8
src/main/java/nju/seec/helper/controller/CourseController.java

@@ -99,14 +99,7 @@ public class CourseController {
     public PageResponse<CourseVO> getCourses(LoginUser user,
                                              @RequestParam(required = false, defaultValue = "") String key,
                                              @PageableDefault(Integer.MAX_VALUE) Pageable pageable) {
-        switch (user.getType()) {
-            case TEACHER:
-                return PageResponse.of(courseService.teacherGetCourses(user, key, pageable));
-            case STUDENT:
-                return PageResponse.of(courseService.studentGetCourses(user, key, pageable));
-            default:
-                return PageResponse.empty();
-        }
+        return PageResponse.of(courseService.getCourses(user, key, pageable));
     }
 
     /**

+ 5 - 5
src/main/java/nju/seec/helper/controller/CourseFileController.java

@@ -40,11 +40,11 @@ public class CourseFileController {
 
     @Auth(roles = {UserType.TEACHER, UserType.STUDENT}, message = "获取课程附件")
     @GetMapping("/course/{courseId}")
-    public PageResponse<CourseFileVO> getCourseFiles(LoginUser user,
-                                                     @PathVariable Long courseId,
-                                                     @RequestParam(required = false, defaultValue = "") String key,
-                                                     @PageableDefault(Integer.MAX_VALUE) Pageable pageable) {
-        return PageResponse.of(courseFileService.getCourseFiles(user, courseId, key, pageable));
+    public PageResponse<CourseFileVO> getCourseFilesByCourse(LoginUser user,
+                                                             @PathVariable Long courseId,
+                                                             @RequestParam(required = false, defaultValue = "") String key,
+                                                             @PageableDefault(Integer.MAX_VALUE) Pageable pageable) {
+        return PageResponse.of(courseFileService.getCourseFilesByCourse(user, courseId, key, pageable));
     }
 
     @Auth(roles = {UserType.TEACHER, UserType.STUDENT}, message = "获取课程附件链接")

+ 1 - 8
src/main/java/nju/seec/helper/controller/SlideController.java

@@ -105,14 +105,7 @@ public class SlideController {
                                                    @PathVariable Long courseId,
                                                    @RequestParam(required = false, defaultValue = "") String key,
                                                    @PageableDefault(size = Integer.MAX_VALUE) Pageable pageable) {
-        switch (user.getType()) {
-            case TEACHER:
-                return PageResponse.of(slideService.teacherGetSlidesByCourse(user, courseId, key, pageable));
-            case STUDENT:
-                return PageResponse.of(slideService.studentGetSlidesByCourse(user, courseId, key, pageable));
-            default:
-                return PageResponse.empty();
-        }
+        return PageResponse.of(slideService.getSlidesByCourse(user, courseId, key, pageable));
     }
 
     /**

+ 0 - 7
src/main/java/nju/seec/helper/dao/StudentScoreDAO.java

@@ -1,7 +0,0 @@
-//package nju.seec.helper.dao;
-//
-//import nju.seec.helper.entity.StudentScore;
-//import org.springframework.data.jpa.repository.JpaRepository;
-//
-//public interface StudentScoreDAO extends JpaRepository<StudentScore, Long> {
-//}

+ 1 - 1
src/main/java/nju/seec/helper/service/CourseFileService.java

@@ -35,7 +35,7 @@ public interface CourseFileService {
      * @param pageable
      * @return
      */
-    Page<CourseFileVO> getCourseFiles(LoginUser user, Long courseId, String key, Pageable pageable);
+    Page<CourseFileVO> getCourseFilesByCourse(LoginUser user, Long courseId, String key, Pageable pageable);
 
     /**
      * 取得课程附件链接

+ 13 - 14
src/main/java/nju/seec/helper/service/CourseService.java

@@ -57,7 +57,7 @@ public interface CourseService {
     void quitCourse(LoginUser user, Long courseId);
 
     /**
-     * 获取课程
+     * 获取课程列表(无需登录)
      *
      * @param key
      * @param pageable
@@ -66,24 +66,14 @@ public interface CourseService {
     Page<CourseVO> getCourses(String key, Pageable pageable);
 
     /**
-     * 教师获取创建课程
+     * 获取课程列表
      *
-     * @param teacher
-     * @param key
-     * @param pageable
-     * @return
-     */
-    Page<CourseVO> teacherGetCourses(LoginUser teacher, String key, Pageable pageable);
-
-    /**
-     * 学生获取已选课程
-     *
-     * @param student
+     * @param user
      * @param key
      * @param pageable
      * @return
      */
-    Page<CourseVO> studentGetCourses(LoginUser student, String key, Pageable pageable);
+    Page<CourseVO> getCourses(LoginUser user, String key, Pageable pageable);
 
     /**
      * 获取课程选课码
@@ -112,4 +102,13 @@ public interface CourseService {
      * @return
      */
     Page<UserVO> getChooseStudents(LoginUser user, Long courseId, String key, Pageable pageable);
+
+    /**
+     * 检查是否具有访问课程资源权限
+     *
+     * @param user
+     * @param courseId
+     * @return
+     */
+    boolean existsCourseResourcesGetAuth(LoginUser user, Long courseId);
 }

+ 4 - 15
src/main/java/nju/seec/helper/service/SlideService.java

@@ -58,7 +58,7 @@ public interface SlideService {
     void removeSlide(LoginUser user, Long slideId);
 
     /**
-     * 教师获取课件
+     * 教师获取课件列表
      *
      * @param teacher
      * @param key
@@ -68,26 +68,15 @@ public interface SlideService {
     Page<SlideVO> teacherGetSlides(LoginUser teacher, String key, Pageable pageable);
 
     /**
-     * 教师基于课程获取课件
+     * 基于课程获取课件列表
      *
-     * @param teacher
-     * @param courseId
-     * @param key
-     * @param pageable
-     * @return
-     */
-    Page<SlideVO> teacherGetSlidesByCourse(LoginUser teacher, Long courseId, String key, Pageable pageable);
-
-    /**
-     * 教师获取课件
-     *
-     * @param student
+     * @param user
      * @param courseId
      * @param key
      * @param pageable
      * @return
      */
-    Page<SlideVO> studentGetSlidesByCourse(LoginUser student, Long courseId, String key, Pageable pageable);
+    Page<SlideVO> getSlidesByCourse(LoginUser user, Long courseId, String key, Pageable pageable);
 
     /**
      * 获取课件链接

+ 12 - 22
src/main/java/nju/seec/helper/service/impl/CourseFileServiceImpl.java

@@ -9,6 +9,7 @@ import nju.seec.helper.dto.user.LoginUser;
 import nju.seec.helper.entity.Course;
 import nju.seec.helper.entity.CourseFile;
 import nju.seec.helper.service.CourseFileService;
+import nju.seec.helper.service.CourseService;
 import nju.seec.helper.service.util.AuthUtils;
 import nju.seec.helper.util.Consts;
 import nju.seec.helper.util.FileUtils;
@@ -37,14 +38,16 @@ public class CourseFileServiceImpl implements CourseFileService {
     private final CourseFileDAO courseFileDAO;
     private final ChooseDAO chooseDAO;
 
+    private final CourseService courseService;
 
     private final FileUtils fileUtils;
     private final RedisCacheUtils cacheUtils;
 
-    public CourseFileServiceImpl(CourseDAO courseDAO, CourseFileDAO courseFileDAO, ChooseDAO chooseDAO, FileUtils fileUtils, RedisCacheUtils cacheUtils) {
+    public CourseFileServiceImpl(CourseDAO courseDAO, CourseFileDAO courseFileDAO, ChooseDAO chooseDAO, CourseService courseService, FileUtils fileUtils, RedisCacheUtils cacheUtils) {
         this.courseDAO = courseDAO;
         this.courseFileDAO = courseFileDAO;
         this.chooseDAO = chooseDAO;
+        this.courseService = courseService;
         this.fileUtils = fileUtils;
         this.cacheUtils = cacheUtils;
     }
@@ -87,7 +90,10 @@ public class CourseFileServiceImpl implements CourseFileService {
 
     @Transactional(readOnly = true)
     @Override
-    public Page<CourseFileVO> getCourseFiles(LoginUser user, Long courseId, String key, Pageable pageable) {
+    public Page<CourseFileVO> getCourseFilesByCourse(LoginUser user, Long courseId, String key, Pageable pageable) {
+        if (!courseService.existsCourseResourcesGetAuth(user, courseId)) {
+            throw HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该课程的附件");
+        }
         return courseFileDAO.findByCourseIdAndFileNameContains(courseId, key, pageable).map(CourseFileVO::new);
     }
 
@@ -95,7 +101,10 @@ public class CourseFileServiceImpl implements CourseFileService {
     @Override
     public String getCourseFileUrl(LoginUser user, Long courseFileId) {
         CourseFile courseFile = courseFileDAO.findCourseFileById(courseFileId);
-        checkDataAccessAuth(user, courseFile);
+
+        if (!courseService.existsCourseResourcesGetAuth(user, courseFile.getCourseId())) {
+            throw HelperException.of(ExceptionType.FORBIDDEN, "您无权获取该附件的链接");
+        }
 
         String url = cacheUtils.get(Consts.COURSE_FILE_URL_CACHE_NAME, courseFile.getObjectName());
         if (url != null) {
@@ -109,23 +118,4 @@ public class CourseFileServiceImpl implements CourseFileService {
     private String getCourseFileObjectName(Long courseId, String fileName) {
         return COURSE_FILE_STORE_DIR + File.separator + courseId + File.separator + fileName;
     }
-
-    private void checkDataAccessAuth(LoginUser user, CourseFile courseFile) {
-        HelperException forbiddenEx = HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该附件");
-
-        switch (user.getType()) {
-            case TEACHER:
-                if (!courseFile.getTeacherId().equals(user.getId())) {
-                    throw forbiddenEx;
-                }
-                break;
-            case STUDENT:
-                if (!chooseDAO.existsByStudentIdAndCourseId(user.getId(), courseFile.getCourseId())) {
-                    throw forbiddenEx;
-                }
-                break;
-            default:
-                throw forbiddenEx;
-        }
-    }
 }

+ 30 - 8
src/main/java/nju/seec/helper/service/impl/CourseServiceImpl.java

@@ -113,21 +113,30 @@ public class CourseServiceImpl implements CourseService {
 
     @Transactional(readOnly = true)
     @Override
-    public Page<CourseVO> teacherGetCourses(LoginUser teacher, String key, Pageable pageable) {
-        return findByTeacherIdAndKey(teacher.getId(), key, pageable).map(CourseVO::new);
+    public Page<CourseVO> getCourses(LoginUser user, String key, Pageable pageable) {
+        switch (user.getType()) {
+            case TEACHER:
+                return teacherGetCourses(user.getId(), key, pageable);
+            case STUDENT:
+                return studentGetCourses(user.getId(), key, pageable);
+            default:
+                return Page.empty();
+        }
     }
 
-    @Transactional(readOnly = true)
-    @Override
-    public Page<CourseVO> studentGetCourses(LoginUser student, String key, Pageable pageable) {
-        return findByIdsAndKey(chooseDAO.findCourseIdsByStudentId(student.getId()), key, pageable).map(CourseVO::new);
+    private Page<CourseVO> teacherGetCourses(Long teacherId, String key, Pageable pageable) {
+        return findByTeacherIdAndKey(teacherId, key, pageable).map(CourseVO::new);
+    }
+
+    private Page<CourseVO> studentGetCourses(Long studentId, String key, Pageable pageable) {
+        return findByIdsAndKey(chooseDAO.findCourseIdsByStudentId(studentId), key, pageable).map(CourseVO::new);
     }
 
     @Transactional(readOnly = true)
     @Override
     public String getCourseCode(LoginUser user, Long courseId) {
         Course course = courseDAO.findCourseById(courseId);
-        AuthUtils.checkDataAuth(user.getId(), course.getTeacher().getId(), "您无权查看该课程选课码");
+        AuthUtils.checkDataAuth(user.getId(), course.getTeacher().getId(), "您无权获取该课程选课码");
 
         return EncryptUtils.decode(course.getCode());
     }
@@ -138,14 +147,27 @@ public class CourseServiceImpl implements CourseService {
         return new CourseVO(courseDAO.findCourseById(courseId));
     }
 
+    @Transactional(readOnly = true)
     @Override
     public Page<UserVO> getChooseStudents(LoginUser user, Long courseId, String key, Pageable pageable) {
         Course course = courseDAO.findCourseById(courseId);
-        AuthUtils.checkDataAuth(user.getId(), course.getTeacher().getId(), "您无权查看该课程的选课名单");
+        AuthUtils.checkDataAuth(user.getId(), course.getTeacher().getId(), "您无权获取该课程的选课名单");
 
         return userDAO.findByIdIn(chooseDAO.findStudentIdsByCourseId(courseId), pageable).map(UserVO::new);
     }
 
+    @Override
+    public boolean existsCourseResourcesGetAuth(LoginUser user, Long courseId) {
+        switch (user.getType()) {
+            case TEACHER:
+                return courseDAO.findCourseById(courseId).getTeacher().getId().equals(user.getId());
+            case STUDENT:
+                return chooseDAO.existsByStudentIdAndCourseId(user.getId(), courseId);
+            default:
+                return false;
+        }
+    }
+
     private void checkSameCourseName(Long courseId, Long teacherId, String name) {
         long exists = courseDAO.count((Specification<Course>) (root, query, cb) ->
                 cb.and(cb.notEqual(root.get("id"), courseId),

+ 30 - 36
src/main/java/nju/seec/helper/service/impl/SlideServiceImpl.java

@@ -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;
-        }
-    }
 }