Implement quiz attempt start service
This commit is contained in:
1 parent
ab2129a965
commit
7b5d091989
1 file changed
+70
@@ -0,0 +1,70 @@
|
||||
package com.example.questionbank.service.quiz;
|
||||
|
||||
import com.example.questionbank.domain.ExamAttempt;
|
||||
import com.example.questionbank.domain.Question;
|
||||
import com.example.questionbank.domain.Subject;
|
||||
import com.example.questionbank.domain.User;
|
||||
import com.example.questionbank.domain.enumeration.AttemptStatus;
|
||||
import com.example.questionbank.repository.ExamAttemptRepository;
|
||||
import com.example.questionbank.repository.QuestionRepository;
|
||||
import com.example.questionbank.repository.SubjectRepository;
|
||||
import com.example.questionbank.repository.UserRepository;
|
||||
import com.example.questionbank.web.rest.dto.ExamAttemptStartResult;
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
|
||||
@Service
|
||||
public class QuizAttemptService {
|
||||
|
||||
private final ExamAttemptRepository attemptRepository;
|
||||
private final SubjectRepository subjectRepository;
|
||||
private final QuestionRepository questionRepository;
|
||||
private final UserRepository userRepository;
|
||||
|
||||
public QuizAttemptService(
|
||||
ExamAttemptRepository attemptRepository,
|
||||
SubjectRepository subjectRepository,
|
||||
QuestionRepository questionRepository,
|
||||
UserRepository userRepository
|
||||
) {
|
||||
this.attemptRepository = attemptRepository;
|
||||
this.subjectRepository = subjectRepository;
|
||||
this.questionRepository = questionRepository;
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public ExamAttemptStartResult start(Long subjectId, String login) {
|
||||
Subject subject = subjectRepository
|
||||
.findById(subjectId)
|
||||
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "과목을 찾을 수 없습니다."));
|
||||
|
||||
if (!Boolean.TRUE.equals(subject.getActive())) {
|
||||
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "비활성 과목은 응시할 수 없습니다.");
|
||||
}
|
||||
|
||||
List<Question> activeQuestions = questionRepository.findAllBySubjectIdAndActiveTrue(subjectId);
|
||||
|
||||
if (activeQuestions.isEmpty()) {
|
||||
throw new ResponseStatusException(HttpStatus.CONFLICT, "출제된 활성 문항이 없는 과목입니다.");
|
||||
}
|
||||
|
||||
User user = userRepository
|
||||
.findOneByLogin(login)
|
||||
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "사용자를 찾을 수 없습니다."));
|
||||
|
||||
ExamAttempt attempt = new ExamAttempt();
|
||||
attempt.setSubject(subject);
|
||||
attempt.setUser(user);
|
||||
attempt.setStartedAt(Instant.now());
|
||||
attempt.setStatus(AttemptStatus.IN_PROGRESS);
|
||||
attempt.setScore(0);
|
||||
|
||||
ExamAttempt saved = attemptRepository.save(attempt);
|
||||
return new ExamAttemptStartResult(saved.getId(), saved.getStartedAt());
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user