package roomescape.reservation.business import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import roomescape.payment.business.PaymentService import roomescape.payment.infrastructure.client.PaymentApproveResponse import roomescape.payment.web.PaymentCancelRequest import roomescape.payment.web.PaymentCancelResponse import roomescape.reservation.infrastructure.persistence.ReservationEntity import roomescape.reservation.web.ReservationCreateWithPaymentRequest import roomescape.reservation.web.ReservationRetrieveResponse import java.time.OffsetDateTime @Service @Transactional class ReservationWithPaymentService( private val reservationService: ReservationService, private val paymentService: PaymentService ) { fun addReservationWithPayment( request: ReservationCreateWithPaymentRequest, paymentInfo: PaymentApproveResponse, memberId: Long ): ReservationRetrieveResponse { val reservation: ReservationEntity = reservationService.addReservation(request, memberId) return paymentService.createPayment(paymentInfo, reservation) .reservation } fun saveCanceledPayment( cancelInfo: PaymentCancelResponse, approvedAt: OffsetDateTime, paymentKey: String ) { paymentService.createCanceledPayment(cancelInfo, approvedAt, paymentKey) } fun removeReservationWithPayment( reservationId: Long, memberId: Long ): PaymentCancelRequest { val paymentCancelRequest = paymentService.createCanceledPaymentByReservationId(reservationId) reservationService.removeReservationById(reservationId, memberId) return paymentCancelRequest } @Transactional(readOnly = true) fun isNotPaidReservation(reservationId: Long): Boolean = !paymentService.isReservationPaid(reservationId) fun updateCanceledTime( paymentKey: String, canceledAt: OffsetDateTime ) { paymentService.updateCanceledTime(paymentKey, canceledAt) } }