diff --git a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java index 9a024edcef412f1f1a57b3c75ef369320df98806..89c52308087b2f1b909b08b817e25440f09bd8c3 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 b7d14cd0a1bc364cd38895fbe6dbc1a647a87657..7d403efea34d9eb8313b05c2a2706dadfa61ecff 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 6a7c1075a0ebf2a72f6e388232471282e17d40c4..64b3497b5c458910f7b8bf6557bf0b4000c04fbe 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 c55dbbdd6cbfe15d23c8bc83e3df1db1f601bfe2..a9d78573af85bc32f6415e1e20a7a1b5d399e208 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()); + } }