diff --git a/src/main/kotlin/roomescape/reservation/business/ReservationService.kt b/src/main/kotlin/roomescape/reservation/business/ReservationService.kt index 27201d0a..c9ee3a41 100644 --- a/src/main/kotlin/roomescape/reservation/business/ReservationService.kt +++ b/src/main/kotlin/roomescape/reservation/business/ReservationService.kt @@ -17,10 +17,9 @@ import roomescape.reservation.infrastructure.persistence.* import roomescape.reservation.web.* import roomescape.schedule.business.ScheduleService import roomescape.schedule.infrastructure.persistence.ScheduleStatus -import roomescape.schedule.web.ScheduleSummaryResponse +import roomescape.schedule.web.ScheduleOverviewResponse import roomescape.schedule.web.ScheduleUpdateRequest import roomescape.theme.business.ThemeService -import roomescape.theme.web.ThemeInfoResponse import roomescape.user.business.UserService import roomescape.user.web.UserContactResponse import java.time.LocalDate @@ -90,7 +89,7 @@ class ReservationService( } @Transactional(readOnly = true) - fun findUserSummaryReservation(user: CurrentUserContext): ReservationSummaryListResponse { + fun findAllUserReservationOverview(user: CurrentUserContext): ReservationOverviewListResponse { log.info { "[ReservationService.findSummaryByMemberId] 예약 조회 시작: userId=${user.id}" } val reservations: List = reservationRepository.findAllByUserIdAndStatusIsIn( @@ -98,17 +97,9 @@ class ReservationService( statuses = listOf(ReservationStatus.CONFIRMED, ReservationStatus.CANCELED) ) - return ReservationSummaryListResponse(reservations.map { - val schedule: ScheduleSummaryResponse = scheduleService.findSummaryById(it.scheduleId) - val theme: ThemeInfoResponse = themeService.findInfoById(schedule.themeId) - - ReservationSummaryResponse( - id = it.id, - themeName = theme.name, - date = schedule.date, - startAt = schedule.time, - status = it.status - ) + return ReservationOverviewListResponse(reservations.map { + val schedule: ScheduleOverviewResponse = scheduleService.findScheduleOverviewById(it.scheduleId) + it.toOverviewResponse(schedule) }).also { log.info { "[ReservationService.findSummaryByMemberId] ${it.reservations.size}개의 예약 조회 완료: userId=${user.id}" } } diff --git a/src/main/kotlin/roomescape/reservation/docs/ReservationAPI.kt b/src/main/kotlin/roomescape/reservation/docs/ReservationAPI.kt index 8366e0d4..15ffcbb1 100644 --- a/src/main/kotlin/roomescape/reservation/docs/ReservationAPI.kt +++ b/src/main/kotlin/roomescape/reservation/docs/ReservationAPI.kt @@ -50,7 +50,7 @@ interface ReservationAPI { @ApiResponses(ApiResponse(responseCode = "200", useReturnTypeSchema = true)) fun findSummaryByMemberId( @User user: CurrentUserContext, - ): ResponseEntity> + ): ResponseEntity> @UserOnly @Operation(summary = "특정 예약에 대한 상세 조회") diff --git a/src/main/kotlin/roomescape/reservation/web/ReservationController.kt b/src/main/kotlin/roomescape/reservation/web/ReservationController.kt index 30cc3c63..63970bf5 100644 --- a/src/main/kotlin/roomescape/reservation/web/ReservationController.kt +++ b/src/main/kotlin/roomescape/reservation/web/ReservationController.kt @@ -57,8 +57,8 @@ class ReservationController( @GetMapping("/summary") override fun findSummaryByMemberId( @User user: CurrentUserContext, - ): ResponseEntity> { - val response = reservationService.findUserSummaryReservation(user) + ): ResponseEntity> { + val response = reservationService.findAllUserReservationOverview(user) return ResponseEntity.ok(CommonApiResponse(response)) } diff --git a/src/main/kotlin/roomescape/reservation/web/ReservationDto.kt b/src/main/kotlin/roomescape/reservation/web/ReservationDto.kt index 0f6303ee..058b7f20 100644 --- a/src/main/kotlin/roomescape/reservation/web/ReservationDto.kt +++ b/src/main/kotlin/roomescape/reservation/web/ReservationDto.kt @@ -4,6 +4,7 @@ import jakarta.validation.constraints.NotEmpty import roomescape.payment.web.PaymentWithDetailResponse import roomescape.reservation.infrastructure.persistence.ReservationEntity import roomescape.reservation.infrastructure.persistence.ReservationStatus +import roomescape.schedule.web.ScheduleOverviewResponse import roomescape.user.web.UserContactResponse import java.time.LocalDate import java.time.LocalDateTime @@ -34,16 +35,30 @@ data class PendingReservationCreateResponse( val id: Long ) -data class ReservationSummaryResponse( +data class ReservationOverviewResponse( val id: Long, + val storeName: String, val themeName: String, val date: LocalDate, - val startAt: LocalTime, + val startFrom: LocalTime, + val endAt: LocalTime, val status: ReservationStatus ) -data class ReservationSummaryListResponse( - val reservations: List +fun ReservationEntity.toOverviewResponse( + schedule: ScheduleOverviewResponse +) = ReservationOverviewResponse( + id = this.id, + storeName = schedule.storeName, + themeName = schedule.themeName, + date = schedule.date, + startFrom = schedule.startFrom, + endAt = schedule.endAt, + status = this.status +) + +data class ReservationOverviewListResponse( + val reservations: List ) data class ReservationDetailResponse( diff --git a/src/test/kotlin/roomescape/reservation/ReservationApiTest.kt b/src/test/kotlin/roomescape/reservation/ReservationApiTest.kt index a2de4f20..92dc8da4 100644 --- a/src/test/kotlin/roomescape/reservation/ReservationApiTest.kt +++ b/src/test/kotlin/roomescape/reservation/ReservationApiTest.kt @@ -21,7 +21,7 @@ import roomescape.reservation.infrastructure.persistence.ReservationRepository import roomescape.reservation.infrastructure.persistence.ReservationStatus import roomescape.reservation.web.MostReservedThemeIdListResponse import roomescape.reservation.web.ReservationCancelRequest -import roomescape.reservation.web.ReservationSummaryResponse +import roomescape.reservation.web.ReservationOverviewResponse import roomescape.schedule.infrastructure.persistence.ScheduleEntity import roomescape.schedule.infrastructure.persistence.ScheduleRepository import roomescape.schedule.infrastructure.persistence.ScheduleStatus @@ -349,7 +349,7 @@ class ReservationApiTest( ) } ).also { response -> - ResponseParser.parseListResponse( + ResponseParser.parseListResponse( response.extract().path("data.reservations") ).forEach { it.status shouldBe ReservationStatus.CONFIRMED