generated from pricelees/issue-pr-template
[#39] '시간' -> '일정' 스키마 변경으로 테마별 시간 지정 #40
69
src/main/kotlin/roomescape/schedule/docs/ScheduleAPI.kt
Normal file
69
src/main/kotlin/roomescape/schedule/docs/ScheduleAPI.kt
Normal file
@ -0,0 +1,69 @@
|
||||
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<CommonApiResponse<AvailableThemeIdListResponse>>
|
||||
|
||||
@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<CommonApiResponse<ScheduleRetrieveListResponse>>
|
||||
|
||||
@Admin
|
||||
@Operation(summary = "일정 상세 조회", tags = ["관리자 로그인이 필요한 API"])
|
||||
@ApiResponses(ApiResponse(responseCode = "200", description = "감사 정보를 포함하여 일정 상세 조회", useReturnTypeSchema = true))
|
||||
fun findScheduleDetail(
|
||||
@PathVariable("id") id: Long
|
||||
): ResponseEntity<CommonApiResponse<ScheduleDetailRetrieveResponse>>
|
||||
|
||||
@Admin
|
||||
@Operation(summary = "일정 생성", tags = ["관리자 로그인이 필요한 API"])
|
||||
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
|
||||
fun createSchedule(
|
||||
@Valid @RequestBody request: ScheduleCreateRequest
|
||||
): ResponseEntity<CommonApiResponse<ScheduleCreateResponse>>
|
||||
|
||||
@Admin
|
||||
@Operation(summary = "일정 수정", tags = ["관리자 로그인이 필요한 API"])
|
||||
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
|
||||
fun updateSchedule(
|
||||
@PathVariable("id") id: Long,
|
||||
@Valid @RequestBody request: ScheduleUpdateRequest
|
||||
): ResponseEntity<CommonApiResponse<Unit>>
|
||||
|
||||
@Admin
|
||||
@Operation(summary = "일정 삭제", tags = ["관리자 로그인이 필요한 API"])
|
||||
@ApiResponses(ApiResponse(responseCode = "204", description = "성공", useReturnTypeSchema = true))
|
||||
fun deleteSchedule(
|
||||
@PathVariable("id") id: Long
|
||||
): ResponseEntity<CommonApiResponse<Unit>>
|
||||
}
|
||||
@ -0,0 +1,71 @@
|
||||
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<CommonApiResponse<AvailableThemeIdListResponse>> {
|
||||
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<CommonApiResponse<ScheduleRetrieveListResponse>> {
|
||||
val response = scheduleService.findSchedules(date, themeId)
|
||||
|
||||
return ResponseEntity.ok(CommonApiResponse(response))
|
||||
}
|
||||
|
||||
@GetMapping("/schedules/{id}")
|
||||
override fun findScheduleDetail(
|
||||
@PathVariable("id") id: Long
|
||||
): ResponseEntity<CommonApiResponse<ScheduleDetailRetrieveResponse>> {
|
||||
val response = scheduleService.findDetail(id)
|
||||
|
||||
return ResponseEntity.ok(CommonApiResponse(response))
|
||||
}
|
||||
|
||||
@PostMapping("/schedules")
|
||||
override fun createSchedule(
|
||||
@Valid @RequestBody request: ScheduleCreateRequest
|
||||
): ResponseEntity<CommonApiResponse<ScheduleCreateResponse>> {
|
||||
val response = scheduleService.createSchedule(request)
|
||||
|
||||
return ResponseEntity.ok(CommonApiResponse(response))
|
||||
}
|
||||
|
||||
@PatchMapping("/schedules/{id}")
|
||||
override fun updateSchedule(
|
||||
@PathVariable("id") id: Long,
|
||||
@Valid @RequestBody request: ScheduleUpdateRequest
|
||||
): ResponseEntity<CommonApiResponse<Unit>> {
|
||||
scheduleService.updateSchedule(id, request)
|
||||
|
||||
return ResponseEntity.ok(CommonApiResponse(Unit))
|
||||
}
|
||||
|
||||
@DeleteMapping("/schedules/{id}")
|
||||
override fun deleteSchedule(
|
||||
@PathVariable("id") id: Long
|
||||
): ResponseEntity<CommonApiResponse<Unit>> {
|
||||
scheduleService.deleteSchedule(id)
|
||||
|
||||
return ResponseEntity.noContent().build()
|
||||
}
|
||||
}
|
||||
65
src/main/kotlin/roomescape/schedule/web/ScheduleDto.kt
Normal file
65
src/main/kotlin/roomescape/schedule/web/ScheduleDto.kt
Normal file
@ -0,0 +1,65 @@
|
||||
package roomescape.schedule.web
|
||||
|
||||
import roomescape.schedule.infrastructure.persistence.ScheduleEntity
|
||||
import roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalDateTime
|
||||
import java.time.LocalTime
|
||||
|
||||
data class AvailableThemeIdListResponse(
|
||||
val themeIds: List<Long>
|
||||
)
|
||||
|
||||
fun List<ScheduleEntity>.toThemeIdListResponse() = AvailableThemeIdListResponse(this.map { it.themeId })
|
||||
|
||||
data class ScheduleRetrieveResponse(
|
||||
val id: Long,
|
||||
val time: LocalTime,
|
||||
val status: ScheduleStatus
|
||||
)
|
||||
|
||||
data class ScheduleRetrieveListResponse(
|
||||
val schedules: List<ScheduleRetrieveResponse>
|
||||
)
|
||||
|
||||
fun List<ScheduleEntity>.toRetrieveListResponse() = ScheduleRetrieveListResponse(
|
||||
this.map { ScheduleRetrieveResponse(it.id, it.time, it.status) }
|
||||
)
|
||||
|
||||
data class ScheduleCreateRequest(
|
||||
val date: LocalDate,
|
||||
val time: LocalTime,
|
||||
|
||||
val themeId: Long
|
||||
)
|
||||
|
||||
data class ScheduleCreateResponse(
|
||||
val id: Long
|
||||
)
|
||||
|
||||
data class ScheduleUpdateRequest(
|
||||
val time: LocalTime? = null,
|
||||
val status: ScheduleStatus? = null
|
||||
)
|
||||
|
||||
data class ScheduleDetailRetrieveResponse(
|
||||
val id: Long,
|
||||
val date: LocalDate,
|
||||
val time: LocalTime,
|
||||
val status: ScheduleStatus,
|
||||
val createdAt: LocalDateTime,
|
||||
val createdBy: String,
|
||||
val updatedAt: LocalDateTime,
|
||||
val updatedBy: String,
|
||||
)
|
||||
|
||||
fun ScheduleEntity.toDetailRetrieveResponse(createdBy: String, updatedBy: String) = ScheduleDetailRetrieveResponse(
|
||||
id = this.id,
|
||||
date = this.date,
|
||||
time = this.time,
|
||||
status = this.status,
|
||||
createdAt = this.createdAt,
|
||||
createdBy = createdBy,
|
||||
updatedAt = this.updatedAt,
|
||||
updatedBy = updatedBy
|
||||
)
|
||||
Loading…
x
Reference in New Issue
Block a user