From 670520b4d2486cc3d8f126879fabdd5772c2a736 Mon Sep 17 00:00:00 2001
From: Jan Tymel <410388@mail.muni.cz>
Date: Wed, 20 Jan 2021 06:18:56 +0100
Subject: [PATCH] Add API for phase update

Resolves #5
---
 ...tiveTrainingDefinitionsRestController.java | 17 ++++
 .../example/demo/dto/PhaseLevelUpdateDto.java | 79 +++++++++++++++++++
 .../com/example/demo/mapper/BeanMapper.java   |  3 +
 .../demo/service/LevelOperationsService.java  |  7 ++
 .../demo/service/PhaseLevelService.java       | 28 +++++++
 5 files changed, 134 insertions(+)
 create mode 100644 src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java

diff --git a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
index e9f925b5..fad0589e 100644
--- a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
+++ b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java
@@ -1,6 +1,7 @@
 package com.example.demo.controller;
 
 import com.example.demo.dto.BaseLevelDto;
+import com.example.demo.dto.PhaseLevelUpdateDto;
 import com.example.demo.dto.QuestionChoiceDto;
 import com.example.demo.dto.QuestionDto;
 import com.example.demo.dto.TaskUpdateDto;
@@ -129,6 +130,22 @@ public class AdaptiveTrainingDefinitionsRestController {
         levelOperationsService.updateInfoLevel(infoLevelUpdateDto);
     }
 
