11package com.wafflestudio.snutt.diary.service
22
3+ import com.wafflestudio.snutt.common.enums.Semester
34import com.wafflestudio.snutt.common.exception.DiaryDailyClassTypeNotFoundException
45import com.wafflestudio.snutt.common.exception.DiaryQuestionNotFoundException
56import com.wafflestudio.snutt.common.exception.DiarySubmissionNotFoundException
@@ -16,6 +17,7 @@ import com.wafflestudio.snutt.diary.repository.DiaryDailyClassTypeRepository
1617import com.wafflestudio.snutt.diary.repository.DiaryQuestionRepository
1718import com.wafflestudio.snutt.diary.repository.DiarySubmissionRepository
1819import com.wafflestudio.snutt.lectures.service.LectureService
20+ import com.wafflestudio.snutt.timetables.data.TimetableLecture
1921import com.wafflestudio.snutt.timetables.repository.TimetableRepository
2022import kotlinx.coroutines.flow.toList
2123import org.springframework.stereotype.Service
@@ -28,6 +30,13 @@ interface DiaryService {
2830 dailyClassTypeNames : List <String >,
2931 ): DiaryQuestionnaire
3032
33+ suspend fun getDiaryTargetLecture (
34+ userId : String ,
35+ year : Int ,
36+ semester : Semester ,
37+ idsToExclude : List <String >,
38+ ): TimetableLecture ?
39+
3140 suspend fun getActiveDailyClassTypes (): List <DiaryDailyClassType >
3241
3342 suspend fun getAllDailyClassTypes (): List <DiaryDailyClassType >
@@ -72,33 +81,47 @@ class DiaryServiceImpl(
7281 ): DiaryQuestionnaire {
7382 val dailyClassTypeIds = diaryDailyClassTypeRepository.findAllByNameIn(dailyClassTypeNames).map { it.id!! }
7483 val availableQuestions = diaryQuestionRepository.findByTargetDailyClassTypeIdsInAndActiveTrue(dailyClassTypeIds)
84+ val questions =
85+ availableQuestions
86+ .shuffled()
87+ .take(3 )
88+
7589 val lecture = lectureService.getByIdOrNull(lectureId) ? : throw LectureNotFoundException
90+ val nextLecture = getDiaryTargetLecture(userId, lecture.year, lecture.semester, listOf (lecture.id!! ))
91+
92+ return DiaryQuestionnaire (
93+ courseTitle = lecture.courseTitle,
94+ questions = questions,
95+ nextLecture = nextLecture,
96+ )
97+ }
7698
99+ override suspend fun getDiaryTargetLecture (
100+ userId : String ,
101+ year : Int ,
102+ semester : Semester ,
103+ idsToExclude : List <String >,
104+ ): TimetableLecture ? {
77105 val userTimetable =
78- timetableRepository.findByUserIdAndYearAndSemesterAndIsPrimaryTrue(userId, lecture. year, lecture. semester)
106+ timetableRepository.findByUserIdAndYearAndSemesterAndIsPrimaryTrue(userId, year, semester)
79107 ? : throw TimetableNotFoundException
80-
81108 val recentlySubmittedIds =
82109 diarySubmissionRepository
83110 .findAllByUserIdAndCreatedAtIsAfter(
84111 userId,
85112 LocalDateTime .now().minusDays(1 ),
86113 ).map { it.lectureId }
87114 val nextLectureCandidates =
88- userTimetable.lectures.filterNot { it.lectureId == lectureId || recentlySubmittedIds.contains(it.lectureId) }
89- val nextLecture = nextLectureCandidates.randomOrNull()
90-
91- val questions =
92- availableQuestions
93- .shuffled()
94- .take(3 )
115+ userTimetable.lectures
116+ .filterNot { it.lectureId == null }
117+ .filterNot { it.lectureId in idsToExclude }
118+ .let { candidates ->
119+ candidates
120+ .filterNot { recentlySubmittedIds.contains(it.lectureId) }
121+ .ifEmpty { candidates }
122+ }
95123
96- return DiaryQuestionnaire (
97- lectureTitle = lecture.courseTitle,
98- questions = questions,
99- nextLectureId = nextLecture?.lectureId,
100- nextLectureTitle = nextLecture?.courseTitle,
101- )
124+ return nextLectureCandidates.randomOrNull()
102125 }
103126
104127 override suspend fun getActiveDailyClassTypes (): List <DiaryDailyClassType > = diaryDailyClassTypeRepository.findAllByActiveTrue()
0 commit comments