diff --git a/resource-server/src/main/java/com/example/config/SwaggerConfig.java b/resource-server/src/main/java/com/example/config/SwaggerConfig.java index 661448a..76101f9 100644 --- a/resource-server/src/main/java/com/example/config/SwaggerConfig.java +++ b/resource-server/src/main/java/com/example/config/SwaggerConfig.java @@ -119,4 +119,21 @@ public GroupedOpenApi getPlayerApi() { .pathsToMatch("/api/player/**", "/api/queue/**") .build(); } + + @Bean + public GroupedOpenApi getQnAAPI() { + return GroupedOpenApi.builder() + .group("질문 및 답변 관련") + .pathsToMatch("/api/questions/**", "/api/responses/**") + .build(); + } + + @Bean + public GroupedOpenApi getTestProgressAPI() { + return GroupedOpenApi.builder() + .group("진행 상황 및 참여 인원 관련") + .pathsToMatch("/api/test-progress/**", "/api/participants/**") + .build(); + } + } diff --git a/resource-server/src/main/java/com/example/web/QnAController.java b/resource-server/src/main/java/com/example/web/QnAController.java new file mode 100644 index 0000000..38ca693 --- /dev/null +++ b/resource-server/src/main/java/com/example/web/QnAController.java @@ -0,0 +1,72 @@ +package com.example.web; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.Random; + +@RestController +@RequestMapping("/api/questions") // 질문 관련 API 경로 +public class QnAController { + + @Autowired + private QuestionRepository questionRepository; + + @Autowired + private AnswerRepository answerRepository; + + // 랜덤 질문 제공 API + @Operation( + summary = "랜덤 질문 가져오기", + description = "데이터베이스에서 무작위로 선택된 질문을 제공합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "성공적으로 랜덤 질문 반환", + content = @Content(schema = @Schema(implementation = Question.class)))), + @ApiResponse(responseCode = "404", description = "질문 데이터 없음", + content = @Content(schema = @Schema(example = "{\"status\": 404, \"message\": \"질문 데이터가 없습니다.\"}")))) + }) + @GetMapping("/") // /questions 경로로 수정 + public ResponseEntity getRandomQuestion() { + List questions = questionRepository.findAll(); + if (questions.isEmpty()) { + return ResponseEntity.status(404).body(Map.of( + "status", 404, + "message", "질문 데이터가 없습니다." + )); + } + Question randomQuestion = questions.get(new Random().nextInt(questions.size())); + return ResponseEntity.ok(randomQuestion); + } + + // 답변 저장 API + @Operation( + summary = "답변 저장하기", + description = "사용자가 작성한 답변을 저장합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "답변 저장 완료", + content = @Content(schema = @Schema(implementation = Answer.class)))), + @ApiResponse(responseCode = "400", description = "잘못된 요청", + content = @Content(schema = @Schema(example = "{\"status\": 400, \"message\": \"잘못된 요청입니다.\"}")))) + }) + @PostMapping("/responses") // /responses 경로로 수정 + public ResponseEntity saveAnswer(@RequestBody Answer answer) { + if (answer == null || answer.getContent() == null || answer.getContent().isEmpty()) { + return ResponseEntity.badRequest().body(Map.of( + "status", 400, + "message", "잘못된 요청입니다. 답변 내용을 입력해주세요." + )); + } + Answer savedAnswer = answerRepository.save(answer); + return ResponseEntity.ok(savedAnswer); + } +} diff --git a/resource-server/src/main/java/com/example/web/TestProgressController.java b/resource-server/src/main/java/com/example/web/TestProgressController.java new file mode 100644 index 0000000..124f17d --- /dev/null +++ b/resource-server/src/main/java/com/example/web/TestProgressController.java @@ -0,0 +1,87 @@ +package com.example.web; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Optional; + +@RestController +@RequestMapping("/api/test-progress") // 진행 상황 관련 API 경로 +public class TestProgressController { + + @Autowired + private TestProgressRepository testProgressRepository; + + @Autowired + private ParticipantRepository participantRepository; + + // 현재 테스트 진행 상황 조회 API + @Operation( + summary = "현재 테스트 진행 상황 조회", + description = "사용자가 테스트를 어디까지 진행했는지 조회합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "진행 상황 반환", + content = @Content(schema = @Schema(implementation = TestProgress.class))), + @ApiResponse(responseCode = "404", description = "진행 상황 없음", + content = @Content(schema = @Schema(example = "{\"status\": 404, \"message\": \"진행 상황을 찾을 수 없습니다.\"}")))) + }) + @GetMapping("/{userId}") + public ResponseEntity getTestProgress(@PathVariable Long userId) { + Optional progress = testProgressRepository.findByUserId(userId); + return progress.map(ResponseEntity::ok).orElseGet(() -> + ResponseEntity.status(404).body(Map.of( + "status", 404, + "message", "진행 상황을 찾을 수 없습니다." + )) + ); + } + + // 현재 테스트 진행 상황 저장 API + @Operation( + summary = "현재 테스트 진행 상황 저장", + description = "사용자의 테스트 진행 상황을 저장합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "진행 상황 저장 완료", + content = @Content(schema = @Schema(implementation = TestProgress.class))), + @ApiResponse(responseCode = "400", description = "잘못된 요청", + content = @Content(schema = @Schema(example = "{\"status\": 400, \"message\": \"잘못된 요청입니다.\"}")))) + }) + @PostMapping("/") + public ResponseEntity saveTestProgress(@RequestBody TestProgress testProgress) { + if (testProgress == null || testProgress.getUserId() == null) { + return ResponseEntity.badRequest().body(Map.of( + "status", 400, + "message", "잘못된 요청입니다. 사용자 ID가 필요합니다." + )); + } + TestProgress savedProgress = testProgressRepository.save(testProgress); + return ResponseEntity.ok(savedProgress); + } + + // 참여 인원 카운팅 API + @Operation( + summary = "참여 인원 카운팅", + description = "이 테스트에 총 몇 명이 참여했는지 반환합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "참여 인원 수 반환", + content = @Content(schema = @Schema(type = "integer", format = "int64")))) + }) + @GetMapping("/participants/count") + public ResponseEntity> getParticipantCount() { + long count = participantRepository.count(); + return ResponseEntity.ok(Map.of( + "status", 200, + "participantCount", count + )); + } +}