package roomescape.reservation.business import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import roomescape.reservation.implement.ReservationFinder import roomescape.reservation.infrastructure.persistence.ReservationStatus import roomescape.reservation.web.MyReservationRetrieveListResponse import roomescape.reservation.web.ReservationRetrieveListResponse import roomescape.reservation.web.toRetrieveListResponse import java.time.LocalDate private val log = KotlinLogging.logger {} @Service @Transactional(readOnly = true) class ReservationQueryService( private val reservationFinder: ReservationFinder ) { fun findReservations(): ReservationRetrieveListResponse { log.info { "[ReservationService.findReservations] 시작" } return reservationFinder.findAllByStatuses(*ReservationStatus.confirmedStatus()) .toRetrieveListResponse() .also { log.info { "[ReservationService.findReservations] ${it.reservations.size}개의 예약 조회 완료" } } } fun findAllWaiting(): ReservationRetrieveListResponse { log.info { "[ReservationService.findAllWaiting] 시작" } return reservationFinder.findAllByStatuses(ReservationStatus.WAITING) .toRetrieveListResponse() .also { log.info { "[ReservationService.findAllWaiting] ${it.reservations.size}개의 대기 조회 완료" } } } fun findReservationsByMemberId(memberId: Long): MyReservationRetrieveListResponse { log.info { "[ReservationService.findReservationsByMemberId] 시작: memberId=$memberId" } return reservationFinder.findAllByMemberId(memberId) .toRetrieveListResponse() .also { log.info { "[ReservationService.findReservationsByMemberId] ${it.reservations.size}개의 예약 조회 완료: memberId=$memberId" } } } fun searchReservations( themeId: Long?, memberId: Long?, startFrom: LocalDate?, endAt: LocalDate?, ): ReservationRetrieveListResponse { log.info { "[ReservationService.searchReservations] 시작: themeId=$themeId, memberId=$memberId, dateFrom=$startFrom, dateTo=$endAt" } return reservationFinder.searchReservations(themeId, memberId, startFrom, endAt) .toRetrieveListResponse() .also { log.info { "[ReservationService.searchReservations] ${it.reservations.size}개의 예약 조회 완료: themeId=$themeId, memberId=$memberId, dateFrom=$startFrom, dateTo=$endAt" } } } }