forked from Blaybus212/backend
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQuizService.java
More file actions
96 lines (80 loc) · 3.18 KB
/
QuizService.java
File metadata and controls
96 lines (80 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package com.blaybus.backend.service;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.blaybus.backend.domain.quiz.Quiz;
import com.blaybus.backend.domain.quiz.QuizType;
import com.blaybus.backend.domain.quiz.QuizUserProgress;
import com.blaybus.backend.domain.scene.SceneInformation;
import com.blaybus.backend.domain.user.User;
import com.blaybus.backend.dto.QuizDto;
import com.blaybus.backend.dto.QuizResponse;
import com.blaybus.backend.exception.BusinessException;
import com.blaybus.backend.exception.CommonErrorCode;
import com.blaybus.backend.repository.QuizRepository;
import com.blaybus.backend.repository.QuizUserProgressRepository;
import com.blaybus.backend.repository.SceneInformationRepository;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class QuizService {
private final QuizRepository quizRepository;
private final QuizUserProgressRepository progressRepository;
private final SceneInformationRepository sceneRepository;
@Transactional
public QuizResponse getSceneQuizzes(Long sceneId, User user) {
SceneInformation scene = sceneRepository.findById(sceneId)
.orElseThrow(() -> new BusinessException(CommonErrorCode.SCENE_NOT_FOUND));
List<Quiz> quizzes = quizRepository.findAllBySceneIdOrderById(sceneId);
QuizUserProgress progress = progressRepository.findByUserIdAndSceneId(user.getId(), sceneId)
.orElseGet(() -> {
QuizUserProgress newProgress = QuizUserProgress.builder()
.user(user)
.scene(scene)
.lastQuizId(null)
.totalQuestions(quizzes.size())
.success(0)
.failure(0)
.isComplete(false)
.solveTime(0)
.build();
return progressRepository.save(newProgress);
});
return mapToResponse(sceneId, progress, quizzes);
}
@Transactional
public void syncProgress(Long sceneId, QuizDto.SyncProgressRequest request, User user) {
QuizUserProgress progress = progressRepository.findByUserIdAndSceneId(user.getId(), sceneId)
.orElseThrow(() -> new BusinessException(CommonErrorCode.QUIZ_PROGRESS_NOT_FOUND));
QuizUserProgress updated = QuizUserProgress.builder()
.id(progress.getId())
.user(progress.getUser())
.scene(progress.getScene())
.lastQuizId(request.lastQuizId())
.totalQuestions(request.totalQuestions())
.success(request.success())
.failure(request.failure())
.solveTime(request.solveTime())
.isComplete(request.isComplete())
.build();
progressRepository.save(updated);
}
private QuizResponse mapToResponse(Long sceneId, QuizUserProgress progress, List<Quiz> quizzes) {
QuizResponse.UserProgressDto progressDto = new QuizResponse.UserProgressDto(
progress.getId(),
progress.getLastQuizId(),
progress.getTotalQuestions(),
progress.getSuccess(),
progress.getFailure(),
progress.isComplete());
List<QuizResponse.QuizItemDto> quizItemDtos = quizzes.stream()
.map(quiz -> new QuizResponse.QuizItemDto(
quiz.getId(),
quiz.getTargetPurpose(),
quiz.getType(),
quiz.getQuestion(),
quiz.getType().equals(QuizType.SELECT) ? quiz.getAnswer() : null))
.toList();
return new QuizResponse(sceneId, progressDto, quizItemDtos);
}
}