Skip to content
Closed
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

}
72 changes: 72 additions & 0 deletions resource-server/src/main/java/com/example/web/QnAController.java
Original file line number Diff line number Diff line change
@@ -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<Object> getRandomQuestion() {
List<Question> 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<Object> 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);
}
}
Original file line number Diff line number Diff line change
@@ -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<Object> getTestProgress(@PathVariable Long userId) {
Optional<TestProgress> 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<Object> 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<Map<String, Object>> getParticipantCount() {
long count = participantRepository.count();
return ResponseEntity.ok(Map.of(
"status", 200,
"participantCount", count
));
}
}
Loading