+    @ApiOperation(httpMethod = "PUT",
+            value = "Update phase",
+            nickname = "updatePhaseLevel",
+            consumes = MediaType.APPLICATION_JSON_VALUE
+    )
+    @ApiResponses(value = {
+            @ApiResponse(code = 200, message = "Phase level"),
+            @ApiResponse(code = 500, message = "Unexpected application error")
+    })
+    @PutMapping(path = "/phases")
+    public void updatePhaseLevel(
+            @ApiParam(value = "Info level to be updated") @RequestBody PhaseLevelUpdateDto phaseLevelUpdateDto) {
+
+        levelOperationsService.updatePhaseLevel(phaseLevelUpdateDto);
+    }
+
     @ApiOperation(httpMethod = "PUT",
             value = "Update task",
             nickname = "updateTask",
diff --git a/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java b/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java
new file mode 100644
index 00000000..19965304
--- /dev/null
+++ b/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java
@@ -0,0 +1,79 @@
+package com.example.demo.dto;
+
+import java.util.List;
+
+public class PhaseLevelUpdateDto {
+
+    private Long id;
+    private String title;
+    private Integer order;
+    private Integer allowedWrongFlags;
+    private Integer allowedCommands;
+    private Integer estimatedDuration;
+    private Long maxScore;
+    private List<DecisionMatrixRowDto> decisionMatrix;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getOrder() {
+        return order;
+    }
+
+    public void setOrder(Integer order) {
+        this.order = order;
+    }
+
+    public Integer getAllowedWrongFlags() {
+        return allowedWrongFlags;
+    }
+
+    public void setAllowedWrongFlags(Integer allowedWrongFlags) {
+        this.allowedWrongFlags = allowedWrongFlags;
+    }
+
+    public Integer getAllowedCommands() {
+        return allowedCommands;
+    }
+
+    public void setAllowedCommands(Integer allowedCommands) {
+        this.allowedCommands = allowedCommands;
+    }
+
+    public Integer getEstimatedDuration() {
+        return estimatedDuration;
+    }
+
+    public void setEstimatedDuration(Integer estimatedDuration) {
+        this.estimatedDuration = estimatedDuration;
+    }
+
+    public Long getMaxScore() {
+        return maxScore;
+    }
+
+    public void setMaxScore(Long maxScore) {
+        this.maxScore = maxScore;
+    }
+
+    public List<DecisionMatrixRowDto> getDecisionMatrix() {
+        return decisionMatrix;
+    }
+
+    public void setDecisionMatrix(List<DecisionMatrixRowDto> decisionMatrix) {
+        this.decisionMatrix = decisionMatrix;
+    }
+}
diff --git a/src/main/java/com/example/demo/mapper/BeanMapper.java b/src/main/java/com/example/demo/mapper/BeanMapper.java
index 4d886e17..1f380c16 100644
--- a/src/main/java/com/example/demo/mapper/BeanMapper.java
+++ b/src/main/java/com/example/demo/mapper/BeanMapper.java
@@ -18,6 +18,7 @@ import com.example.demo.dto.InfoLevelCreateDto;
 import com.example.demo.dto.InfoLevelDto;
 import com.example.demo.dto.InfoLevelUpdateDto;
 import com.example.demo.dto.PhaseLevelDto;
+import com.example.demo.dto.PhaseLevelUpdateDto;
 import com.example.demo.dto.QuestionChoiceDto;
 import com.example.demo.dto.QuestionDto;
 import com.example.demo.dto.QuestionnaireLevelDto;
@@ -87,6 +88,8 @@ public interface BeanMapper {
 
     PhaseLevel toEntity(PhaseLevelDto phaseLevel);
 
+    PhaseLevel toEntity(PhaseLevelUpdateDto phaseLevelUpdateDto);
+
     AssessmentLevel toAssessmentLevel(GameDefinitionCreateDto gameDefinitionCreateDto);
 
     InfoLevel toInfoLevel(GameDefinitionCreateDto gameDefinitionCreateDto);
diff --git a/src/main/java/com/example/demo/service/LevelOperationsService.java b/src/main/java/com/example/demo/service/LevelOperationsService.java
index 1b61e2b1..a450ccee 100644
--- a/src/main/java/com/example/demo/service/LevelOperationsService.java
+++ b/src/main/java/com/example/demo/service/LevelOperationsService.java
@@ -1,9 +1,11 @@
 package com.example.demo.service;
 
 import com.example.demo.domain.BaseLevel;
+import com.example.demo.domain.PhaseLevel;
 import com.example.demo.domain.Task;
 import com.example.demo.domain.InfoLevel;
 import com.example.demo.dto.BaseLevelDto;
+import com.example.demo.dto.PhaseLevelUpdateDto;
 import com.example.demo.dto.QuestionChoiceDto;
 import com.example.demo.dto.QuestionDto;
 import com.example.demo.dto.TaskDto;
@@ -128,6 +130,11 @@ public class LevelOperationsService {
         infoLevelService.updateInfoLevel(infoLevel);
     }
 
+    public void updatePhaseLevel(PhaseLevelUpdateDto phaseLevelUpdateDto) {
+        PhaseLevel phaseLevel = BeanMapper.INSTANCE.toEntity(phaseLevelUpdateDto);
+        phaseLevelService.updatePhaseLevel(phaseLevel);
+    }
+
     public void updateTask(TaskUpdateDto taskUpdateDto) {
         Task task = BeanMapper.INSTANCE.toEntity(taskUpdateDto);
         taskService.updateTask(task);
diff --git a/src/main/java/com/example/demo/service/PhaseLevelService.java b/src/main/java/com/example/demo/service/PhaseLevelService.java
index b4a2cecc..e118b560 100644
--- a/src/main/java/com/example/demo/service/PhaseLevelService.java
+++ b/src/main/java/com/example/demo/service/PhaseLevelService.java
@@ -6,14 +6,20 @@ import com.example.demo.dto.PhaseLevelDto;
 import com.example.demo.mapper.BeanMapper;
 import com.example.demo.repository.BaseLevelRepository;
 import com.example.demo.repository.PhaseLevelRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.util.Collections;
+import java.util.Optional;
 
 @Service
 public class PhaseLevelService {
 
+    private static final Logger LOG = LoggerFactory.getLogger(PhaseLevelService.class);
+
     @Autowired
     private PhaseLevelRepository phaseLevelRepository;
 
@@ -42,4 +48,26 @@ public class PhaseLevelService {
 
         return BeanMapper.INSTANCE.toDto(persistedEntity);
     }
+
+    public PhaseLevelDto updatePhaseLevel(PhaseLevel phaseLevel) {
+        Optional<PhaseLevel> persistedPhaseLevel = phaseLevelRepository.findById(phaseLevel.getId());
+
+        if (persistedPhaseLevel.isEmpty()) {
+            // TODO return 404
+            LOG.error("No phase level found with ID {}.", phaseLevel.getId());
+            return new PhaseLevelDto();
+        }
+
+        phaseLevel.setTrainingDefinitionId(persistedPhaseLevel.get().getTrainingDefinitionId());
+        phaseLevel.setOrder(persistedPhaseLevel.get().getOrder());
+        phaseLevel.setSubLevels(persistedPhaseLevel.get().getSubLevels());
+
+        if (!CollectionUtils.isEmpty(phaseLevel.getDecisionMatrix())) {
+            phaseLevel.getDecisionMatrix().forEach(x -> x.setPhaseLevel(phaseLevel));
+        }
+
+        PhaseLevel savedEntity = phaseLevelRepository.save(phaseLevel);
+
+        return BeanMapper.INSTANCE.toDto(savedEntity);
+    }
 }
-- 
GitLab