package roomescape.schedule.web import jakarta.validation.Valid import org.springframework.format.annotation.DateTimeFormat import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* import roomescape.common.dto.response.CommonApiResponse import roomescape.schedule.business.ScheduleService import roomescape.schedule.docs.ScheduleAPI import java.time.LocalDate @RestController class ScheduleController( private val scheduleService: ScheduleService ) : ScheduleAPI { @GetMapping("/schedules/themes") override fun findAvailableThemes( @RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate ): ResponseEntity> { val response = scheduleService.findThemesByDate(date) return ResponseEntity.ok(CommonApiResponse(response)) } @GetMapping("/schedules") override fun findAllTime( @RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate, @RequestParam("themeId") themeId: Long ): ResponseEntity> { val response = scheduleService.findSchedules(date, themeId) return ResponseEntity.ok(CommonApiResponse(response)) } @GetMapping("/schedules/{id}") override fun findScheduleDetail( @PathVariable("id") id: Long ): ResponseEntity> { val response = scheduleService.findDetail(id) return ResponseEntity.ok(CommonApiResponse(response)) } @PostMapping("/schedules") override fun createSchedule( @Valid @RequestBody request: ScheduleCreateRequest ): ResponseEntity> { val response = scheduleService.createSchedule(request) return ResponseEntity.ok(CommonApiResponse(response)) } @PatchMapping("/schedules/{id}/hold") override fun holdSchedule( @PathVariable("id") id: Long ): ResponseEntity> { scheduleService.holdSchedule(id) return ResponseEntity.ok(CommonApiResponse()) } @PatchMapping("/schedules/{id}") override fun updateSchedule( @PathVariable("id") id: Long, @Valid @RequestBody request: ScheduleUpdateRequest ): ResponseEntity> { scheduleService.updateSchedule(id, request) return ResponseEntity.ok(CommonApiResponse(Unit)) } @DeleteMapping("/schedules/{id}") override fun deleteSchedule( @PathVariable("id") id: Long ): ResponseEntity> { scheduleService.deleteSchedule(id) return ResponseEntity.noContent().build() } }