diff --git a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java index 89c52308087b2f1b909b08b817e25440f09bd8c3..36106eda6e7728c0adbf8331b0a709b706b393bc 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 9fb220afd1f217ee0552ef6865e3cd05b5c1f0ab..3d9e41c4032153fa4cfacd089c241a2f1b2fd148 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 64b3497b5c458910f7b8bf6557bf0b4000c04fbe..135b035b5bbd89c1bb4de317e75f720386c15ccc 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 1c60d5866dfed60f6a985a9050bf8756bdfcfe22..dc9b163c4da31cb19b4235eb3766360229b2649f 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()); + } }