Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] #95 - 어제 푼 퀴즈 조회 API 구현 #96

Merged
merged 1 commit into from
Mar 21, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dgu.sw.domain.quiz.controller;

import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.YesterdayQuizResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizMainPageResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizSearchResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizReviewResponse;
@@ -93,4 +94,11 @@ public ApiResponse<QuizMainPageResponse> getQuizMainInfo(Authentication authenti
QuizMainPageResponse response = quizService.getQuizMainPageData(authentication.getName());
return ApiResponse.onSuccess(response);
}

@GetMapping("/yesterday")
@Operation(summary = "어제 푼 퀴즈 조회", description = "어제 푼 퀴즈 목록을 반환합니다.")
public ApiResponse<List<YesterdayQuizResponse>> getYesterdayQuizzes(Authentication authentication) {
List<YesterdayQuizResponse> response = quizService.getYesterdaySolvedQuizzes(authentication.getName());
return ApiResponse.onSuccess(response);
}
}
14 changes: 14 additions & 0 deletions src/main/java/dgu/sw/domain/quiz/converter/QuizConverter.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dgu.sw.domain.quiz.converter;

import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.YesterdayQuizResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizSearchResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizListResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizDetailResponse;
@@ -22,6 +23,7 @@ public static UserQuiz toUserQuiz(User user, Quiz quiz, boolean isCorrect) {
.isLocked(false)
.isReviewed(false)
.solvedDate(LocalDate.now())
.retriedToday(false)
.build();
}

@@ -94,4 +96,16 @@ public static QuizSearchResponse toQuizSearchResponse(Quiz quiz, boolean isLocke
.build();
}

public static YesterdayQuizResponse toYesterdayQuizResponse(
Quiz quiz,
boolean isInReviewList,
boolean retriedToday
) {
return YesterdayQuizResponse.builder()
.quizId(quiz.getQuizId())
.question(quiz.getQuestion())
.isInReviewList(isInReviewList)
.retriedToday(retriedToday)
.build();
}
}
9 changes: 9 additions & 0 deletions src/main/java/dgu/sw/domain/quiz/dto/QuizDTO.java
Original file line number Diff line number Diff line change
@@ -87,5 +87,14 @@ public static class QuizMainPageResponse {
private Double topPercentile;
private List<QuizListResponse> top5WrongQuizzes;
}

@Getter
@Builder
public static class YesterdayQuizResponse {
private Long quizId;
private String question;
private boolean isInReviewList;
private boolean retriedToday;
}
}
}
Original file line number Diff line number Diff line change
@@ -26,4 +26,7 @@ public interface UserQuizRepository extends JpaRepository<UserQuiz, Long> {
List<Quiz> findTop5MostWrongOnDate(@Param("date") LocalDate date);

boolean existsByUser_UserIdAndQuiz_QuizIdAndSolvedDate(Long userId, Long quizId, LocalDate solvedDate);

List<UserQuiz> findByUser_UserIdAndSolvedDate(Long userId, LocalDate solvedDate);

}
2 changes: 2 additions & 0 deletions src/main/java/dgu/sw/domain/quiz/service/QuizService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dgu.sw.domain.quiz.service;

import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.YesterdayQuizResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizMainPageResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizReviewResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizRequest.SubmitQuizRequest;
@@ -19,4 +20,5 @@ public interface QuizService {
List<QuizSearchResponse> searchQuizzes(String userId, String keyword);
List<QuizReviewResponse> getReviewList(String userId);
QuizMainPageResponse getQuizMainPageData(String userId);
List<YesterdayQuizResponse> getYesterdaySolvedQuizzes(String userId);
}
27 changes: 23 additions & 4 deletions src/main/java/dgu/sw/domain/quiz/service/QuizServiceImpl.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dgu.sw.domain.quiz.service;

import dgu.sw.domain.quiz.converter.QuizConverter;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.YesterdayQuizResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizMainPageResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizSearchResponse;
import dgu.sw.domain.quiz.dto.QuizDTO.QuizResponse.QuizReviewResponse;
@@ -133,7 +134,6 @@ public QuizResultResponse submitQuizAnswer(String userId, Long quizId, SubmitQui

if (existingUserQuiz != null) {
existingUserQuiz.updateCorrect(isCorrect);
existingUserQuiz.updateSolvedDate(LocalDate.now());

// retriedToday 체크
boolean solvedYesterday = userQuizRepository.existsByUser_UserIdAndQuiz_QuizIdAndSolvedDate(
@@ -147,9 +147,6 @@ public QuizResultResponse submitQuizAnswer(String userId, Long quizId, SubmitQui
User user = userRepository.findByUserId(Long.valueOf(userId));
UserQuiz userQuiz = QuizConverter.toUserQuiz(user, quiz, isCorrect);

userQuiz.updateSolvedDate(LocalDate.now());
userQuiz.updateRetriedToday(false); // retriedToday 기본값 false

userQuizRepository.save(userQuiz);
}

@@ -296,4 +293,26 @@ public QuizMainPageResponse getQuizMainPageData(String userId) {
.top5WrongQuizzes(top5Responses)
.build();
}

@Override
public List<YesterdayQuizResponse> getYesterdaySolvedQuizzes(String userId) {
Long uid = Long.valueOf(userId);
LocalDate yesterday = LocalDate.now().minusDays(1);

List<UserQuiz> solvedQuizzes = userQuizRepository.findByUser_UserIdAndSolvedDate(uid, yesterday);

if (solvedQuizzes.isEmpty()) {
throw new QuizException(ErrorStatus.QUIZ_SEARCH_NO_RESULTS);
}

return solvedQuizzes.stream()
.map(userQuiz -> {
Quiz quiz = userQuiz.getQuiz();
boolean isInReviewList = quizReviewListRepository.existsByUser_UserIdAndQuiz_QuizId(uid, quiz.getQuizId());
boolean retriedToday = Boolean.TRUE.equals(userQuiz.getRetriedToday());

return QuizConverter.toYesterdayQuizResponse(quiz, isInReviewList, retriedToday);
})
.collect(Collectors.toList());
}
}