diff --git a/src/main/kotlin/roomescape/reservation/business/ReservationWithPaymentService.kt b/src/main/kotlin/roomescape/reservation/business/ReservationWithPaymentService.kt index ed260498..03151e88 100644 --- a/src/main/kotlin/roomescape/reservation/business/ReservationWithPaymentService.kt +++ b/src/main/kotlin/roomescape/reservation/business/ReservationWithPaymentService.kt @@ -24,8 +24,9 @@ class ReservationWithPaymentService( request: ReservationCreateWithPaymentRequest, paymentInfo: PaymentApproveResponse, memberId: Long, - ): ReservationRetrieveResponse { - log.info { "[ReservationWithPaymentService.createReservationAndPayment] 예약 & 결제 정보 저장 시작: memberId=$memberId, paymentInfo=$paymentInfo" } + ): ReservationCreateResponse { + log.info { "[ReservationWithPaymentService.createReservationAndPayment] 예약 & 결제 정보 저장 시작: memberId=$memberId, paymentInfo=$approvedPaymentInfo" } + val reservation: ReservationEntity = reservationService.createConfirmedReservation(request, memberId) return paymentService.createPayment(paymentInfo, reservation) diff --git a/src/main/kotlin/roomescape/reservation/docs/ReservationAPI.kt b/src/main/kotlin/roomescape/reservation/docs/ReservationAPI.kt index d8187401..a2762c96 100644 --- a/src/main/kotlin/roomescape/reservation/docs/ReservationAPI.kt +++ b/src/main/kotlin/roomescape/reservation/docs/ReservationAPI.kt @@ -74,7 +74,7 @@ interface ReservationAPI { fun createReservationWithPayment( @Valid @RequestBody reservationCreateWithPaymentRequest: ReservationCreateWithPaymentRequest, @MemberId @Parameter(hidden = true) memberId: Long - ): ResponseEntity> + ): ResponseEntity> @Admin @Operation(summary = "관리자 예약 추가", tags = ["관리자 로그인이 필요한 API"]) diff --git a/src/main/kotlin/roomescape/reservation/implement/ReservationFinder.kt b/src/main/kotlin/roomescape/reservation/implement/ReservationFinder.kt index 5b1a6aaf..35fcd725 100644 --- a/src/main/kotlin/roomescape/reservation/implement/ReservationFinder.kt +++ b/src/main/kotlin/roomescape/reservation/implement/ReservationFinder.kt @@ -2,7 +2,10 @@ package roomescape.reservation.implement import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Component +import roomescape.reservation.exception.ReservationErrorCode +import roomescape.reservation.exception.ReservationException import roomescape.reservation.infrastructure.persistence.ReservationEntity import roomescape.reservation.infrastructure.persistence.ReservationRepository import roomescape.theme.infrastructure.persistence.ThemeEntity @@ -15,6 +18,16 @@ private val log: KLogger = KotlinLogging.logger {} class ReservationFinder( private val reservationRepository: ReservationRepository ) { + fun findById(id: Long): ReservationEntity { + log.debug { "[ReservationFinder.findById] 시작: id=$id" } + + return reservationRepository.findByIdOrNull(id) + ?.also { log.debug { "[ReservationFinder.findById] 완료: reservationId=$id, date:${it.date}, timeId:${it.time.id}, themeId:${it.theme.id}" } } + ?: run { + log.warn { "[ReservationFinder.findById] 조회 실패: reservationId=$id" } + throw ReservationException(ReservationErrorCode.RESERVATION_NOT_FOUND) + } + } fun isTimeReserved(time: TimeEntity): Boolean { log.debug { "[ReservationFinder.isTimeReserved] 시작: timeId=${time.id}, startAt=${time.startAt}" } diff --git a/src/main/kotlin/roomescape/reservation/web/ReservationController.kt b/src/main/kotlin/roomescape/reservation/web/ReservationController.kt index fcd0565e..6c4d5b74 100644 --- a/src/main/kotlin/roomescape/reservation/web/ReservationController.kt +++ b/src/main/kotlin/roomescape/reservation/web/ReservationController.kt @@ -79,19 +79,19 @@ class ReservationController( override fun createReservationWithPayment( @Valid @RequestBody reservationCreateWithPaymentRequest: ReservationCreateWithPaymentRequest, @MemberId @Parameter(hidden = true) memberId: Long - ): ResponseEntity> { + ): ResponseEntity> { val paymentRequest: PaymentApproveRequest = reservationCreateWithPaymentRequest.toPaymentApproveRequest() val paymentResponse: PaymentApproveResponse = paymentClient.confirm(paymentRequest) try { - val reservationRetrieveResponse: ReservationRetrieveResponse = + val response: ReservationCreateResponse = reservationWithPaymentService.createReservationAndPayment( reservationCreateWithPaymentRequest, paymentResponse, memberId ) - return ResponseEntity.created(URI.create("/reservations/${reservationRetrieveResponse.id}")) - .body(CommonApiResponse(reservationRetrieveResponse)) + return ResponseEntity.created(URI.create("/reservations/${response.id}")) + .body(CommonApiResponse(response)) } catch (e: Exception) { val cancelRequest = PaymentCancelRequest( paymentRequest.paymentKey, diff --git a/src/main/kotlin/roomescape/reservation/web/ReservationResponse.kt b/src/main/kotlin/roomescape/reservation/web/ReservationResponse.kt index adbbfe6c..0e13e670 100644 --- a/src/main/kotlin/roomescape/reservation/web/ReservationResponse.kt +++ b/src/main/kotlin/roomescape/reservation/web/ReservationResponse.kt @@ -13,6 +13,31 @@ import roomescape.time.web.toCreateResponse import java.time.LocalDate import java.time.LocalTime +data class ReservationCreateResponse( + val id: Long, + val date: LocalDate, + + @JsonProperty("member") + val member: MemberRetrieveResponse, + + @JsonProperty("time") + val time: TimeCreateResponse, + + @JsonProperty("theme") + val theme: ThemeRetrieveResponse, + + val status: ReservationStatus +) + +fun ReservationEntity.toCreateResponse() = ReservationCreateResponse( + id = this.id!!, + date = this.date, + member = this.member.toRetrieveResponse(), + time = this.time.toCreateResponse(), + theme = this.theme.toRetrieveResponse(), + status = this.status +) + data class MyReservationRetrieveResponse( val id: Long, val themeName: String, @@ -36,13 +61,13 @@ data class ReservationRetrieveResponse( val id: Long, val date: LocalDate, - @field:JsonProperty("member") + @JsonProperty("member") val member: MemberRetrieveResponse, - @field:JsonProperty("time") + @JsonProperty("time") val time: TimeCreateResponse, - @field:JsonProperty("theme") + @JsonProperty("theme") val theme: ThemeRetrieveResponse, val status: ReservationStatus