package nju.seec.helper.service.impl; import nju.seec.helper.dao.ChooseDAO; import nju.seec.helper.dao.CourseDAO; import nju.seec.helper.dto.ChooseDTO; import nju.seec.helper.dto.CourseDTO; import nju.seec.helper.dto.LoginUser; import nju.seec.helper.dto.modify.ModifyCourseDTO; import nju.seec.helper.entity.Choose; import nju.seec.helper.entity.Course; import nju.seec.helper.service.AuthUtil; import nju.seec.helper.service.CourseService; import nju.seec.helper.util.EncryptUtils; import nju.seec.helper.util.enums.ExceptionType; import nju.seec.helper.util.exception.HelperException; import nju.seec.helper.vo.CourseVO; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * @author cst */ @Service public class CourseServiceImpl implements CourseService { private final CourseDAO courseDAO; private final ChooseDAO chooseDAO; public CourseServiceImpl(CourseDAO courseDAO, ChooseDAO chooseDAO) { this.courseDAO = courseDAO; this.chooseDAO = chooseDAO; } @Transactional(rollbackFor = Exception.class) @Override public CourseVO createCourse(LoginUser teacher, CourseDTO courseDTO) { // 检查 checkSameCourseName(teacher.getId(), courseDTO.getName()); Course course = new Course() .setTeacherId(teacher.getId()) .setTeacherName(teacher.getName()) .setName(courseDTO.getName()) .setBio(courseDTO.getBio()) .setCode(EncryptUtils.encode(courseDTO.getCode())); course = courseDAO.save(course); return new CourseVO(course); } @Override public CourseVO modifyCourse(LoginUser user, ModifyCourseDTO modifyCourseDTO) { Course course = courseDAO.findCourseById(modifyCourseDTO.getId()); // 检查 AuthUtil.checkDataAuth(user.getId(), course.getTeacherId(), "您无权修改该课程"); checkSameCourseName(user.getId(), modifyCourseDTO.getName()); course.setName(modifyCourseDTO.getName()) .setBio(modifyCourseDTO.getBio()) .setCode(EncryptUtils.encode(modifyCourseDTO.getCode())); course = courseDAO.save(course); return new CourseVO(course); } @Override public void removeCourse(LoginUser user, Integer courseId) { Course course = courseDAO.findCourseById(courseId); AuthUtil.checkDataAuth(user.getId(), course.getTeacherId(), "您无权删除该课程"); course.setDeleteAt(System.currentTimeMillis()); courseDAO.save(course); } @Transactional(rollbackFor = Exception.class) @Override public void chooseCourse(LoginUser student, ChooseDTO chooseDTO) { Integer studentId = student.getId(); if (chooseDAO.existsByStudentIdAndCourseId(studentId, chooseDTO.getCourseId())) { throw HelperException.of(ExceptionType.FORBIDDEN, "您已选课"); } Course course = courseDAO.findCourseById(chooseDTO.getCourseId()); if (!course.getCode().equals(EncryptUtils.encode(chooseDTO.getCode()))) { throw HelperException.of(ExceptionType.FORBIDDEN, "选课码错误"); } Choose choose = new Choose() .setCourseId(chooseDTO.getCourseId()) .setStudentId(studentId); chooseDAO.save(choose); } @Transactional(readOnly = true) @Override public Page getCourses(String key, Pageable pageable) { return courseDAO.findByKey(key, pageable).map(CourseVO::new); } @Transactional(readOnly = true) @Override public Page teacherGetCourses(LoginUser teacher, String key, Pageable pageable) { return courseDAO.findByTeacherIdAndKey(teacher.getId(), key, pageable).map(CourseVO::new); } @Transactional(readOnly = true) @Override public Page studentGetCourses(LoginUser student, String key, Pageable pageable) { return courseDAO .findByIdsAndKey( chooseDAO.findCourseIdsByStudentId(student.getId()), key, pageable) .map(CourseVO::new); } /** * 检查同名课程 */ private void checkSameCourseName(Integer teacherId, String name) { if (courseDAO.existsByTeacherIdAndName(teacherId, name)) { throw HelperException.of(ExceptionType.CONFLICT, "该课程名已使用"); } } }