From 07e47ba0d06d0d877ada94f9055a59544cfeacb1 Mon Sep 17 00:00:00 2001
From: Jan Tymel <410388@mail.muni.cz>
Date: Fri, 29 Jan 2021 18:46:49 +0100
Subject: [PATCH] Change REST API for phases deletion according to the new
 design

Related to #10
---
 ...tiveTrainingDefinitionsRestController.java | 28 ++++----
 .../demo/controller/PhasesController.java     | 40 +++++++++--
 .../demo/repository/BaseLevelRepository.java  |  6 +-
 .../demo/service/LevelOperationsService.java  | 71 +++++++++----------
 4 files changed, 83 insertions(+), 62 deletions(-)

diff --git a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
index 6e4aee12..b0fe84f1 100644
--- a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
+++ b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
@@ -63,20 +63,20 @@ public class AdaptiveTrainingDefinitionsRestController {
         levelOperationsService.moveLevelToSpecifiedOrder(levelIdFrom, newPosition);
     }
 
-    @ApiOperation(httpMethod = "DELETE",
-            value = "Delete a specified level",
-            nickname = "deleteLevel",
-            produces = MediaType.APPLICATION_JSON_VALUE
-    )
-    @ApiResponses(value = {
-            @ApiResponse(code = 200, message = "Level deleted"),
-            @ApiResponse(code = 500, message = "Unexpected application error")
-    })
-    @DeleteMapping(value = "/levels/{levelId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public void deleteLevel(
-            @ApiParam(value = "Level ID", required = true) @PathVariable(name = "levelId") Long levelId) {
-        levelOperationsService.deleteLevel(levelId);
-    }
+//    @ApiOperation(httpMethod = "DELETE",
+//            value = "Delete a specified level",
+//            nickname = "deleteLevel",
+//            produces = MediaType.APPLICATION_JSON_VALUE
+//    )
+//    @ApiResponses(value = {
+//            @ApiResponse(code = 200, message = "Level deleted"),
+//            @ApiResponse(code = 500, message = "Unexpected application error")
+//    })
+//    @DeleteMapping(value = "/levels/{levelId}", produces = MediaType.APPLICATION_JSON_VALUE)
+//    public void deleteLevel(
+//            @ApiParam(value = "Level ID", required = true) @PathVariable(name = "levelId") Long levelId) {
+//        levelOperationsService.deleteLevel(levelId);
+//    }
 
 //    @ApiOperation(httpMethod = "POST",
 //            value = "Create a new level",
diff --git a/src/main/java/com/example/demo/controller/PhasesController.java b/src/main/java/com/example/demo/controller/PhasesController.java
index 62b6cd20..7b8f336b 100644
--- a/src/main/java/com/example/demo/controller/PhasesController.java
+++ b/src/main/java/com/example/demo/controller/PhasesController.java
@@ -2,7 +2,7 @@ package com.example.demo.controller;
 
 import com.example.demo.dto.BaseLevelDto;
 import com.example.demo.dto.PhaseCreateDTO;
