package roomescape.reservation.web import jakarta.validation.Valid import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* import roomescape.auth.web.support.CurrentUser import roomescape.common.dto.CurrentUserContext import roomescape.common.dto.response.CommonApiResponse import roomescape.reservation.business.ReservationService import roomescape.reservation.docs.ReservationAPI @RestController class ReservationController( private val reservationService: ReservationService ) : ReservationAPI { @GetMapping("/reservations/popular-themes") override fun findMostReservedThemeIds( @RequestParam count: Int ): ResponseEntity> { val response = reservationService.findMostReservedThemeIds(count) return ResponseEntity.ok(CommonApiResponse(response)) } @PostMapping("/reservations/pending") override fun createPendingReservation( @CurrentUser user: CurrentUserContext, @Valid @RequestBody request: PendingReservationCreateRequest ): ResponseEntity> { val response = reservationService.createPendingReservation(user, request) return ResponseEntity.ok(CommonApiResponse(response)) } @PostMapping("/reservations/{id}/confirm") override fun confirmReservation( @PathVariable("id") id: Long ): ResponseEntity> { reservationService.confirmReservation(id) return ResponseEntity.ok().body(CommonApiResponse()) } @PostMapping("/reservations/{reservationId}/cancel") override fun cancelReservation( @CurrentUser user: CurrentUserContext, @PathVariable reservationId: Long, @Valid @RequestBody request: ReservationCancelRequest ): ResponseEntity> { reservationService.cancelReservation(user, reservationId, request) return ResponseEntity.ok().body(CommonApiResponse()) } @GetMapping("/reservations/summary") override fun findSummaryByMemberId( @CurrentUser user: CurrentUserContext, ): ResponseEntity> { val response = reservationService.findUserSummaryReservation(user) return ResponseEntity.ok(CommonApiResponse(response)) } @GetMapping("/reservations/{id}/detail") override fun findDetailById( @PathVariable("id") id: Long ): ResponseEntity> { val response = reservationService.findDetailById(id) return ResponseEntity.ok(CommonApiResponse(response)) } }