Untitled
unknown
plain_text
3 years ago
6.6 kB
5
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...