diff --git a/src/main/kotlin/org/mosad/thecitadelofricks/APIController.kt b/src/main/kotlin/org/mosad/thecitadelofricks/APIController.kt index 8f710fa..5ab0505 100644 --- a/src/main/kotlin/org/mosad/thecitadelofricks/APIController.kt +++ b/src/main/kotlin/org/mosad/thecitadelofricks/APIController.kt @@ -38,6 +38,7 @@ import java.net.HttpURLConnection import java.net.URL import java.time.LocalDateTime import java.util.* +import kotlin.collections.ArrayList import kotlin.concurrent.scheduleAtFixedRate @RestController @@ -56,7 +57,7 @@ class APIController { private var coursesLinkList = ArrayList() private var coursesLastUpdate: Long = 0 - private var timetableList = ArrayList() // this list contains all timetables + private var timetableList = ArrayList() // this list contains all timetables private var mensaCurrentWeek = MensaWeek() private var mensaNextWeek = MensaWeek() @@ -95,10 +96,13 @@ class APIController { } @RequestMapping("/timetable") - fun timetable(@RequestParam(value = "courseName", defaultValue = "AI4") courseName: String): TimetableCourse { + fun timetable( + @RequestParam(value = "courseName", defaultValue = "AI4") courseName: String, + @RequestParam(value = "week", defaultValue = "0") week: Int + ): TimetableCourseWeek { logger.info("timetable request at ${LocalDateTime.now()}!") - checkTimetableCourse(courseName) // check if we need to update and perform the update if so - return timetableList.stream().filter { x -> x.meta.courseName == courseName }.findAny().orElse(null) + checkTimetableCourse(courseName, week) // check if we need to update and perform the update if so + return timetableList.stream().filter { x -> x.meta.courseName == courseName && x.meta.week == week }.findAny().orElse(null) } @RequestMapping("/status") @@ -163,10 +167,9 @@ class APIController { */ private fun asyncUpdateTimetables() = GlobalScope.launch { timetableList.forEach { timetableCourse -> - val updateURL = timetableCourse.meta.courseLink - timetableCourse.currentWeek = TimetableParser().getTimeTable(updateURL) - timetableCourse.nextWeek = TimetableParser().getTimeTable(updateURL.replace("week=0","week=1")) - timetableCourse.meta.time = System.currentTimeMillis() / 1000 + val updateURL = timetableCourse.meta.link + timetableCourse.timetable = TimetableParser().getTimeTable(updateURL) + timetableCourse.meta.updateTime = System.currentTimeMillis() / 1000 } logger.info("updated ${timetableList.size} timetables successful!") } @@ -176,32 +179,26 @@ class APIController { * during the update process the old data will be returned for a API request * update if the last update was 6 hours ago */ - private fun checkTimetableCourse(courseName: String) = runBlocking { + private fun checkTimetableCourse(courseName: String, week: Int) = runBlocking { val currentTime = System.currentTimeMillis() / 1000 - var currentWeek = TimetableWeek() - var nextWeek = TimetableWeek() + var timetable = TimetableWeek() // check if the timetable already exists and is up to date - val result = timetableList.stream().filter { x -> x.meta.courseName == courseName }.findAny().orElse(null) + val result = timetableList.stream().filter { x -> x.meta.courseName == courseName && x.meta.week == week }.findAny().orElse(null) when (result) { // there is no such course yet, create one null -> { val courseLink = coursesLinkList.stream().filter { x -> x.courseName == courseName }.findFirst().orElse(null).courseLink - val timetableMeta = TimetableMeta(courseName, courseLink, currentTime) + val timetableMeta = TimetableCourseMeta(currentTime, courseName, week, courseLink.replace("week=0","week=$week")) - val jobCurrent = GlobalScope.async { - currentWeek = TimetableParser().getTimeTable(courseLink) + val jobTimetable = GlobalScope.async { + timetable = TimetableParser().getTimeTable(timetableMeta.link) } - val jobNext = GlobalScope.async { - nextWeek = TimetableParser().getTimeTable(courseLink.replace("week=0","week=1")) - } + jobTimetable.await() - jobCurrent.await() - jobNext.await() - - timetableList.add(TimetableCourse(timetableMeta, currentWeek, nextWeek)) - logger.info("added new timetable for $courseName") + timetableList.add(TimetableCourseWeek(timetableMeta, timetable)) + logger.info("added new timetable for $courseName, week $week") } } } diff --git a/src/main/kotlin/org/mosad/thecitadelofricks/DataTypes.kt b/src/main/kotlin/org/mosad/thecitadelofricks/DataTypes.kt index ccc0d56..c17264a 100644 --- a/src/main/kotlin/org/mosad/thecitadelofricks/DataTypes.kt +++ b/src/main/kotlin/org/mosad/thecitadelofricks/DataTypes.kt @@ -56,9 +56,9 @@ data class TimetableDay(val timeslots: Array> = Array(6) { Arr data class TimetableWeek(val days: Array = Array(6) { TimetableDay() }) -data class TimetableMeta(val courseName: String, val courseLink: String, var time: Long) +data class TimetableCourseMeta(var updateTime: Long, val courseName: String, val week: Int, val link: String) -data class TimetableCourse(val meta: TimetableMeta, var currentWeek: TimetableWeek, var nextWeek: TimetableWeek) +data class TimetableCourseWeek(val meta: TimetableCourseMeta, var timetable: TimetableWeek) // data classes for the status part