refactor: 예약 조회와 같은 payload를 가진 예약 성공 응답 DTO 추가

This commit is contained in:
이상진 2025-08-05 21:45:21 +09:00
parent 4cd0436c84
commit 52a6abef79
5 changed files with 49 additions and 10 deletions

View File

@ -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)

View File

@ -74,7 +74,7 @@ interface ReservationAPI {
fun createReservationWithPayment(
@Valid @RequestBody reservationCreateWithPaymentRequest: ReservationCreateWithPaymentRequest,
@MemberId @Parameter(hidden = true) memberId: Long
): ResponseEntity<CommonApiResponse<ReservationRetrieveResponse>>
): ResponseEntity<CommonApiResponse<ReservationCreateResponse>>
@Admin
@Operation(summary = "관리자 예약 추가", tags = ["관리자 로그인이 필요한 API"])

View File

@ -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}" }

View File

@ -79,19 +79,19 @@ class ReservationController(
override fun createReservationWithPayment(
@Valid @RequestBody reservationCreateWithPaymentRequest: ReservationCreateWithPaymentRequest,
@MemberId @Parameter(hidden = true) memberId: Long
): ResponseEntity<CommonApiResponse<ReservationRetrieveResponse>> {
): ResponseEntity<CommonApiResponse<ReservationCreateResponse>> {
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,

View File

@ -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