diff --git a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/Question.java b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/Question.java index 2b44cd57aed3d954ec19b087922a6b3d3862dbba..03f62910b63062589484675c9f4d1ba436ec60c5 100644 --- a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/Question.java +++ b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/Question.java @@ -1,7 +1,16 @@ package org.fuseri.moduleexercise.question; -import jakarta.persistence.*; -import lombok.*; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.fuseri.moduleexercise.answer.Answer; import org.fuseri.moduleexercise.common.DomainObject; import org.fuseri.moduleexercise.exercise.Exercise; @@ -27,7 +36,15 @@ public class Question extends DomainObject { private Set<Answer> answers = new HashSet<>(); @ManyToOne - @JoinColumn(name = "exercise_id", nullable=false) + @JoinColumn(name = "exercise_id", nullable = false) private Exercise exercise; + /** + * Add answers to question + * + * @param answersToAdd to add + */ + public void addAnswers(Set<Answer> answersToAdd) { + answers.addAll(answersToAdd); + } } 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 a7b215a4a2bb2e98e89c6ff215f2b08f73ddad89..9857e1c3d46120979b04339b2ddf0293c22c0ed8 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 @@ -9,13 +9,22 @@ import jakarta.persistence.EntityNotFoundException; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import org.fuseri.model.dto.exercise.AnswerDto; +import org.fuseri.model.dto.exercise.AnswerInQuestionCreateDto; import org.fuseri.model.dto.exercise.QuestionCreateDto; import org.fuseri.model.dto.exercise.QuestionDto; import org.fuseri.model.dto.exercise.QuestionUpdateDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -139,4 +148,21 @@ public class QuestionController { questionFacade.delete(id); return ResponseEntity.noContent().build(); } + + /** + * Adds answers to the existing question resource + * + * @param id id of question to update + * @return the LectureDto representing the updated lecture + */ + @Operation(summary = "Add answers to the existing question.") + @PatchMapping("/{id}/answers") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "The question has been successfully updated"), + @ApiResponse(responseCode = "400", description = "The request body is invalid"), + @ApiResponse(responseCode = "404", description = "The question with the specified ID does not exist") + }) + public ResponseEntity<QuestionDto> addAnswers(@PathVariable Long id, @RequestBody List<AnswerInQuestionCreateDto> answerDtoList) { + return ResponseEntity.ok(questionFacade.addAnswers(id, answerDtoList)); + } } \ 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 index 12365a36a81fb46c3fb6c696735b2cdcdc3f2b5a..8fe1e2a19f4fd2663aa3a22e0e5f9848829f8800 100644 --- 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 @@ -2,6 +2,7 @@ package org.fuseri.moduleexercise.question; import jakarta.transaction.Transactional; import org.fuseri.model.dto.exercise.AnswerDto; +import org.fuseri.model.dto.exercise.AnswerInQuestionCreateDto; import org.fuseri.model.dto.exercise.QuestionCreateDto; import org.fuseri.model.dto.exercise.QuestionDto; import org.fuseri.model.dto.exercise.QuestionUpdateDto; @@ -55,6 +56,17 @@ public class QuestionFacade { return answerMapper.toDtoList(answerService.findAllByQuestionId(questionId)); } + /** + * Add answers to question + * + * @param id question ID + * @param dto List with AnswerInQuestionCreateDto to add to question + * @return a QuestionDto object representing the updated question + */ + public QuestionDto addAnswers(Long id, List<AnswerInQuestionCreateDto> dto) { + return questionMapper.toDto(questionService.addAnswers(id, answerMapper.fromCreateDtoList(dto))); + } + /** * Create a new question * diff --git a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionService.java b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionService.java index 1016db8d8833a251204fcc498c47171b130e68f6..f0676eee28256d926e768b0fee5df3cf52275fac 100644 --- a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionService.java +++ b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionService.java @@ -2,12 +2,14 @@ package org.fuseri.moduleexercise.question; import jakarta.persistence.EntityNotFoundException; import lombok.Getter; +import org.fuseri.moduleexercise.answer.Answer; import org.fuseri.moduleexercise.common.DomainService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Optional; +import java.util.Set; /** * Represent a service for managing Question entities @@ -47,7 +49,7 @@ public class QuestionService extends DomainService<Question> { /** * Patch update a question. Don't update question answers. * - * @param id the question ID + * @param id the question ID * @param updatedQuestion the question to update * @return the updated question */ @@ -64,4 +66,23 @@ public class QuestionService extends DomainService<Question> { } } + /** + * Add answers to question with question ID. + * + * @param id of question + * @param answers to add to question + * @return updated question + */ + public Question addAnswers(Long id, Set<Answer> answers) { + Optional<Question> optionalQuestion = repository.findById(id); + if (optionalQuestion.isPresent()) { + Question question = optionalQuestion.get(); + question.addAnswers(answers); + return repository.save(question); + } else { + throw new EntityNotFoundException( + "Question with id: " + id + " was not found."); + } + + } }