diff --git a/src/main/java/com/example/questionbank/service/quiz/QuizAttemptService.java b/src/main/java/com/example/questionbank/service/quiz/QuizAttemptService.java new file mode 100644 index 0000000..74548e3 --- /dev/null +++ b/src/main/java/com/example/questionbank/service/quiz/QuizAttemptService.java @@ -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 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()); + } +}