package com.study.course_registration.controller; import org.springframework.http.HttpStatus; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.study.course_registration.dto.registration.CourseRegistrationRequest; import com.study.course_registration.dto.registration.CourseRegistrationResponse; import com.study.course_registration.dto.registration.RegistrationListResponse; import com.study.course_registration.service.CourseRegistrationService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @RestController @Validated @RequestMapping("/api/v1/users/{userId}/registrations") @Tag(name = "Registrations", description = "수강신청/조회/취소 API") public class CourseRegistrationController { private final CourseRegistrationService courseRegistrationService; public CourseRegistrationController(CourseRegistrationService courseRegistrationService) { this.courseRegistrationService = courseRegistrationService; } @PostMapping @ResponseStatus(HttpStatus.CREATED) @Operation(summary = "수강신청") @ApiResponses({ @ApiResponse(responseCode = "201", description = "신청 성공"), @ApiResponse(responseCode = "403", description = "학년 또는 역할 제한", content = @Content), @ApiResponse(responseCode = "404", description = "사용자 또는 강의 없음", content = @Content), @ApiResponse(responseCode = "409", description = "기간/중복/시간표/학점/정원 충돌", content = @Content), @ApiResponse(responseCode = "503", description = "락 대기 타임아웃", content = @Content) }) public CourseRegistrationResponse register( @PathVariable String userId, @Valid @RequestBody CourseRegistrationRequest request) { return courseRegistrationService.register(userId, request); } @GetMapping @Operation(summary = "내 수강신청 목록 조회") public RegistrationListResponse getRegistrations( @PathVariable String userId, @RequestParam(required = false) String semesterId) { return courseRegistrationService.getRegistrations(userId, semesterId); } @DeleteMapping("/{registrationId}") @ResponseStatus(HttpStatus.NO_CONTENT) @Operation(summary = "수강신청 취소") public void cancel( @PathVariable String userId, @PathVariable String registrationId) { courseRegistrationService.cancel(userId, registrationId); } }