refactor: ScheduleAPI 인터페이스를 각 권한 타입별로 분리

This commit is contained in:
이상진 2025-09-16 22:06:06 +09:00
parent a6d028de45
commit 4e13735d5f

View File

@ -9,37 +9,59 @@ import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestParam
import roomescape.admin.infrastructure.persistence.AdminType
import roomescape.admin.infrastructure.persistence.Privilege import roomescape.admin.infrastructure.persistence.Privilege
import roomescape.auth.web.support.AdminOnly import roomescape.auth.web.support.AdminOnly
import roomescape.auth.web.support.Public import roomescape.auth.web.support.Public
import roomescape.auth.web.support.UserOnly import roomescape.auth.web.support.UserOnly
import roomescape.common.dto.AuditInfo
import roomescape.common.dto.response.CommonApiResponse import roomescape.common.dto.response.CommonApiResponse
import roomescape.schedule.web.* import roomescape.schedule.web.*
import java.time.LocalDate import java.time.LocalDate
interface ScheduleAPI { interface AdminScheduleAPI {
@Public @AdminOnly(privilege = Privilege.READ_SUMMARY)
@Operation(summary = "입력된 날짜에 가능한 테마 목록 조회") @Operation(summary = "일정 검색", tags = ["관리자 로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "200", description = "입력된 날짜에 가능한 테마 목록 조회", useReturnTypeSchema = true)) @ApiResponses(ApiResponse(responseCode = "200", useReturnTypeSchema = true))
fun findAvailableThemes( fun searchSchedules(
@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate @PathVariable("storeId") storeId: Long,
): ResponseEntity<CommonApiResponse<AvailableThemeIdListResponse>> @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate?,
@RequestParam(required = false) themeId: Long?,
): ResponseEntity<CommonApiResponse<AdminScheduleSummaryListResponse>>
@Public @AdminOnly(privilege = Privilege.READ_DETAIL)
@Operation(summary = "입력된 날짜, 테마에 대한 모든 시간 조회") @Operation(summary = "일정 상세 조회", tags = ["관리자 로그인이 필요한 API"])
@ApiResponses( @ApiResponses(ApiResponse(responseCode = "200", useReturnTypeSchema = true))
ApiResponse( fun findScheduleAudit(
responseCode = "200", @PathVariable("id") id: Long
description = "입력된 날짜, 테마에 대한 모든 시간 조회", ): ResponseEntity<CommonApiResponse<AuditInfo>>
useReturnTypeSchema = true
)
)
fun findAllTime(
@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate,
@RequestParam("themeId") themeId: Long
): ResponseEntity<CommonApiResponse<ScheduleListByDateResponse>>
@AdminOnly(type = AdminType.STORE, privilege = Privilege.CREATE)
@Operation(summary = "일정 생성", tags = ["관리자 로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "200", useReturnTypeSchema = true))
fun createSchedule(
@PathVariable("storeId") storeId: Long,
@Valid @RequestBody request: ScheduleCreateRequest
): ResponseEntity<CommonApiResponse<ScheduleCreateResponse>>
@AdminOnly(type = AdminType.STORE, privilege = Privilege.UPDATE)
@Operation(summary = "일정 수정", tags = ["관리자 로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "200", useReturnTypeSchema = true))
fun updateSchedule(
@PathVariable("id") id: Long,
@Valid @RequestBody request: ScheduleUpdateRequest
): ResponseEntity<CommonApiResponse<Unit>>
@AdminOnly(type = AdminType.STORE, privilege = Privilege.DELETE)
@Operation(summary = "일정 삭제", tags = ["관리자 로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "204", useReturnTypeSchema = true))
fun deleteSchedule(
@PathVariable("id") id: Long
): ResponseEntity<CommonApiResponse<Unit>>
}
interface UserScheduleAPI {
@UserOnly @UserOnly
@Operation(summary = "일정을 Hold 상태로 변경", tags = ["로그인이 필요한 API"]) @Operation(summary = "일정을 Hold 상태로 변경", tags = ["로그인이 필요한 API"])
@ApiResponses( @ApiResponses(
@ -52,33 +74,14 @@ interface ScheduleAPI {
fun holdSchedule( fun holdSchedule(
@PathVariable("id") id: Long @PathVariable("id") id: Long
): ResponseEntity<CommonApiResponse<Unit>> ): ResponseEntity<CommonApiResponse<Unit>>
}
@AdminOnly(privilege = Privilege.READ_DETAIL)
@Operation(summary = "일정 상세 조회", tags = ["관리자 로그인이 필요한 API"]) interface PublicScheduleAPI {
@ApiResponses(ApiResponse(responseCode = "200", description = "감사 정보를 포함하여 일정 상세 조회", useReturnTypeSchema = true)) @Public
fun findScheduleDetail( @Operation(summary = "특정 날짜 + 매장의 일정 조회")
@PathVariable("id") id: Long @ApiResponses(ApiResponse(useReturnTypeSchema = true))
): ResponseEntity<CommonApiResponse<ScheduleDetailResponse>> fun getStoreSchedulesByDate(
@PathVariable("storeId") storeId: Long,
@AdminOnly(privilege = Privilege.CREATE) @RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate
@Operation(summary = "일정 생성", tags = ["관리자 로그인이 필요한 API"]) ): ResponseEntity<CommonApiResponse<ScheduleWithThemeListResponse>>
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
fun createSchedule(
@Valid @RequestBody request: ScheduleCreateRequest
): ResponseEntity<CommonApiResponse<ScheduleCreateResponse>>
@AdminOnly(privilege = Privilege.UPDATE)
@Operation(summary = "일정 수정", tags = ["관리자 로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
fun updateSchedule(
@PathVariable("id") id: Long,
@Valid @RequestBody request: ScheduleUpdateRequest
): ResponseEntity<CommonApiResponse<Unit>>
@AdminOnly(privilege = Privilege.DELETE)
@Operation(summary = "일정 삭제", tags = ["관리자 로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "204", description = "성공", useReturnTypeSchema = true))
fun deleteSchedule(
@PathVariable("id") id: Long
): ResponseEntity<CommonApiResponse<Unit>>
} }