Skip to content
Merged
Show file tree
Hide file tree
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
23 changes: 23 additions & 0 deletions src/main/java/com/_1/spring_rest_api/entity/QuizSession.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@
import com._1.spring_rest_api.entity.base.BaseTimeEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "QUIZ_SESSION")
Expand All @@ -31,6 +34,10 @@ public class QuizSession extends BaseTimeEntity {
@JoinColumn(name = "quiz_id")
private CustomQuiz quiz;

@OneToMany(mappedBy = "quizSession", cascade = CascadeType.ALL)
@Builder.Default
private List<UserAnswer> userAnswers = new ArrayList<>();

private Integer currentQuestionIndex;

private Boolean completed;
Expand All @@ -53,6 +60,20 @@ public void changeQuiz(CustomQuiz quiz) {
}
}

public void addUserAnswer(UserAnswer userAnswer) {
this.userAnswers.add(userAnswer);
if (userAnswer.getQuizSession() != this) {
userAnswer.changeQuizSession(this);
}
}

public void removeUserAnswer(UserAnswer userAnswer) {
this.userAnswers.remove(userAnswer);
if (userAnswer.getQuizSession() == this) {
userAnswer.changeQuizSession(null);
}
}

public static QuizSession create(User user, CustomQuiz quiz) {
if (user == null) {
throw new IllegalArgumentException("사용자는 null이 될 수 없습니다");
Expand Down Expand Up @@ -80,12 +101,14 @@ public UserAnswer createAnswer(String userAnswerText) {
UserAnswer userAnswer = UserAnswer.builder()
.user(this.user)
.question(currentQuestion)
.quizSession(this)
.userAnswer(userAnswerText)
.isCorrect(isCorrect)
.attemptCount(1)
.answeredAt(LocalDateTime.now())
.build();

this.addUserAnswer(userAnswer);
currentQuestion.addUserAnswer(userAnswer);
this.user.addUserAnswer(userAnswer);

Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/_1/spring_rest_api/entity/UserAnswer.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ public class UserAnswer extends BaseTimeEntity {
@JoinColumn(name = "user_id")
private User user;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "quiz_session_id")
private QuizSession quizSession; // 추가

@Column(name = "user_answer", columnDefinition = "TEXT")
private String userAnswer;

Expand Down Expand Up @@ -58,4 +62,11 @@ public void changeQuestion(Question question) {
question.getUserAnswers().add(this);
}
}

public void changeQuizSession(QuizSession quizSession) {
this.quizSession = quizSession;
if (quizSession != null && !quizSession.getUserAnswers().contains(this)) {
quizSession.getUserAnswers().add(this);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,6 @@
@Repository
public interface UserAnswerRepository extends JpaRepository<UserAnswer, Long> {

/**
* 특정 사용자의 모든 답변을 조회합니다.
*
* @param userId 사용자 ID
* @return 사용자 답변 목록
*/
@Query("SELECT a FROM UserAnswer a WHERE a.user.id = :userId ORDER BY a.answeredAt DESC")
List<UserAnswer> findAllByUserId(@Param("userId") Long userId);


@Query("SELECT ua FROM UserAnswer ua WHERE ua.user.id = :userId AND ua.question.id IN :questionIds")
List<UserAnswer> findByUserIdAndQuestionIdIn(
@Param("userId") Long userId,
@Param("questionIds") Collection<Long> questionIds);
@Query("SELECT ua FROM UserAnswer ua WHERE ua.quizSession.id = :sessionId ORDER BY ua.answeredAt ASC")
List<UserAnswer> findByQuizSessionIdOrderByAnsweredAt(@Param("sessionId") Long sessionId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,30 +45,17 @@ public QuizSessionDetailResponse getSessionDetail(Long sessionId) {
QuizSession session = quizSessionRepository.findById(sessionId)
.orElseThrow(() -> new EntityNotFoundException("Session not found with id: " + sessionId));

List<UserAnswerResponse> userAnswerResponses = getUserAnswersForSession(session);
List<UserAnswerResponse> userAnswerResponses = getUserAnswersForSession(sessionId);

return quizSessionDetailConverter.toDto(session, userAnswerResponses);
}

private List<UserAnswerResponse> getUserAnswersForSession(QuizSession session) {
CustomQuiz quiz = session.getQuiz();
Long userId = session.getUser().getId();

// 퀴즈에 포함된 질문 ID 집합 추출
Set<Long> quizQuestionIds = getQuizQuestionIds(quiz);

List<UserAnswer> userAnswers = userAnswerRepository.findByUserIdAndQuestionIdIn(
userId, quizQuestionIds);
private List<UserAnswerResponse> getUserAnswersForSession(Long sessionId) {
List<UserAnswer> userAnswers = userAnswerRepository.findByQuizSessionIdOrderByAnsweredAt(sessionId);

// DTO로 변환
return userAnswers.stream()
.map(userAnswerConverter::toDto)
.collect(Collectors.toList());
}

private Set<Long> getQuizQuestionIds(CustomQuiz quiz) {
return quiz.getQuizQuestionMappings().stream()
.map(mapping -> mapping.getQuestion().getId())
.collect(Collectors.toSet());
}
}