package roomescape.reservation.business import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import jakarta.transaction.Transactional import org.springframework.stereotype.Service import roomescape.reservation.implement.ReservationFinder import roomescape.reservation.implement.ReservationWriter import roomescape.reservation.infrastructure.persistence.ReservationEntity import roomescape.reservation.infrastructure.persistence.ReservationStatus import roomescape.reservation.web.* private val log: KLogger = KotlinLogging.logger {} @Service @Transactional class ReservationWriteService( private val reservationFinder: ReservationFinder, private val reservationWriter: ReservationWriter ) { fun createReservationWithPayment( request: ReservationCreateWithPaymentRequest, memberId: Long ): ReservationEntity { log.debug { "[ReservationCommandService.createReservationByAdmin] 시작: date=${request.date}, timeId=${request.timeId}, themeId=${request.themeId}, memberId=${memberId}" } val created: ReservationEntity = reservationWriter.create( date = request.date, timeId = request.timeId, themeId = request.themeId, status = ReservationStatus.CONFIRMED, memberId = memberId, requesterId = memberId ) return created.also { log.info { "[ReservationCommandService.createReservationByAdmin] 완료: reservationId=${it.id}" } } } fun createReservationByAdmin( request: AdminReservationCreateRequest, memberId: Long ): ReservationCreateResponse { log.debug { "[ReservationCommandService.createReservationByAdmin] 시작: date=${request.date}, timeId=${request.timeId}, themeId=${request.themeId}, memberId=${request.memberId} by adminId=${memberId}" } val created: ReservationEntity = reservationWriter.create( date = request.date, timeId = request.timeId, themeId = request.themeId, status = ReservationStatus.CONFIRMED_PAYMENT_REQUIRED, memberId = request.memberId, requesterId = memberId ) return created.toCreateResponse() .also { log.info { "[ReservationCommandService.createReservationByAdmin] 관리자 예약 추가 완료: reservationId=${it.id}" } } } fun createWaiting(request: WaitingCreateRequest, memberId: Long): ReservationCreateResponse { log.debug { "[ReservationCommandService.createWaiting] 시작: date=${request.date}, timeId=${request.timeId}, themeId=${request.themeId}, memberId=${memberId}" } val created: ReservationEntity = reservationWriter.create( date = request.date, timeId = request.timeId, themeId = request.themeId, status = ReservationStatus.WAITING, memberId = memberId, requesterId = memberId ) return created.toCreateResponse() .also { log.info { "[ReservationCommandService.createWaiting] 완료: reservationId=${it.id}" } } } fun deleteReservation(reservationId: Long, memberId: Long) { log.debug { "[ReservationCommandService.deleteReservation] 시작: reservationId=${reservationId}, memberId=$memberId" } val reservation: ReservationEntity = reservationFinder.findById(reservationId) reservationWriter.deleteConfirmed(reservation, requesterId = memberId) .also { log.info { "[ReservationCommandService.deleteReservation] 완료: reservationId=${reservationId}" } } } fun confirmWaiting(reservationId: Long, memberId: Long) { log.debug { "[ReservationCommandService.confirmWaiting] 시작: reservationId=$reservationId (by adminId=$memberId)" } reservationWriter.confirm(reservationId) .also { log.info { "[ReservationCommandService.confirmWaiting] 완료: reservationId=$reservationId" } } } fun deleteWaiting(reservationId: Long, memberId: Long) { log.debug { "[ReservationCommandService.deleteWaiting] 시작: reservationId=$reservationId (by adminId=$memberId)" } val reservation: ReservationEntity = reservationFinder.findById(reservationId) reservationWriter.deleteWaiting(reservation, requesterId = memberId) .also { log.info { "[ReservationCommandService.deleteWaiting] 완료: reservationId=$reservationId" } } } }