Skip to content

Commit 35634f6

Browse files
committed
implement StudentProgressService
1 parent 5e9d5bb commit 35634f6

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed

src/main/java/com/example/aiacademy/models/Course.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.example.aiacademy.models;
22

3+
import com.fasterxml.jackson.annotation.JsonManagedReference;
34
import jakarta.persistence.*;
45
import lombok.*;
56

67
import java.time.LocalDateTime;
8+
import java.util.List;
79

810
@Entity
911
@Table(name = "courses")
@@ -31,6 +33,10 @@ public class Course {
3133
@JoinColumn(name = "tutor_id")
3234
private User tutor;
3335

36+
@JsonManagedReference
37+
@OneToMany(mappedBy = "course", cascade = CascadeType.ALL, orphanRemoval = true)
38+
private List<Module> moduleList;
39+
3440
private LocalDateTime creationAt;
3541
private LocalDateTime updatedAt;
3642

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.example.aiacademy.repositories;
2+
3+
import com.example.aiacademy.models.QuizAttempt;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface QuizAttemptRepository extends JpaRepository<QuizAttempt, Long> {
7+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.example.aiacademy.services;
2+
3+
import com.example.aiacademy.models.*;
4+
import com.example.aiacademy.repositories.CourseProgressRepository;
5+
import com.example.aiacademy.repositories.LessonProgressRepository;
6+
import com.example.aiacademy.repositories.QuestionRepository;
7+
import com.example.aiacademy.repositories.QuizAttemptRepository;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.stereotype.Service;
10+
import org.springframework.transaction.annotation.Transactional;
11+
12+
import java.time.LocalDateTime;
13+
14+
@Service
15+
@RequiredArgsConstructor
16+
@Transactional
17+
public class StudentProgressService {
18+
19+
private final CourseProgressRepository courseProgressRepository;
20+
private final LessonProgressRepository lessonProgressRepository;
21+
private final QuizAttemptRepository quizAttemptRepository;
22+
private final QuestionRepository questionRepository;
23+
24+
25+
@Transactional
26+
public CourseProgress accessCourse(User student, Course course){
27+
28+
CourseProgress courseProgress =
29+
courseProgressRepository.findByStudentAndCourse(student, course)
30+
.orElseGet(() -> {
31+
CourseProgress p = new CourseProgress();
32+
p.setStudent(student);
33+
p.setCourse(course);
34+
35+
return courseProgressRepository.save(p);
36+
});
37+
38+
courseProgress.setStatus(CourseProgressStatus.IN_PROGRESS);
39+
courseProgress.setLastAccessedAt(LocalDateTime.now());
40+
41+
return courseProgress;
42+
}
43+
44+
@Transactional
45+
public void completeLesson(User student, Lesson lesson){
46+
47+
Course course = lesson.getModule().getCourse();
48+
49+
CourseProgress cp = accessCourse(student,course);
50+
51+
LessonProgress lp = lessonProgressRepository.findByCourseProgressAndLesson(cp,lesson)
52+
.orElseGet(() -> {
53+
LessonProgress p = new LessonProgress();
54+
p.setCourseProgress(cp);
55+
p.setLesson(lesson);
56+
return p;
57+
});
58+
59+
lp.setCompleted(true);
60+
lp.setCompletedAt(LocalDateTime.now());
61+
62+
lessonProgressRepository.save(lp);
63+
64+
updateCourseCompletion(cp);
65+
}
66+
67+
68+
69+
private void updateCourseCompletion(CourseProgress cp){
70+
71+
int totalLessons =
72+
cp.getCourse().getModuleList().stream()
73+
.mapToInt(m -> m.getLessons().size())
74+
.sum();
75+
76+
long completed =
77+
cp.getLessonProgresses().stream()
78+
.filter(LessonProgress::isCompleted)
79+
.count();
80+
81+
if (completed == totalLessons){
82+
cp.setStatus(CourseProgressStatus.COMPLETED);
83+
cp.setCompletedAt(LocalDateTime.now());
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)