From aaa051c7f72bd5c30e0417bf0ad6c8c6daaeb0dd Mon Sep 17 00:00:00 2001 From: jieun Date: Tue, 20 Oct 2026 20:56:30 +0900 Subject: [PATCH] Complete quiz attempt service with result and history queries --- .../web/rest/ExamAttemptResource.java | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/questionbank/web/rest/ExamAttemptResource.java b/src/main/java/com/example/questionbank/web/rest/ExamAttemptResource.java index aa60695..294cb44 100644 --- a/src/main/java/com/example/questionbank/web/rest/ExamAttemptResource.java +++ b/src/main/java/com/example/questionbank/web/rest/ExamAttemptResource.java @@ -3,6 +3,13 @@ package com.example.questionbank.web.rest; import com.example.questionbank.repository.ExamAttemptRepository; import com.example.questionbank.service.ExamAttemptService; import com.example.questionbank.service.dto.ExamAttemptDTO; +import com.example.questionbank.service.quiz.QuizAttemptService; +import com.example.questionbank.web.rest.dto.ExamAttemptStartResult; +import com.example.questionbank.web.rest.dto.ExamAttemptSummary; +import com.example.questionbank.web.rest.dto.ExamQuestionView; +import com.example.questionbank.web.rest.dto.ExamResult; +import com.example.questionbank.web.rest.dto.StartExamRequest; +import com.example.questionbank.web.rest.dto.SubmitExamRequest; import com.example.questionbank.web.rest.errors.BadRequestAlertException; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; @@ -17,7 +24,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import tech.jhipster.web.util.HeaderUtil; @@ -31,6 +40,8 @@ import tech.jhipster.web.util.ResponseUtil; @RequestMapping("/api/exam-attempts") public class ExamAttemptResource { + private final QuizAttemptService quizAttemptService; + private static final Logger LOG = LoggerFactory.getLogger(ExamAttemptResource.class); private static final String ENTITY_NAME = "examAttempt"; @@ -42,9 +53,14 @@ public class ExamAttemptResource { private final ExamAttemptRepository examAttemptRepository; - public ExamAttemptResource(ExamAttemptService examAttemptService, ExamAttemptRepository examAttemptRepository) { + public ExamAttemptResource( + ExamAttemptService examAttemptService, + ExamAttemptRepository examAttemptRepository, + QuizAttemptService quizAttemptService + ) { this.examAttemptService = examAttemptService; this.examAttemptRepository = examAttemptRepository; + this.quizAttemptService = quizAttemptService; } /** @@ -185,4 +201,43 @@ public class ExamAttemptResource { .headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())) .build(); } + + // 1. 시험 응시 시작 + @PostMapping("/start") + public ResponseEntity startExam(@Valid @RequestBody StartExamRequest request, Authentication authentication) { + ExamAttemptStartResult result = quizAttemptService.start(request.subjectId(), authentication.getName()); + + return ResponseEntity.status(HttpStatus.CREATED).body(result); + } + + // 2. 시험 문제 조회 + @GetMapping("/{attemptId}/questions") + public ResponseEntity> getExamQuestions( + @PathVariable("attemptId") Long attemptId, + Authentication authentication + ) { + return ResponseEntity.ok(quizAttemptService.getQuestions(attemptId, authentication.getName())); + } + + // 3. 답안 제출 및 자동 채점 + @PostMapping("/{attemptId}/submit") + public ResponseEntity submitExam( + @PathVariable("attemptId") Long attemptId, + @Valid @RequestBody SubmitExamRequest request, + Authentication authentication + ) { + return ResponseEntity.ok(quizAttemptService.submit(attemptId, authentication.getName(), request)); + } + + // 4. 제출된 시험 결과 조회 + @GetMapping("/{attemptId}/result") + public ResponseEntity getExamResult(@PathVariable("attemptId") Long attemptId, Authentication authentication) { + return ResponseEntity.ok(quizAttemptService.getResult(attemptId, authentication.getName())); + } + + // 5. 내 응시 이력 조회 + @GetMapping("/my") + public ResponseEntity> getMyExamAttempts(Authentication authentication) { + return ResponseEntity.ok(quizAttemptService.getMyAttempts(authentication.getName())); + } }