-import com.example.demo.service.LevelOperationsService;
+import com.example.demo.facade.TrainingPhaseFacade;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -32,7 +33,7 @@ import java.util.List;
 public class PhasesController {
 
     @Autowired
-    private LevelOperationsService levelOperationsService;
+    private TrainingPhaseFacade trainingPhaseFacade;
 
     @ApiOperation(httpMethod = "POST",
             value = "Create a new phase",
@@ -52,7 +53,7 @@ public class PhasesController {
             @ApiParam(value = "Level type", allowableValues = "questionnaire, info, game", required = true)
             @RequestBody @Valid PhaseCreateDTO phaseCreateDTO) {
 
-        BaseLevelDto createdPhase = levelOperationsService.createLevel(definitionId, phaseCreateDTO);
+        BaseLevelDto createdPhase = trainingPhaseFacade.createPhase(definitionId, phaseCreateDTO);
 
         return new ResponseEntity<>(createdPhase, HttpStatus.CREATED);
     }
@@ -73,7 +74,7 @@ public class PhasesController {
             @ApiParam(value = "Training definition ID", required = true)
             @PathVariable(name = "definitionId") Long definitionId) {
 
-        List<BaseLevelDto> phases = levelOperationsService.getPhases(definitionId);
+        List<BaseLevelDto> phases = trainingPhaseFacade.getPhases(definitionId);
 
         return new ResponseEntity<>(phases, HttpStatus.OK);
     }
@@ -88,13 +89,38 @@ public class PhasesController {
             @ApiResponse(code = 200, message = "Phase returned"),
             @ApiResponse(code = 500, message = "Unexpected application error")
     })
-    @GetMapping(path = "/levels/{levelId}")
+    @GetMapping(path = "/{phaseId}")
     public ResponseEntity<BaseLevelDto> getPhase(
-            @ApiParam(value = "Level ID", required = true) @PathVariable("levelId") Long levelId) {
+            @ApiParam(value = "Training definition ID", required = true)
+            @PathVariable(name = "definitionId") Long definitionId,
+            @ApiParam(value = "Level ID", required = true)
+            @PathVariable("phaseId") Long phaseId) {
 
-        BaseLevelDto phase = levelOperationsService.getLevel(levelId);
+        BaseLevelDto phase = trainingPhaseFacade.getPhase(definitionId, phaseId);
 
         return new ResponseEntity<>(phase, HttpStatus.OK);
     }
 
+    @ApiOperation(httpMethod = "DELETE",
+            value = "Remove phase by ID",
+            response = BaseLevelDto.class,
+            nickname = "getPhase",
+            produces = MediaType.APPLICATION_JSON_VALUE
+    )
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Phase removed"),
+            @ApiResponse(code = 500, message = "Unexpected application error")
+    })
+    @DeleteMapping(path = "/{phaseId}")
+    public ResponseEntity<List<BaseLevelDto>> removePhase(
+            @ApiParam(value = "Training definition ID", required = true)
+            @PathVariable(name = "definitionId") Long definitionId,
+            @ApiParam(value = "Level ID", required = true)
+            @PathVariable("phaseId") Long phaseId) {
+
+        List<BaseLevelDto> remainingPhases = trainingPhaseFacade.deletePhase(definitionId, phaseId);
+
+        return new ResponseEntity<>(remainingPhases, HttpStatus.OK);
+    }
+
 }
