From d99672faca1f370b83ea88b9bd215186771c7113 Mon Sep 17 00:00:00 2001 From: Jan Tymel <410388@mail.muni.cz> Date: Thu, 21 Jan 2021 21:17:03 +0100 Subject: [PATCH] Add API for question choices removal --- ...AdaptiveTrainingDefinitionsRestController.java | 15 +++++++++++++++ .../demo/repository/QuestionChoiceRepository.java | 8 ++++++++ .../demo/service/LevelOperationsService.java | 5 +++++ .../demo/service/QuestionChoiceService.java | 14 ++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java index 9a024edc..89c52308 100644 --- a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java +++ b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java @@ -265,4 +265,19 @@ public class AdaptiveTrainingDefinitionsRestController { levelOperationsService.updateQuestionChoice(questionChoiceUpdateDto); } + + @ApiOperation(httpMethod = "DELETE", + value = "Delete a specified question choice", + nickname = "deleteQuestionChoice", + produces = MediaType.APPLICATION_JSON_VALUE + ) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Question choice deleted"), + @ApiResponse(code = 500, message = "Unexpected application error") + }) + @DeleteMapping(value = "/question-choices/{questionChoiceId}", produces = MediaType.APPLICATION_JSON_VALUE) + public void deleteQuestionChoice( + @ApiParam(value = "Question choice ID", required = true) @PathVariable(name = "questionChoiceId") Long questionChoiceId) { + levelOperationsService.deleteQuestionChoice(questionChoiceId); + } } diff --git a/src/main/java/com/example/demo/repository/QuestionChoiceRepository.java b/src/main/java/com/example/demo/repository/QuestionChoiceRepository.java index b7d14cd0..7d403efe 100644 --- a/src/main/java/com/example/demo/repository/QuestionChoiceRepository.java +++ b/src/main/java/com/example/demo/repository/QuestionChoiceRepository.java @@ -2,6 +2,7 @@ package com.example.demo.repository; import com.example.demo.domain.QuestionChoice; 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,11 @@ public interface QuestionChoiceRepository extends JpaRepository<QuestionChoice, @Query("SELECT COALESCE(MAX(q.order), -1) FROM QuestionChoice q WHERE q.question.id = :questionId") Integer getCurrentMaxOrder(@Param("questionId") Long questionId); + + @Modifying + @Query("UPDATE QuestionChoice q SET q.order = q.order - 1 " + + "WHERE q.question.id = :questionId " + + "AND q.order > :order ") + void decreaseOrderAfterQuestionChoiceWasDeleted(@Param("order") int order, @Param("questionId") Long questionId); + } diff --git a/src/main/java/com/example/demo/service/LevelOperationsService.java b/src/main/java/com/example/demo/service/LevelOperationsService.java index 6a7c1075..64b3497b 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 deleteQuestionChoice(Long questionChoiceId) { + questionChoiceService.deleteQuestionChoice(questionChoiceId); + } + public BaseLevelDto createLevel(Long trainingDefinitionId, LevelType levelType) { BaseLevelDto baseLevelDto; if (levelType.equals(LevelType.info)) { diff --git a/src/main/java/com/example/demo/service/QuestionChoiceService.java b/src/main/java/com/example/demo/service/QuestionChoiceService.java index c55dbbdd..a9d78573 100644 --- a/src/main/java/com/example/demo/service/QuestionChoiceService.java +++ b/src/main/java/com/example/demo/service/QuestionChoiceService.java @@ -1,5 +1,6 @@ package com.example.demo.service; +import com.example.demo.domain.BaseLevel; import com.example.demo.domain.Question; import com.example.demo.domain.QuestionChoice; import com.example.demo.dto.QuestionChoiceDto; @@ -58,4 +59,17 @@ public class QuestionChoiceService { return BeanMapper.INSTANCE.toDto(savedEntity); } + public void deleteQuestionChoice(Long questionChoiceId) { + Optional<QuestionChoice> questionChoice = questionChoiceRepository.findById(questionChoiceId); + + if (questionChoice.isEmpty()) { + // TODO throw a proper exception + return; + } + + int questionChoiceOrder = questionChoice.get().getOrder(); + questionChoiceRepository.decreaseOrderAfterQuestionChoiceWasDeleted(questionChoiceOrder, questionChoice.get().getQuestion().getId()); + + questionChoiceRepository.delete(questionChoice.get()); + } } -- GitLab