diff --git a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java index 40f90e063d814cc94143246ef855a32e0bdb59a1..2e997bd03a9ce9056bbe77917bb21a62273237ae 100644 --- a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java +++ b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionController.java @@ -1,22 +1,12 @@ package org.fuseri.moduleexercise.question; -import jakarta.persistence.EntityNotFoundException; import org.fuseri.model.dto.common.Result; import org.fuseri.model.dto.exercise.QuestionCreateDto; import org.fuseri.model.dto.exercise.QuestionDto; -import org.fuseri.moduleexercise.answer.Answer; -import org.fuseri.moduleexercise.answer.AnswerMapper; -import org.fuseri.moduleexercise.answer.AnswerService; -import org.fuseri.moduleexercise.exercise.Exercise; -import org.fuseri.moduleexercise.exercise.ExerciseService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; -import java.util.HashSet; - /** * Represent a REST API controller for questions * Handle HTTP requests related to questions @@ -25,29 +15,16 @@ import java.util.HashSet; @RequestMapping("/questions") public class QuestionController { - private final QuestionService questionService; - private final ExerciseService exerciseService; - private final AnswerService answerService; - private final QuestionMapper questionMapper; - private final AnswerMapper answerMapper; + private final QuestionFacade questionFacade; /** * Constructor for QuestionController * - * @param questionService the service responsible for handling question-related logic - * @param exerciseService the service responsible for handling exercise-related logic - * @param answerService the service responsible for handling answer-related logic - * @param answerMapper the mapper responsible for converting between Answer DTOs and entities - * @param questionMapper the mapper responsible for converting between Question DTOs and entities + * @param questionFacade the service responsible for handling question-related logic */ @Autowired - public QuestionController(QuestionService questionService, ExerciseService exerciseService, AnswerService answerService, - QuestionMapper questionMapper, AnswerMapper answerMapper) { - this.questionService = questionService; - this.exerciseService = exerciseService; - this.answerService = answerService; - this.questionMapper = questionMapper; - this.answerMapper = answerMapper; + public QuestionController(QuestionFacade questionFacade) { + this.questionFacade = questionFacade; } /** @@ -58,8 +35,7 @@ public class QuestionController { */ @GetMapping("/{id}") public QuestionDto find(@PathVariable String id) { - var a = questionService.find(id); - return questionMapper.toDto(a); + return questionFacade.find(id); } /** @@ -71,8 +47,7 @@ public class QuestionController { */ @GetMapping("/exercise/{exerciseId}") public Result<QuestionDto> findByExerciseId(@PathVariable String exerciseId, @RequestParam int page) { - Page<Question> questions = questionService.findByExerciseId(exerciseId, page); - return questionMapper.toResult(questions); + return questionFacade.findByExerciseId(exerciseId, page); } /** @@ -84,33 +59,6 @@ public class QuestionController { */ @PostMapping public QuestionDto addQuestion(@RequestBody QuestionCreateDto dto) { - Exercise exercise; - try { - exercise = exerciseService.find(dto.getExerciseId()); - } catch (EntityNotFoundException e) { - throw new ResponseStatusException(HttpStatus.NOT_FOUND, - "Exercise not found with id: " + dto.getExerciseId()); - } - - Question question = questionMapper.fromCreateDto(dto); - exercise.getQuestions().add(question); - question.setExerciseId(exercise.getId()); - - var answerDtos = dto.getAnswers(); - var answers = new HashSet<Answer>(); - for (var answerDto : answerDtos) { - Answer answer = answerMapper.fromCreateDto(answerDto); - answer = answerService.create(answer); - answers.add(answer); - } - - question.setAnswers(answers); - var createdQuestion = questionService.create(question); - - for (var answer : answers) { - answer.setQuestionId(createdQuestion.getId()); - } - - return questionMapper.toDto(createdQuestion); + return questionFacade.addQuestion(dto); } } \ No newline at end of file diff --git a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionFacade.java b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionFacade.java new file mode 100644 index 0000000000000000000000000000000000000000..9a7e712fb3e60ac36e915428e724602c8cbbeda6 --- /dev/null +++ b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionFacade.java @@ -0,0 +1,100 @@ +package org.fuseri.moduleexercise.question; + +import jakarta.persistence.EntityNotFoundException; +import org.fuseri.model.dto.common.Result; +import org.fuseri.model.dto.exercise.QuestionCreateDto; +import org.fuseri.model.dto.exercise.QuestionDto; +import org.fuseri.moduleexercise.answer.Answer; +import org.fuseri.moduleexercise.answer.AnswerMapper; +import org.fuseri.moduleexercise.answer.AnswerService; +import org.fuseri.moduleexercise.exercise.Exercise; +import org.fuseri.moduleexercise.exercise.ExerciseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; + +import java.util.HashSet; + +@Service +public class QuestionFacade { + private final QuestionService questionService; + private final ExerciseService exerciseService; + private final AnswerService answerService; + private final QuestionMapper questionMapper; + private final AnswerMapper answerMapper; + + @Autowired + public QuestionFacade( + QuestionService questionService, ExerciseService exerciseService, + AnswerService answerService, QuestionMapper questionMapper, + AnswerMapper answerMapper) { + this.questionService = questionService; + this.exerciseService = exerciseService; + this.answerService = answerService; + this.questionMapper = questionMapper; + this.answerMapper = answerMapper; + } + + /** + * Find a question by ID. + * + * @param id the ID of the question to find + * @return a QuestionDto object representing the found question + */ + public QuestionDto find(String id) { + var a = questionService.find(id); + return questionMapper.toDto(a); + } + + /** + * Find questions by exercise ID and return them in a paginated format + * + * @param exerciseId the ID of the exercise to find questions for + * @param page the page number of the questions to retrieve + * @return a Result object containing a list of QuestionDto objects and pagination information + */ + public Result<QuestionDto> findByExerciseId(String exerciseId, int page) { + Page<Question> questions = questionService.findByExerciseId(exerciseId, page); + return questionMapper.toResult(questions); + } + + /** + * Add a new question to an exercise + * + * @param dto a QuestionCreateDto object representing the new question to add + * @return a QuestionDto object representing the added question + * @throws ResponseStatusException if the exercise with exerciseId from QuestionCreateDto does not exist + */ + public QuestionDto addQuestion(QuestionCreateDto dto) { + Exercise exercise; + try { + exercise = exerciseService.find(dto.getExerciseId()); + } catch (EntityNotFoundException e) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, + "Exercise not found with id: " + dto.getExerciseId()); + } + + Question question = questionMapper.fromCreateDto(dto); + exercise.getQuestions().add(question); + question.setExerciseId(exercise.getId()); + + var answerDtos = dto.getAnswers(); + var answers = new HashSet<Answer>(); + for (var answerDto : answerDtos) { + Answer answer = answerMapper.fromCreateDto(answerDto); + answer = answerService.create(answer); + answers.add(answer); + } + + question.setAnswers(answers); + var createdQuestion = questionService.create(question); + + for (var answer : answers) { + answer.setQuestionId(createdQuestion.getId()); + } + + return questionMapper.toDto(createdQuestion); + } +}