package roomescape.schedule.docs import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.responses.ApiResponse import io.swagger.v3.oas.annotations.responses.ApiResponses import jakarta.validation.Valid import org.springframework.format.annotation.DateTimeFormat import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestParam import roomescape.auth.web.support.Admin import roomescape.auth.web.support.LoginRequired import roomescape.common.dto.response.CommonApiResponse import roomescape.schedule.web.* import java.time.LocalDate interface ScheduleAPI { @LoginRequired @Operation(summary = "입력된 날짜에 가능한 테마 목록 조회", tags = ["로그인이 필요한 API"]) @ApiResponses(ApiResponse(responseCode = "200", description = "입력된 날짜에 가능한 테마 목록 조회", useReturnTypeSchema = true)) fun findAvailableThemes( @RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate ): ResponseEntity> @LoginRequired @Operation(summary = "입력된 날짜, 테마에 대한 모든 시간 조회", tags = ["로그인이 필요한 API"]) @ApiResponses( ApiResponse( responseCode = "200", description = "입력된 날짜, 테마에 대한 모든 시간 조회", useReturnTypeSchema = true ) ) fun findAllTime( @RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate, @RequestParam("themeId") themeId: Long ): ResponseEntity> @Admin @Operation(summary = "일정 상세 조회", tags = ["관리자 로그인이 필요한 API"]) @ApiResponses(ApiResponse(responseCode = "200", description = "감사 정보를 포함하여 일정 상세 조회", useReturnTypeSchema = true)) fun findScheduleDetail( @PathVariable("id") id: Long ): ResponseEntity> @Admin @Operation(summary = "일정 생성", tags = ["관리자 로그인이 필요한 API"]) @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) fun createSchedule( @Valid @RequestBody request: ScheduleCreateRequest ): ResponseEntity> @Admin @Operation(summary = "일정 수정", tags = ["관리자 로그인이 필요한 API"]) @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) fun updateSchedule( @PathVariable("id") id: Long, @Valid @RequestBody request: ScheduleUpdateRequest ): ResponseEntity> @Admin @Operation(summary = "일정 삭제", tags = ["관리자 로그인이 필요한 API"]) @ApiResponses(ApiResponse(responseCode = "204", description = "성공", useReturnTypeSchema = true)) fun deleteSchedule( @PathVariable("id") id: Long ): ResponseEntity> }