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