diff --git a/src/main/java/com/example/demo/repository/BaseLevelRepository.java b/src/main/java/com/example/demo/repository/BaseLevelRepository.java
index 6cd676b2..fbb6ef76 100644
--- a/src/main/java/com/example/demo/repository/BaseLevelRepository.java
+++ b/src/main/java/com/example/demo/repository/BaseLevelRepository.java
@@ -18,11 +18,9 @@ public interface BaseLevelRepository extends JpaRepository<BaseLevel, Long> {
     @Modifying
     @Query("UPDATE BaseLevel l SET l.order = l.order - 1 " +
             "WHERE l.trainingDefinitionId = :trainingDefinitionId " +
-            "AND l.order > :order " +
-            "AND ( (l.phaseLevel.id = :phaseLevelId) OR (:phaseLevelId IS NULL) )")
+            "AND l.order > :order ")
     void decreaseOrderAfterLevelWasDeleted(@Param("trainingDefinitionId") Long trainingDefinitionId,
-                                           @Param("order") int order,
-                                           @Param("phaseLevelId") Long phaseLevelId);
+                                           @Param("order") int order);
 
     @Modifying
     @Query("UPDATE BaseLevel l SET l.order = l.order + 1 " +
diff --git a/src/main/java/com/example/demo/service/LevelOperationsService.java b/src/main/java/com/example/demo/service/LevelOperationsService.java
index fdf52126..ebccb113 100644
--- a/src/main/java/com/example/demo/service/LevelOperationsService.java
+++ b/src/main/java/com/example/demo/service/LevelOperationsService.java
@@ -8,14 +8,12 @@ import com.example.demo.domain.QuestionChoice;
 import com.example.demo.domain.QuestionnaireLevel;
 import com.example.demo.dto.BaseLevelDto;
 import com.example.demo.dto.InfoLevelUpdateDto;
-import com.example.demo.dto.PhaseCreateDTO;
 import com.example.demo.dto.PhaseLevelUpdateDto;
 import com.example.demo.dto.QuestionChoiceDto;
 import com.example.demo.dto.QuestionChoiceUpdateDto;
 import com.example.demo.dto.QuestionDto;
 import com.example.demo.dto.QuestionUpdateDto;
 import com.example.demo.dto.QuestionnaireUpdateDto;
-import com.example.demo.enums.PhaseType;
 import com.example.demo.enums.QuestionType;
 import com.example.demo.mapper.BeanMapper;
 import com.example.demo.repository.BaseLevelRepository;
@@ -23,7 +21,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
 import java.util.Optional;
 
 @Service
@@ -79,21 +76,21 @@ public class LevelOperationsService {
         phaseLevelService.alignDecisionMatrixForPhasesInTrainingDefinition(levelFrom.get().getTrainingDefinitionId());
     }
 
-    @Transactional
-    public void deleteLevel(Long levelId) {
-        Optional<BaseLevel> levelEntity = baseLevelRepository.findById(levelId);
-
-        if (levelEntity.isEmpty()) {
-            // TODO throw a proper exception
-            return;
-        }
-
-        int levelOrder = levelEntity.get().getOrder();
-        Long phaseId = levelEntity.get().getPhaseLevel() == null ? null : levelEntity.get().getPhaseLevel().getId();
-        baseLevelRepository.decreaseOrderAfterLevelWasDeleted(levelEntity.get().getTrainingDefinitionId(), levelOrder, phaseId);
-
-        baseLevelRepository.delete(levelEntity.get());
-    }
+//    @Transactional
+//    public void deleteLevel(Long levelId) {
+//        Optional<BaseLevel> levelEntity = baseLevelRepository.findById(levelId);
+//
+//        if (levelEntity.isEmpty()) {
+//            // TODO throw a proper exception
+//            return;
+//        }
+//
+//        int levelOrder = levelEntity.get().getOrder();
+//        Long phaseId = levelEntity.get().getPhaseLevel() == null ? null : levelEntity.get().getPhaseLevel().getId();
+//        baseLevelRepository.decreaseOrderAfterLevelWasDeleted(levelEntity.get().getTrainingDefinitionId(), levelOrder, phaseId);
+//
+//        baseLevelRepository.delete(levelEntity.get());
+//    }
 
     @Transactional
     public void deleteQuestion(Long questionId) {
@@ -105,20 +102,20 @@ public class LevelOperationsService {
         questionChoiceService.deleteQuestionChoice(questionChoiceId);
     }
 
-    public BaseLevelDto createLevel(Long trainingDefinitionId, PhaseCreateDTO phaseCreateDTO) {
-        BaseLevelDto baseLevelDto;
-        if (PhaseType.INFO.equals(phaseCreateDTO.getPhaseType())) {
-            baseLevelDto = infoLevelService.createDefaultInfoLevel(trainingDefinitionId);
-        } else if (PhaseType.QUESTIONNAIRE.equals(phaseCreateDTO.getPhaseType())) {
-            baseLevelDto = questionnaireLevelService.createDefaultQuestionnaireLevel(trainingDefinitionId);
-        } else {
-            baseLevelDto = phaseLevelService.createDefaultPhaseLevel(trainingDefinitionId);
-        }
-
-        baseLevelDto.setPhaseType(phaseCreateDTO.getPhaseType());
-
-        return baseLevelDto;
-    }
+//    public BaseLevelDto createLevel(Long trainingDefinitionId, PhaseCreateDTO phaseCreateDTO) {
+//        BaseLevelDto baseLevelDto;
+//        if (PhaseType.INFO.equals(phaseCreateDTO.getPhaseType())) {
+//            baseLevelDto = infoLevelService.createDefaultInfoLevel(trainingDefinitionId);
+//        } else if (PhaseType.QUESTIONNAIRE.equals(phaseCreateDTO.getPhaseType())) {
+//            baseLevelDto = questionnaireLevelService.createDefaultQuestionnaireLevel(trainingDefinitionId);
+//        } else {
+//            baseLevelDto = phaseLevelService.createDefaultPhaseLevel(trainingDefinitionId);
+//        }
+//
+//        baseLevelDto.setPhaseType(phaseCreateDTO.getPhaseType());
+//
+//        return baseLevelDto;
+//    }
 
 //    public BaseLevelDto createTask(Long phaseId) {
 //        TaskDto createdTask = taskService.createDefaultTask(phaseId);
@@ -127,11 +124,11 @@ public class LevelOperationsService {
 //        return createdTask;
 //    }
 
-    public List<BaseLevelDto> getPhases(Long trainingDefinitionId) {
-        List<BaseLevel> phases = baseLevelRepository.findAllByTrainingDefinitionIdOrderByOrder(trainingDefinitionId);
-
-        return BeanMapper.INSTANCE.toDtoList(phases);
-    }
+//    public List<BaseLevelDto> getPhases(Long trainingDefinitionId) {
+//        List<BaseLevel> phases = baseLevelRepository.findAllByTrainingDefinitionIdOrderByOrder(trainingDefinitionId);
+//
+//        return BeanMapper.INSTANCE.toDtoList(phases);
+//    }
 
     public BaseLevelDto getLevel(Long levelId) {
         Optional<BaseLevel> level = baseLevelRepository.findById(levelId);
-- 
GitLab