From bb7698377fb5bc410b8d80adc9d5c9ecc38c7fee Mon Sep 17 00:00:00 2001 From: Jan Tymel <410388@mail.muni.cz> Date: Thu, 21 Jan 2021 21:26:46 +0100 Subject: [PATCH] Add API for questions removal --- ...AdaptiveTrainingDefinitionsRestController.java | 15 +++++++++++++++ .../demo/repository/QuestionRepository.java | 7 +++++++ .../demo/service/LevelOperationsService.java | 5 +++++ .../com/example/demo/service/QuestionService.java | 14 ++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java index 89c52308..36106eda 100644 --- a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java +++ b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java @@ -250,6 +250,21 @@ public class AdaptiveTrainingDefinitionsRestController { levelOperationsService.updateQuestion(questionUpdateDto); } + @ApiOperation(httpMethod = "DELETE", + value = "Delete a specified question", + nickname = "deleteQuestion", + produces = MediaType.APPLICATION_JSON_VALUE + ) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Question deleted"), + @ApiResponse(code = 500, message = "Unexpected application error") + }) + @DeleteMapping(value = "/questions/{questionId}", produces = MediaType.APPLICATION_JSON_VALUE) + public void deleteQuestion( + @ApiParam(value = "Question ID", required = true) @PathVariable(name = "questionId") Long questionId) { + levelOperationsService.deleteQuestion(questionId); + } + @ApiOperation(httpMethod = "PUT", value = "Update question choice", nickname = "updateQuestionChoice", diff --git a/src/main/java/com/example/demo/repository/QuestionRepository.java b/src/main/java/com/example/demo/repository/QuestionRepository.java index 9fb220af..3d9e41c4 100644 --- a/src/main/java/com/example/demo/repository/QuestionRepository.java +++ b/src/main/java/com/example/demo/repository/QuestionRepository.java @@ -2,6 +2,7 @@ package com.example.demo.repository; import com.example.demo.domain.Question; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -9,4 +10,10 @@ public interface QuestionRepository extends JpaRepository<Question, Long> { @Query("SELECT COALESCE(MAX(q.order), -1) FROM Question q WHERE q.questionnaireLevel.id = :questionnaireId") Integer getCurrentMaxOrder(@Param("questionnaireId") Long questionnaireId); + + @Modifying + @Query("UPDATE Question q SET q.order = q.order - 1 " + + "WHERE q.questionnaireLevel.id = :questionnaireLevelId " + + "AND q.order > :order ") + void decreaseOrderAfterQuestionWasDeleted(@Param("order") int order, @Param("questionnaireLevelId") Long questionnaireLevelId); } diff --git a/src/main/java/com/example/demo/service/LevelOperationsService.java b/src/main/java/com/example/demo/service/LevelOperationsService.java index 64b3497b..135b035b 100644 --- a/src/main/java/com/example/demo/service/LevelOperationsService.java +++ b/src/main/java/com/example/demo/service/LevelOperationsService.java @@ -97,6 +97,11 @@ public class LevelOperationsService { baseLevelRepository.delete(levelEntity.get()); } + @Transactional + public void deleteQuestion(Long questionId) { + questionService.deleteQuestion(questionId); + } + @Transactional public void deleteQuestionChoice(Long questionChoiceId) { questionChoiceService.deleteQuestionChoice(questionChoiceId); diff --git a/src/main/java/com/example/demo/service/QuestionService.java b/src/main/java/com/example/demo/service/QuestionService.java index 1c60d586..dc9b163c 100644 --- a/src/main/java/com/example/demo/service/QuestionService.java +++ b/src/main/java/com/example/demo/service/QuestionService.java @@ -1,6 +1,7 @@ package com.example.demo.service; import com.example.demo.domain.Question; +import com.example.demo.domain.QuestionChoice; import com.example.demo.domain.QuestionnaireLevel; import com.example.demo.dto.QuestionDto; import com.example.demo.enums.QuestionType; @@ -61,4 +62,17 @@ public class QuestionService { return BeanMapper.INSTANCE.toDto(savedEntity); } + public void deleteQuestion(Long questionId) { + Optional<Question> question = questionRepository.findById(questionId); + + if (question.isEmpty()) { + // TODO throw a proper exception + return; + } + + int questionOrder = question.get().getOrder(); + questionRepository.decreaseOrderAfterQuestionWasDeleted(questionOrder, question.get().getQuestionnaireLevel().getId()); + + questionRepository.delete(question.get()); + } } -- GitLab