diff --git a/src/main/java/com/example/cp_main_be/domain/realquiz/RealQuiz.java b/src/main/java/com/example/cp_main_be/domain/realquiz/RealQuiz.java index 89ba55c8..89c09d6a 100644 --- a/src/main/java/com/example/cp_main_be/domain/realquiz/RealQuiz.java +++ b/src/main/java/com/example/cp_main_be/domain/realquiz/RealQuiz.java @@ -2,7 +2,10 @@ import com.example.cp_main_be.domain.mission.quiz.enums.QuizType; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.*; +import org.hibernate.annotations.CreationTimestamp; + @Entity @Getter @@ -29,4 +32,9 @@ public class RealQuiz { @Column(name = "reward_point") private Long rewardPoints; + + @Column private Boolean isCompleted; + + @Column @CreationTimestamp private LocalDateTime createdAt; + } diff --git a/src/main/java/com/example/cp_main_be/domain/realquiz/dto/response/RealQuizAnswerResponseDTO.java b/src/main/java/com/example/cp_main_be/domain/realquiz/dto/response/RealQuizAnswerResponseDTO.java index 4e4988f5..962e2d6a 100644 --- a/src/main/java/com/example/cp_main_be/domain/realquiz/dto/response/RealQuizAnswerResponseDTO.java +++ b/src/main/java/com/example/cp_main_be/domain/realquiz/dto/response/RealQuizAnswerResponseDTO.java @@ -1,8 +1,6 @@ package com.example.cp_main_be.domain.realquiz.dto.response; import com.example.cp_main_be.domain.mission.quiz.enums.QuizType; -import com.example.cp_main_be.domain.realquiz.RealQuizOption; -import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -13,12 +11,13 @@ @NoArgsConstructor @AllArgsConstructor public class RealQuizAnswerResponseDTO { - private Long quizId; + private String quizQuestion; private QuizType quizType; private Integer selectedOptionNumber; // 사용자가 선택한 답안 번호 추가 private Integer answerNumber; private String answerDescription; private Boolean isCorrect; // 사용자 답안 정답 여부 - private List quizOptions; + private Boolean isCompleted; + } diff --git a/src/main/java/com/example/cp_main_be/domain/realquiz/dto/response/RealQuizResponseDTO.java b/src/main/java/com/example/cp_main_be/domain/realquiz/dto/response/RealQuizResponseDTO.java index bb9059b8..872412ca 100644 --- a/src/main/java/com/example/cp_main_be/domain/realquiz/dto/response/RealQuizResponseDTO.java +++ b/src/main/java/com/example/cp_main_be/domain/realquiz/dto/response/RealQuizResponseDTO.java @@ -17,6 +17,7 @@ public class RealQuizResponseDTO { private QuizType quizType; private Integer answerNumber; private String answerDescription; + private Boolean isCompleted; private List quizOptions; @Getter diff --git a/src/main/java/com/example/cp_main_be/domain/realquiz/presentation/RealQuizController.java b/src/main/java/com/example/cp_main_be/domain/realquiz/presentation/RealQuizController.java index 0035c2fd..9c8e8c86 100644 --- a/src/main/java/com/example/cp_main_be/domain/realquiz/presentation/RealQuizController.java +++ b/src/main/java/com/example/cp_main_be/domain/realquiz/presentation/RealQuizController.java @@ -41,15 +41,16 @@ public ApiResponse createUserQuiz( return ApiResponse.success(responseDTO); } - @GetMapping("/list") - @Operation(summary = "자신의 퀴즈 목록 조회 API") + + @GetMapping + @Operation(summary = "자신의 퀴즈 조회 API") public ApiResponse getRealQuiz( @AuthenticationPrincipal User user, @RequestParam QuizType quizType) { RealQuizResponseDTO responseDTO = realQuizService.getRealQuiz(user, quizType); return ApiResponse.success(responseDTO); } - @GetMapping("/{quizId}/answer") + @PostMapping("/{quizId}/answer") @Operation(summary = "퀴즈 정답 제출 API") public ApiResponse getRealQuizAnswer( @PathVariable Long quizId, @RequestBody RealQuizAnswerRequestDTO requestDTO) { diff --git a/src/main/java/com/example/cp_main_be/domain/realquiz/service/RealQuizService.java b/src/main/java/com/example/cp_main_be/domain/realquiz/service/RealQuizService.java index d437fa1b..d697071a 100644 --- a/src/main/java/com/example/cp_main_be/domain/realquiz/service/RealQuizService.java +++ b/src/main/java/com/example/cp_main_be/domain/realquiz/service/RealQuizService.java @@ -17,6 +17,7 @@ import com.example.cp_main_be.global.exception.QuizNotFoundException; import com.example.cp_main_be.global.exception.UserNotFoundException; import java.util.List; +import java.util.Random; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,6 +36,7 @@ public RealQuizResponseDTO createRealQuiz(RealQuizCreateRequestDTO requestDTO) { // 퀴즈 생성 RealQuiz realQuiz = RealQuiz.builder() + .isCompleted(false) .quizQuestion(requestDTO.getQuizQuestion()) .quizType(requestDTO.getQuizType()) .answerDescription(requestDTO.getAnswerDescription()) @@ -60,6 +62,7 @@ public RealQuizResponseDTO createRealQuiz(RealQuizCreateRequestDTO requestDTO) { List result = transformToRealQuizOptionResponseDTO(realQuizOptionList); return RealQuizResponseDTO.builder() + .isCompleted(realQuiz.getIsCompleted()) .quizId(realQuiz.getId()) .quizQuestion(realQuiz.getQuizQuestion()) .quizType(realQuiz.getQuizType()) @@ -100,7 +103,9 @@ public RealQuizResponseDTO getRealQuiz(User user, QuizType quizType) { if (userQuiz == null) { List realQuizList = realQuizRepostitory.findAllByQuizType(quizType); if (realQuizList == null) throw new QuizNotFoundException("불러올 퀴즈가 존재하지 않습니다"); - RealQuiz realQuiz = realQuizList.get(0); + Random random = new Random(); + int rand = random.nextInt(realQuizList.size()); + RealQuiz realQuiz = realQuizList.get(rand); // 할당한다. userQuiz = UserQuiz.builder().realQuiz(realQuiz).user(user).build(); @@ -128,13 +133,16 @@ public RealQuizAnswerResponseDTO getRealQuizAnswer( List realQuizOptionList = realQuizOptionRepository.findAllByRealQuiz(realQuiz); + realQuiz.setIsCompleted(true); + return RealQuizAnswerResponseDTO.builder() .answerDescription(realQuiz.getAnswerDescription()) .selectedOptionNumber(requestDTO.getSelectedOptionOrder()) .isCorrect(realQuiz.getAnswerNumber().equals(requestDTO.getSelectedOptionOrder())) + .isCompleted(true) + .answerNumber(realQuiz.getAnswerNumber()) .quizType(realQuiz.getQuizType()) .quizQuestion(realQuiz.getQuizQuestion()) - .quizOptions(realQuizOptionList) .build(); } @@ -150,6 +158,7 @@ private RealQuizResponseDTO transformToRealQuizResponseDTO(RealQuiz realQuiz) { .quizQuestion(realQuiz.getQuizQuestion()) .answerDescription(realQuiz.getAnswerDescription()) .quizOptions(result) + .isCompleted(realQuiz.getIsCompleted()) .build(); } diff --git a/src/main/java/com/example/cp_main_be/global/config/SecurityConfig.java b/src/main/java/com/example/cp_main_be/global/config/SecurityConfig.java index 7b98ce98..ccb96d2a 100644 --- a/src/main/java/com/example/cp_main_be/global/config/SecurityConfig.java +++ b/src/main/java/com/example/cp_main_be/global/config/SecurityConfig.java @@ -43,7 +43,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti "/swagger-resources/**", "/h2-console/**", "/error", - "/api/v1/realQuiz/*") + "/api/v1/realQuiz/**", + "/api/v1/realQuiz") .permitAll() // 회원가입 및 토큰 재발급은 인증 없이 허용 .requestMatchers("/api/v1/admin/**") .hasRole("ADMIN")