feat : 수강신청 도메인 구성

This commit is contained in:
donghyeon-ka
2026-09-18 15:20:54 +09:00
parent 3e33388e02
commit 70d71008c6
61 changed files with 2835 additions and 258 deletions
@@ -1,38 +1,70 @@
package com.study.course_registration.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
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 com.study.course_registration.dto.RequestDto;
import com.study.course_registration.dto.ResponseDto;
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
@RequestMapping ("/api/v1")
@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("/course-register")
@Operation(summary = "Register a course",
description = "Registers a new course with the provided details.")
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
@Operation(summary = "수강신청")
@ApiResponses({
@ApiResponse (responseCode = "200", description = "Course registered successfully"),
@ApiResponse (responseCode = "400", description = "Invalid request data")
@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 ResponseDto registerCourse(@Validated RequestDto requestDto) {
return courseRegistrationService.registerCourse(requestDto);
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);
}
}