Skip to content

Commit dfbd1c8

Browse files
committed
/v1/users/me/lectures/latest 마이그레이션
1 parent 82b9922 commit dfbd1c8

File tree

4 files changed

+68
-1
lines changed

4 files changed

+68
-1
lines changed

api/src/main/kotlin/handler/EvServiceHandler.kt

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package com.wafflestudio.snu4t.handler
22

3+
import com.fasterxml.jackson.databind.ObjectMapper
4+
import com.wafflestudio.snu4t.common.enum.Semester
35
import com.wafflestudio.snu4t.config.SnuttEvWebClient
6+
import com.wafflestudio.snu4t.coursebook.service.CoursebookService
47
import 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
511
import org.springframework.http.HttpHeaders
612
import org.springframework.http.HttpMethod
713
import org.springframework.http.MediaType
@@ -10,9 +16,13 @@ import org.springframework.web.reactive.function.BodyInserters
1016
import org.springframework.web.reactive.function.client.awaitBody
1117
import org.springframework.web.reactive.function.server.ServerRequest
1218
import org.springframework.web.reactive.function.server.awaitBody
19+
import org.springframework.web.util.UriComponentsBuilder
20+
import java.net.URLEncoder
1321

1422
@Component
1523
class 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+
)

api/src/main/kotlin/router/MainRouter.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ class MainRouter(
300300
@Bean
301301
fun evServiceRouter() =
302302
v1CoRouter {
303+
GET("/ev-service/v1/users/me/lectures/latest", evServiceHandler::getMyLatestLectures)
303304
GET("/ev-service/{*requestPath}", evServiceHandler::handleGet)
304305
POST("/ev-service/{*requestPath}", evServiceHandler::handlePost)
305306
DELETE("/ev-service/{*requestPath}", evServiceHandler::handleDelete)

core/src/main/kotlin/coursebook/repository/CoursebookRepository.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ interface CoursebookRepository : CoroutineCrudRepository<Coursebook, String> {
99
suspend fun findFirstByOrderByYearDescSemesterDesc(): Coursebook
1010

1111
suspend fun findAllByOrderByYearDescSemesterDesc(): List<Coursebook>
12+
13+
suspend fun findTop2ByOrderByYearDescSemesterDesc(): List<Coursebook>
1214
}

core/src/main/kotlin/coursebook/service/CoursebookService.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@ interface CoursebookService {
88
suspend fun getLatestCoursebook(): Coursebook
99

1010
suspend fun getCoursebooks(): List<Coursebook>
11+
12+
suspend fun getLastTwoCourseBooks(): List<Coursebook>
1113
}
1214

1315
@Service
1416
class CoursebookServiceImpl(private val coursebookRepository: CoursebookRepository) : CoursebookService {
1517
override suspend fun getLatestCoursebook(): Coursebook = coursebookRepository.findFirstByOrderByYearDescSemesterDesc()
1618

1719
override suspend fun getCoursebooks(): List<Coursebook> = coursebookRepository.findAllByOrderByYearDescSemesterDesc()
20+
21+
override suspend fun getLastTwoCourseBooks(): List<Coursebook> = coursebookRepository.findTop2ByOrderByYearDescSemesterDesc()
1822
}

0 commit comments

Comments
 (0)