11package com.wafflestudio.snu4t.handler
22
3+ import com.fasterxml.jackson.databind.ObjectMapper
4+ import com.wafflestudio.snu4t.common.enum.Semester
35import com.wafflestudio.snu4t.config.SnuttEvWebClient
6+ import com.wafflestudio.snu4t.coursebook.service.CoursebookService
47import com.wafflestudio.snu4t.middleware.SnuttRestApiDefaultMiddleware
8+ import com.wafflestudio.snu4t.timetables.data.TimetableLecture
9+ import com.wafflestudio.snu4t.timetables.service.TimetableService
10+ import kotlinx.coroutines.flow.toList
511import org.springframework.http.HttpHeaders
612import org.springframework.http.HttpMethod
713import org.springframework.http.MediaType
@@ -10,9 +16,13 @@ import org.springframework.web.reactive.function.BodyInserters
1016import org.springframework.web.reactive.function.client.awaitBody
1117import org.springframework.web.reactive.function.server.ServerRequest
1218import org.springframework.web.reactive.function.server.awaitBody
19+ import org.springframework.web.util.UriComponentsBuilder
20+ import java.net.URLEncoder
1321
1422@Component
1523class EvServiceHandler (
24+ private val coursebookService : CoursebookService ,
25+ private val timetableService : TimetableService ,
1626 private val snuttEvWebClient : SnuttEvWebClient ,
1727 snuttRestApiDefaultMiddleware : SnuttRestApiDefaultMiddleware ,
1828) : ServiceHandler(snuttRestApiDefaultMiddleware) {
@@ -24,7 +34,7 @@ class EvServiceHandler(
2434
2535 suspend fun handlePatch (req : ServerRequest ) = handleRouting(req, HttpMethod .PATCH )
2636
27- suspend fun handleRouting (
37+ private suspend fun handleRouting (
2838 req : ServerRequest ,
2939 method : HttpMethod ,
3040 ) = handle(req) {
@@ -40,4 +50,54 @@ class EvServiceHandler(
4050 .retrieve()
4151 .awaitBody()
4252 }
53+
54+ suspend fun getMyLatestLectures (req : ServerRequest ) =
55+ handle(req) {
56+ val userId = req.userId
57+ val requestQueryParams = req.queryParams()
58+ val recentLectures =
59+ coursebookService.getLastTwoCourseBooks().flatMap { coursebook ->
60+ timetableService.getTimetablesBySemester(userId, coursebook.year, coursebook.semester)
61+ .toList()
62+ .flatMap {
63+ timetable ->
64+ timetable.lectures.map { lecture -> EvLectureDto (lecture, coursebook.year, coursebook.semester) }
65+ }
66+ }
67+ val recentLecturesJson = ObjectMapper ().writeValueAsString(recentLectures).filterNot { it.isWhitespace() }
68+ val encodedJson = URLEncoder .encode(recentLecturesJson, " EUC-KR" )
69+
70+ snuttEvWebClient.get()
71+ .uri { builder ->
72+ UriComponentsBuilder .fromUri(builder.build())
73+ .path(" /v1/users/me/lectures/latest" )
74+ .queryParam(" snutt_lecture_info" , encodedJson)
75+ .queryParams(requestQueryParams)
76+ .build(true ).toUri()
77+ }
78+ .header(" Snutt-User-Id" , userId)
79+ .header(HttpHeaders .ACCEPT , MediaType .APPLICATION_JSON_VALUE )
80+ .header(HttpHeaders .CONTENT_TYPE , MediaType .APPLICATION_JSON_VALUE )
81+ .retrieve()
82+ .awaitBody()
83+ }
4384}
85+
86+ data class EvLectureDto (
87+ val year : Int ,
88+ val semester : Int ,
89+ val instructor : String? ,
90+ val courseNumber : String? ,
91+ )
92+
93+ fun EvLectureDto (
94+ timetableLecture : TimetableLecture ,
95+ year : Int ,
96+ semester : Semester ,
97+ ): EvLectureDto =
98+ EvLectureDto (
99+ year = year,
100+ semester = semester.value,
101+ instructor = timetableLecture.instructor,
102+ courseNumber = timetableLecture.courseNumber,
103+ )
0 commit comments