Untitled
unknown
plain_text
2 years ago
6.6 kB
4
Indexable
package pt.ulisboa.tecnico.socialsoftware.tutor.teacherdashboard.services; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import pt.ulisboa.tecnico.socialsoftware.tutor.exceptions.TutorException; import pt.ulisboa.tecnico.socialsoftware.tutor.execution.domain.CourseExecution; import pt.ulisboa.tecnico.socialsoftware.tutor.execution.repository.CourseExecutionRepository; import pt.ulisboa.tecnico.socialsoftware.tutor.teacherdashboard.domain.TeacherDashboard; import pt.ulisboa.tecnico.socialsoftware.tutor.teacherdashboard.domain.QuestionStats; import pt.ulisboa.tecnico.socialsoftware.tutor.teacherdashboard.dto.TeacherDashboardDto; import pt.ulisboa.tecnico.socialsoftware.tutor.teacherdashboard.dto.QuestionStatsDto; import pt.ulisboa.tecnico.socialsoftware.tutor.teacherdashboard.repository.TeacherDashboardRepository; import pt.ulisboa.tecnico.socialsoftware.tutor.teacherdashboard.repository.QuestionStatsRepository; import pt.ulisboa.tecnico.socialsoftware.tutor.user.domain.Teacher; import pt.ulisboa.tecnico.socialsoftware.tutor.user.repository.TeacherRepository; import pt.ulisboa.tecnico.socialsoftware.tutor.question.domain.Course; import pt.ulisboa.tecnico.socialsoftware.tutor.exceptions.ErrorMessage; import java.util.stream.Collectors; import java.util.*; import static pt.ulisboa.tecnico.socialsoftware.tutor.exceptions.ErrorMessage.*; @Service public class TeacherDashboardService { @Autowired private CourseExecutionRepository courseExecutionRepository; @Autowired private TeacherRepository teacherRepository; @Autowired private TeacherDashboardRepository teacherDashboardRepository; @Autowired private QuestionStatsRepository questionStatsRepository; @Transactional(isolation = Isolation.READ_COMMITTED) public TeacherDashboardDto getTeacherDashboard(int courseExecutionId, int teacherId) { CourseExecution courseExecution = courseExecutionRepository.findById(courseExecutionId) .orElseThrow(() -> new TutorException(COURSE_EXECUTION_NOT_FOUND)); Teacher teacher = teacherRepository.findById(teacherId) .orElseThrow(() -> new TutorException(USER_NOT_FOUND, teacherId)); if (!teacher.getCourseExecutions().contains(courseExecution)) throw new TutorException(TEACHER_NO_COURSE_EXECUTION); Optional<TeacherDashboard> dashboardOptional = teacher.getDashboards().stream() .filter(dashboard -> dashboard.getCourseExecution().getId().equals(courseExecutionId)) .findAny(); return dashboardOptional. map(TeacherDashboardDto::new). orElseGet(() -> createAndReturnTeacherDashboardDto(courseExecution, teacher)); } @Transactional(isolation = Isolation.READ_COMMITTED) public TeacherDashboardDto createTeacherDashboard(int courseExecutionId, int teacherId) { CourseExecution courseExecution = courseExecutionRepository.findById(courseExecutionId) .orElseThrow(() -> new TutorException(COURSE_EXECUTION_NOT_FOUND)); Teacher teacher = teacherRepository.findById(teacherId) .orElseThrow(() -> new TutorException(USER_NOT_FOUND, teacherId)); if (teacher.getDashboards().stream().anyMatch(dashboard -> dashboard.getCourseExecution().equals(courseExecution))) throw new TutorException(TEACHER_ALREADY_HAS_DASHBOARD); if (!teacher.getCourseExecutions().contains(courseExecution)) throw new TutorException(TEACHER_NO_COURSE_EXECUTION); return createAndReturnTeacherDashboardDto(courseExecution, teacher); } private TeacherDashboardDto createAndReturnTeacherDashboardDto(CourseExecution courseExecution, Teacher teacher) { TeacherDashboard teacherDashboard = new TeacherDashboard(courseExecution, teacher); teacherDashboardRepository.save(teacherDashboard); Course course = courseExecution.getCourse(); Set<CourseExecution> courseExecutions = course.getCourseExecutions(); List<CourseExecution> recentCourseExecutions = courseExecutions.stream().filter(unfilteredCourseExecution -> { try{ courseExecution.getEndDate(); } catch(IllegalStateException e){ return false; } return true; }) .sorted(Comparator.comparing(CourseExecution::getEndDate).reversed()) .limit(3).collect(Collectors.toList()); List<QuestionStats> questionStatsList = new ArrayList<QuestionStats>(); int recentCourseExecutionsSize = recentCourseExecutions.size(); for(int i = 0; i < recentCourseExecutionsSize; i++){ QuestionStats questionStats = new QuestionStats(teacherDashboard, recentCourseExecutions.get(i)); questionStatsRepository.save(questionStats); questionStatsList.add(questionStats); } teacherDashboard.setQuestionStats(questionStatsList); return new TeacherDashboardDto(teacherDashboard); } @Transactional(isolation = Isolation.READ_COMMITTED) public void removeTeacherDashboard(Integer dashboardId) { if (dashboardId == null) throw new TutorException(DASHBOARD_NOT_FOUND, -1); TeacherDashboard teacherDashboard = teacherDashboardRepository.findById(dashboardId).orElseThrow(() -> new TutorException(DASHBOARD_NOT_FOUND, dashboardId)); teacherDashboard.remove(); teacherDashboardRepository.delete(teacherDashboard); } @Transactional(isolation = Isolation.READ_COMMITTED) public void updateTeacherDashboard(Integer dashboardId) { if (dashboardId == null) throw new TutorException(DASHBOARD_NOT_FOUND, -1); TeacherDashboard teacherDashboard = teacherDashboardRepository.findById(dashboardId) .orElseThrow(() -> new TutorException(ErrorMessage.DASHBOARD_NOT_FOUND, dashboardId)); //TeacherDashboardDto teacherDashboardDto = getTeacherDashboard(teacherDashboard.getTeacher().getId(), teacherDashboard.getCourseExecution().getId()); teacherDashboard.update(); //teacherDashboardDto.updateQuestionStats(teacherDashboard.getQuestionStats()); } }
Editor is loading...