From e91192ec02b6d96e20ab3e32191c78d75b2b0eea Mon Sep 17 00:00:00 2001
From: Jan Tymel <410388@mail.muni.cz>
Date: Mon, 1 Feb 2021 09:06:42 +0100
Subject: [PATCH] [Cleanup] Rename QuestionnaireLevel to QuestionnairePhase

---
 .../demo/controller/PhasesController.java     |  6 +-
 .../com/example/demo/domain/Question.java     | 10 +--
 ...aireLevel.java => QuestionnairePhase.java} |  4 +-
 .../domain/QuestionnairePhaseRelation.java    |  6 +-
 ...velDto.java => QuestionnairePhaseDto.java} |  2 +-
 .../demo/facade/TrainingPhaseFacade.java      | 12 +--
 .../com/example/demo/mapper/BeanMapper.java   | 14 ++--
 .../demo/repository/QuestionRepository.java   |  6 +-
 .../QuestionnaireLevelRepository.java         |  9 ---
 .../QuestionnairePhaseRepository.java         |  7 ++
 .../example/demo/service/QuestionService.java | 17 ++--
 .../service/QuestionnaireLevelService.java    | 77 -------------------
 .../service/QuestionnairePhaseService.java    | 77 +++++++++++++++++++
 13 files changed, 122 insertions(+), 125 deletions(-)
 rename src/main/java/com/example/demo/domain/{QuestionnaireLevel.java => QuestionnairePhase.java} (92%)
 rename src/main/java/com/example/demo/dto/{QuestionnaireLevelDto.java => QuestionnairePhaseDto.java} (81%)
 delete mode 100644 src/main/java/com/example/demo/repository/QuestionnaireLevelRepository.java
 create mode 100644 src/main/java/com/example/demo/repository/QuestionnairePhaseRepository.java
 delete mode 100644 src/main/java/com/example/demo/service/QuestionnaireLevelService.java
 create mode 100644 src/main/java/com/example/demo/service/QuestionnairePhaseService.java

diff --git a/src/main/java/com/example/demo/controller/PhasesController.java b/src/main/java/com/example/demo/controller/PhasesController.java
index ace60628..f59af521 100644
--- a/src/main/java/com/example/demo/controller/PhasesController.java
+++ b/src/main/java/com/example/demo/controller/PhasesController.java
@@ -4,9 +4,9 @@ import com.example.demo.dto.AbstractPhaseDto;
 import com.example.demo.dto.InfoPhaseDto;
 import com.example.demo.dto.InfoPhaseUpdateDto;
 import com.example.demo.dto.PhaseCreateDTO;
+import com.example.demo.dto.QuestionnairePhaseDto;
 import com.example.demo.dto.TrainingPhaseDto;
 import com.example.demo.dto.TrainingPhaseUpdateDto;
-import com.example.demo.dto.QuestionnaireLevelDto;
 import com.example.demo.dto.QuestionnaireUpdateDto;
 import com.example.demo.facade.TrainingPhaseFacade;
 import io.swagger.annotations.Api;
@@ -192,7 +192,7 @@ public class PhasesController {
             @ApiResponse(code = 500, message = "Unexpected application error")
     })
     @PutMapping(path = "/{phaseId}/questionnaire")
-    public ResponseEntity<QuestionnaireLevelDto> updateQuestionnairePhase(
+    public ResponseEntity<QuestionnairePhaseDto> updateQuestionnairePhase(
             @ApiParam(value = "Training definition ID", required = true)
             @PathVariable(name = "definitionId") Long definitionId,
             @ApiParam(value = "Phase ID", required = true)
@@ -200,7 +200,7 @@ public class PhasesController {
             @ApiParam(value = "Questionnaire to be updated")
             @RequestBody @Valid QuestionnaireUpdateDto questionnaireUpdateDto) {
 
-        QuestionnaireLevelDto updatedQuestionnairePhase = trainingPhaseFacade.updateQuestionnairePhase(definitionId, phaseId, questionnaireUpdateDto);
+        QuestionnairePhaseDto updatedQuestionnairePhase = trainingPhaseFacade.updateQuestionnairePhase(definitionId, phaseId, questionnaireUpdateDto);
 
         return new ResponseEntity<>(updatedQuestionnairePhase, HttpStatus.OK);
     }
diff --git a/src/main/java/com/example/demo/domain/Question.java b/src/main/java/com/example/demo/domain/Question.java
index ae5b7306..9cde8a5e 100644
--- a/src/main/java/com/example/demo/domain/Question.java
+++ b/src/main/java/com/example/demo/domain/Question.java
@@ -36,7 +36,7 @@ public class Question {
     private int order;
 
     @ManyToOne(fetch = FetchType.LAZY)
-    private QuestionnaireLevel questionnaireLevel;
+    private QuestionnairePhase questionnairePhase;
 
     @OrderBy
     @OneToMany(mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@@ -77,12 +77,12 @@ public class Question {
         this.order = order;
     }
 
-    public QuestionnaireLevel getQuestionnaireLevel() {
-        return questionnaireLevel;
+    public QuestionnairePhase getQuestionnairePhase() {
+        return questionnairePhase;
     }
 
-    public void setQuestionnaireLevel(QuestionnaireLevel questionnaireLevel) {
-        this.questionnaireLevel = questionnaireLevel;
+    public void setQuestionnairePhase(QuestionnairePhase questionnairePhase) {
+        this.questionnairePhase = questionnairePhase;
     }
 
     public List<QuestionChoice> getChoices() {
diff --git a/src/main/java/com/example/demo/domain/QuestionnaireLevel.java b/src/main/java/com/example/demo/domain/QuestionnairePhase.java
similarity index 92%
rename from src/main/java/com/example/demo/domain/QuestionnaireLevel.java
rename to src/main/java/com/example/demo/domain/QuestionnairePhase.java
index 939a4ca6..33c0d21f 100644
--- a/src/main/java/com/example/demo/domain/QuestionnaireLevel.java
+++ b/src/main/java/com/example/demo/domain/QuestionnairePhase.java
@@ -12,13 +12,13 @@ import javax.persistence.OrderBy;
 import java.util.List;
 
 @Entity
-public class QuestionnaireLevel extends AbstractPhase {
+public class QuestionnairePhase extends AbstractPhase {
 
     @Enumerated(EnumType.STRING)
     private QuestionnaireType questionnaireType;
 
     @OrderBy
-    @OneToMany(mappedBy = "questionnaireLevel", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
+    @OneToMany(mappedBy = "questionnairePhase", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
     private List<Question> questions;
 
     @OrderBy
diff --git a/src/main/java/com/example/demo/domain/QuestionnairePhaseRelation.java b/src/main/java/com/example/demo/domain/QuestionnairePhaseRelation.java
index b30f4e52..4ab861c4 100644
--- a/src/main/java/com/example/demo/domain/QuestionnairePhaseRelation.java
+++ b/src/main/java/com/example/demo/domain/QuestionnairePhaseRelation.java
@@ -23,7 +23,7 @@ public class QuestionnairePhaseRelation {
     private Integer order;
 
     @ManyToOne(fetch = FetchType.LAZY)
-    private QuestionnaireLevel relatedPhase;
+    private QuestionnairePhase relatedPhase;
 
     @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
     @JoinTable(name = "questionnaire_phase_relation_question",
@@ -50,11 +50,11 @@ public class QuestionnairePhaseRelation {
         this.order = order;
     }
 
-    public QuestionnaireLevel getRelatedPhase() {
+    public QuestionnairePhase getRelatedPhase() {
         return relatedPhase;
     }
 
-    public void setRelatedPhase(QuestionnaireLevel relatedPhase) {
+    public void setRelatedPhase(QuestionnairePhase relatedPhase) {
         this.relatedPhase = relatedPhase;
     }
 
diff --git a/src/main/java/com/example/demo/dto/QuestionnaireLevelDto.java b/src/main/java/com/example/demo/dto/QuestionnairePhaseDto.java
similarity index 81%
rename from src/main/java/com/example/demo/dto/QuestionnaireLevelDto.java
rename to src/main/java/com/example/demo/dto/QuestionnairePhaseDto.java
index 64da5cbf..024584c2 100644
--- a/src/main/java/com/example/demo/dto/QuestionnaireLevelDto.java
+++ b/src/main/java/com/example/demo/dto/QuestionnairePhaseDto.java
@@ -2,7 +2,7 @@ package com.example.demo.dto;
 
 import java.util.List;
 
-public class QuestionnaireLevelDto extends AbstractPhaseDto {
+public class QuestionnairePhaseDto extends AbstractPhaseDto {
 
     private List<QuestionDto> questions;
 
diff --git a/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java b/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java
index d080d585..76e20447 100644
--- a/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java
+++ b/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java
@@ -4,15 +4,15 @@ import com.example.demo.dto.AbstractPhaseDto;
 import com.example.demo.dto.InfoPhaseDto;
 import com.example.demo.dto.InfoPhaseUpdateDto;
 import com.example.demo.dto.PhaseCreateDTO;
+import com.example.demo.dto.QuestionnairePhaseDto;
 import com.example.demo.dto.TrainingPhaseDto;
 import com.example.demo.dto.TrainingPhaseUpdateDto;
-import com.example.demo.dto.QuestionnaireLevelDto;
 import com.example.demo.dto.QuestionnaireUpdateDto;
 import com.example.demo.enums.PhaseType;
 import com.example.demo.service.InfoPhaseService;
 import com.example.demo.service.TrainingPhaseService;
 import com.example.demo.service.PhaseService;
-import com.example.demo.service.QuestionnaireLevelService;
+import com.example.demo.service.QuestionnairePhaseService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -29,7 +29,7 @@ public class TrainingPhaseFacade {
     private InfoPhaseService infoPhaseService;
 
     @Autowired
-    private QuestionnaireLevelService questionnaireLevelService;
+    private QuestionnairePhaseService questionnairePhaseService;
 
     @Autowired
     private TrainingPhaseService trainingPhaseService;
@@ -39,7 +39,7 @@ public class TrainingPhaseFacade {
         if (PhaseType.INFO.equals(phaseCreateDTO.getPhaseType())) {
             abstractPhaseDto = infoPhaseService.createDefaultInfoPhase(trainingDefinitionId);
         } else if (PhaseType.QUESTIONNAIRE.equals(phaseCreateDTO.getPhaseType())) {
-            abstractPhaseDto = questionnaireLevelService.createDefaultQuestionnaireLevel(trainingDefinitionId);
+            abstractPhaseDto = questionnairePhaseService.createDefaultQuestionnairePhase(trainingDefinitionId);
         } else {
             abstractPhaseDto = trainingPhaseService.createDefaultTrainingPhase(trainingDefinitionId);
         }
@@ -75,8 +75,8 @@ public class TrainingPhaseFacade {
         return trainingPhaseService.updateTrainingPhase(definitionId, phaseId, trainingPhaseUpdate);
     }
 
-    public QuestionnaireLevelDto updateQuestionnairePhase(Long definitionId, Long phaseId, QuestionnaireUpdateDto questionnaireUpdateDto) {
-        return questionnaireLevelService.updateQuestionnairePhase(definitionId, phaseId, questionnaireUpdateDto);
+    public QuestionnairePhaseDto updateQuestionnairePhase(Long definitionId, Long phaseId, QuestionnaireUpdateDto questionnaireUpdateDto) {
+        return questionnairePhaseService.updateQuestionnairePhase(definitionId, phaseId, questionnaireUpdateDto);
     }
 
     public void movePhaseToSpecifiedOrder(Long phaseIdFrom, int newPosition) {
diff --git a/src/main/java/com/example/demo/mapper/BeanMapper.java b/src/main/java/com/example/demo/mapper/BeanMapper.java
index cd418807..f443f281 100644
--- a/src/main/java/com/example/demo/mapper/BeanMapper.java
+++ b/src/main/java/com/example/demo/mapper/BeanMapper.java
@@ -3,10 +3,10 @@ package com.example.demo.mapper;
 import com.example.demo.domain.AbstractPhase;
 import com.example.demo.domain.DecisionMatrixRow;
 import com.example.demo.domain.InfoPhase;
+import com.example.demo.domain.QuestionnairePhase;
 import com.example.demo.domain.TrainingPhase;
 import com.example.demo.domain.Question;
 import com.example.demo.domain.QuestionChoice;
-import com.example.demo.domain.QuestionnaireLevel;
 import com.example.demo.domain.Task;
 import com.example.demo.dto.AbstractPhaseDto;
 import com.example.demo.dto.DecisionMatrixRowDto;
@@ -18,7 +18,7 @@ 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.QuestionnaireLevelDto;
+import com.example.demo.dto.QuestionnairePhaseDto;
 import com.example.demo.dto.QuestionnaireUpdateDto;
 import com.example.demo.dto.TaskCreateDto;
 import com.example.demo.dto.TaskDto;
@@ -43,8 +43,8 @@ public interface BeanMapper {
             abstractPhaseDto = toDto((InfoPhase) abstractPhase);
         } else if (abstractPhase instanceof Task) {
             abstractPhaseDto = toDto((Task) abstractPhase);
-        } else if (abstractPhase instanceof QuestionnaireLevel) {
-            abstractPhaseDto = toDto((QuestionnaireLevel) abstractPhase);
+        } else if (abstractPhase instanceof QuestionnairePhase) {
+            abstractPhaseDto = toDto((QuestionnairePhase) abstractPhase);
         } else {
             throw new RuntimeException("Unknown level type " + abstractPhase.getClass().getName());
         }
@@ -91,9 +91,9 @@ public interface BeanMapper {
 
     QuestionDto toDto(Question question);
 
-    QuestionnaireLevel toEntity(QuestionnaireUpdateDto questionnaireUpdateDto);
+    QuestionnairePhase toEntity(QuestionnaireUpdateDto questionnaireUpdateDto);
 
-    QuestionnaireLevel toEntity(QuestionnaireLevelDto questionnaireLevelDto);
+    QuestionnairePhase toEntity(QuestionnairePhaseDto questionnairePhaseDto);
 
-    QuestionnaireLevelDto toDto(QuestionnaireLevel questionnaireLevel);
+    QuestionnairePhaseDto toDto(QuestionnairePhase questionnairePhase);
 }
diff --git a/src/main/java/com/example/demo/repository/QuestionRepository.java b/src/main/java/com/example/demo/repository/QuestionRepository.java
index 3d9e41c4..13648e40 100644
--- a/src/main/java/com/example/demo/repository/QuestionRepository.java
+++ b/src/main/java/com/example/demo/repository/QuestionRepository.java
@@ -8,12 +8,12 @@ import org.springframework.data.repository.query.Param;
 
 public interface QuestionRepository extends JpaRepository<Question, Long> {
 
-    @Query("SELECT COALESCE(MAX(q.order), -1) FROM Question q WHERE q.questionnaireLevel.id = :questionnaireId")
+    @Query("SELECT COALESCE(MAX(q.order), -1) FROM Question q WHERE q.questionnairePhase.id = :questionnaireId")
     Integer getCurrentMaxOrder(@Param("questionnaireId") Long questionnaireId);
 
     @Modifying
     @Query("UPDATE Question q SET q.order = q.order - 1 " +
-            "WHERE q.questionnaireLevel.id  = :questionnaireLevelId " +
+            "WHERE q.questionnairePhase.id  = :questionnairePhaseIdLevelId " +
             "AND q.order > :order ")
-    void decreaseOrderAfterQuestionWasDeleted(@Param("order") int order, @Param("questionnaireLevelId") Long questionnaireLevelId);
+    void decreaseOrderAfterQuestionWasDeleted(@Param("order") int order, @Param("questionnairePhaseIdLevelId") Long questionnairePhaseIdLevelId);
 }
diff --git a/src/main/java/com/example/demo/repository/QuestionnaireLevelRepository.java b/src/main/java/com/example/demo/repository/QuestionnaireLevelRepository.java
deleted file mode 100644
index cbd04783..00000000
--- a/src/main/java/com/example/demo/repository/QuestionnaireLevelRepository.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.example.demo.repository;
-
-import com.example.demo.domain.QuestionnaireLevel;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-
-public interface QuestionnaireLevelRepository extends JpaRepository<QuestionnaireLevel, Long> {
-}
diff --git a/src/main/java/com/example/demo/repository/QuestionnairePhaseRepository.java b/src/main/java/com/example/demo/repository/QuestionnairePhaseRepository.java
new file mode 100644
index 00000000..268cdd53
--- /dev/null
+++ b/src/main/java/com/example/demo/repository/QuestionnairePhaseRepository.java
@@ -0,0 +1,7 @@
+package com.example.demo.repository;
+
+import com.example.demo.domain.QuestionnairePhase;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface QuestionnairePhaseRepository extends JpaRepository<QuestionnairePhase, Long> {
+}
diff --git a/src/main/java/com/example/demo/service/QuestionService.java b/src/main/java/com/example/demo/service/QuestionService.java
index dc9b163c..e978bc0b 100644
--- a/src/main/java/com/example/demo/service/QuestionService.java
+++ b/src/main/java/com/example/demo/service/QuestionService.java
@@ -1,13 +1,12 @@
 package com.example.demo.service;
 
 import com.example.demo.domain.Question;
-import com.example.demo.domain.QuestionChoice;
-import com.example.demo.domain.QuestionnaireLevel;
+import com.example.demo.domain.QuestionnairePhase;
 import com.example.demo.dto.QuestionDto;
 import com.example.demo.enums.QuestionType;
 import com.example.demo.mapper.BeanMapper;
 import com.example.demo.repository.QuestionRepository;
-import com.example.demo.repository.QuestionnaireLevelRepository;
+import com.example.demo.repository.QuestionnairePhaseRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,14 +20,14 @@ public class QuestionService {
     private static final Logger LOG = LoggerFactory.getLogger(QuestionService.class);
 
     @Autowired
-    private QuestionnaireLevelRepository questionnaireLevelRepository;
+    private QuestionnairePhaseRepository questionnairePhaseRepository;
 
     @Autowired
     private QuestionRepository questionRepository;
 
     public QuestionDto createDefaultQuestion(Long questionnaireId, QuestionType questionType) {
-        Optional<QuestionnaireLevel> questionnaireLevel = questionnaireLevelRepository.findById(questionnaireId);
-        if (questionnaireLevel.isEmpty()) {
+        Optional<QuestionnairePhase> questionnairePhase = questionnairePhaseRepository.findById(questionnaireId);
+        if (questionnairePhase.isEmpty()) {
             // TODO return 404
             return null;
         }
@@ -36,7 +35,7 @@ public class QuestionService {
         Question question = new Question();
         question.setText("Title of question");
         question.setQuestionType(questionType);
-        question.setQuestionnaireLevel(questionnaireLevel.get());
+        question.setQuestionnairePhase(questionnairePhase.get());
         question.setOrder(questionRepository.getCurrentMaxOrder(questionnaireId) + 1);
 
         Question persistedEntity = questionRepository.save(question);
@@ -54,7 +53,7 @@ public class QuestionService {
         }
 
         question.setChoices(persistedQuestion.get().getChoices());
-        question.setQuestionnaireLevel(persistedQuestion.get().getQuestionnaireLevel());
+        question.setQuestionnairePhase(persistedQuestion.get().getQuestionnairePhase());
         question.setOrder(persistedQuestion.get().getOrder());
 
         Question savedEntity = questionRepository.save(question);
@@ -71,7 +70,7 @@ public class QuestionService {
         }
 
         int questionOrder = question.get().getOrder();
-        questionRepository.decreaseOrderAfterQuestionWasDeleted(questionOrder, question.get().getQuestionnaireLevel().getId());
+        questionRepository.decreaseOrderAfterQuestionWasDeleted(questionOrder, question.get().getQuestionnairePhase().getId());
 
         questionRepository.delete(question.get());
     }
diff --git a/src/main/java/com/example/demo/service/QuestionnaireLevelService.java b/src/main/java/com/example/demo/service/QuestionnaireLevelService.java
deleted file mode 100644
index 288f9f5d..00000000
--- a/src/main/java/com/example/demo/service/QuestionnaireLevelService.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.example.demo.service;
-
-import com.example.demo.domain.QuestionnaireLevel;
-import com.example.demo.dto.QuestionnaireLevelDto;
-import com.example.demo.dto.QuestionnaireUpdateDto;
-import com.example.demo.mapper.BeanMapper;
-import com.example.demo.repository.AbstractPhaseRepository;
-import com.example.demo.repository.QuestionnaireLevelRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.Optional;
-
-@Service
-public class QuestionnaireLevelService {
-
-    private static final Logger LOG = LoggerFactory.getLogger(QuestionnaireLevelService.class);
-
-    @Autowired
-    private QuestionnaireLevelRepository questionnaireLevelRepository;
-
-    @Autowired
-    private AbstractPhaseRepository abstractPhaseRepository;
-
-    public QuestionnaireLevelDto createDefaultQuestionnaireLevel(Long trainingDefinitionId) {
-
-        QuestionnaireLevel questionnaireLevel =new QuestionnaireLevel();
-        questionnaireLevel.setTitle("Title of questionnaire level");
-        questionnaireLevel.setTrainingDefinitionId(trainingDefinitionId);
-        questionnaireLevel.setOrder(abstractPhaseRepository.getCurrentMaxOrder(trainingDefinitionId) + 1);
-
-        QuestionnaireLevel persistedEntity = questionnaireLevelRepository.save(questionnaireLevel);
-
-        return BeanMapper.INSTANCE.toDto(persistedEntity);
-    }
-
-    public QuestionnaireLevelDto updateQuestion(QuestionnaireLevel questionnaireLevel) {
-        Optional<QuestionnaireLevel> persistedQuestion = questionnaireLevelRepository.findById(questionnaireLevel.getId());
-
-        if (persistedQuestion.isEmpty()) {
-            // TODO return 404
-            LOG.error("No questionnaire level found with ID {}.", questionnaireLevel.getId());
-            return new QuestionnaireLevelDto();
-        }
-
-        questionnaireLevel.setTrainingDefinitionId(persistedQuestion.get().getTrainingDefinitionId());
-        questionnaireLevel.setQuestions(persistedQuestion.get().getQuestions());
-        questionnaireLevel.setOrder(persistedQuestion.get().getOrder());
-
-        QuestionnaireLevel savedEntity = questionnaireLevelRepository.save(questionnaireLevel);
-
-        return BeanMapper.INSTANCE.toDto(savedEntity);
-    }
-
-    public QuestionnaireLevelDto updateQuestionnairePhase(Long definitionId, Long phaseId, QuestionnaireUpdateDto questionnaireUpdateDto) {
-        QuestionnaireLevel questionnaireLevel = BeanMapper.INSTANCE.toEntity(questionnaireUpdateDto);
-        questionnaireLevel.setId(phaseId);
-
-        QuestionnaireLevel persistedQuestionnairePhase = questionnaireLevelRepository.findById(questionnaireLevel.getId())
-                .orElseThrow(() -> new RuntimeException("Questionnaire phase was not found"));
-        // TODO throw proper exception once kypo2-training is migrated
-
-        // TODO add check to trainingDefinitionId and phaseId (field structure will be probably changed);
-
-
-        questionnaireLevel.setTrainingDefinitionId(persistedQuestionnairePhase.getTrainingDefinitionId());
-        questionnaireLevel.setOrder(persistedQuestionnairePhase.getOrder());
-
-        // TODO questions, their choices and realtions among questions and training phases must be set here
-
-        QuestionnaireLevel savedEntity = questionnaireLevelRepository.save(questionnaireLevel);
-
-        return BeanMapper.INSTANCE.toDto(savedEntity);
-    }
-}
diff --git a/src/main/java/com/example/demo/service/QuestionnairePhaseService.java b/src/main/java/com/example/demo/service/QuestionnairePhaseService.java
new file mode 100644
index 00000000..35eab60c
--- /dev/null
+++ b/src/main/java/com/example/demo/service/QuestionnairePhaseService.java
@@ -0,0 +1,77 @@
+package com.example.demo.service;
+
+import com.example.demo.domain.QuestionnairePhase;
+import com.example.demo.dto.QuestionnairePhaseDto;
+import com.example.demo.dto.QuestionnaireUpdateDto;
+import com.example.demo.mapper.BeanMapper;
+import com.example.demo.repository.AbstractPhaseRepository;
+import com.example.demo.repository.QuestionnairePhaseRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+
+@Service
+public class QuestionnairePhaseService {
+
+    private static final Logger LOG = LoggerFactory.getLogger(QuestionnairePhaseService.class);
+
+    @Autowired
+    private QuestionnairePhaseRepository questionnairePhaseRepository;
+
+    @Autowired
+    private AbstractPhaseRepository abstractPhaseRepository;
+
+    public QuestionnairePhaseDto createDefaultQuestionnairePhase(Long trainingDefinitionId) {
+
+        QuestionnairePhase questionnairePhase =new QuestionnairePhase();
+        questionnairePhase.setTitle("Title of questionnaire level");
+        questionnairePhase.setTrainingDefinitionId(trainingDefinitionId);
+        questionnairePhase.setOrder(abstractPhaseRepository.getCurrentMaxOrder(trainingDefinitionId) + 1);
+
+        QuestionnairePhase persistedEntity = questionnairePhaseRepository.save(questionnairePhase);
+
+        return BeanMapper.INSTANCE.toDto(persistedEntity);
+    }
+
+    public QuestionnairePhaseDto updateQuestion(QuestionnairePhase questionnairePhase) {
+        Optional<QuestionnairePhase> persistedQuestion = questionnairePhaseRepository.findById(questionnairePhase.getId());
+
+        if (persistedQuestion.isEmpty()) {
+            // TODO return 404
+            LOG.error("No questionnaire level found with ID {}.", questionnairePhase.getId());
+            return new QuestionnairePhaseDto();
+        }
+
+        questionnairePhase.setTrainingDefinitionId(persistedQuestion.get().getTrainingDefinitionId());
+        questionnairePhase.setQuestions(persistedQuestion.get().getQuestions());
+        questionnairePhase.setOrder(persistedQuestion.get().getOrder());
+
+        QuestionnairePhase savedEntity = questionnairePhaseRepository.save(questionnairePhase);
+
+        return BeanMapper.INSTANCE.toDto(savedEntity);
+    }
+
+    public QuestionnairePhaseDto updateQuestionnairePhase(Long definitionId, Long phaseId, QuestionnaireUpdateDto questionnaireUpdateDto) {
+        QuestionnairePhase questionnairePhase = BeanMapper.INSTANCE.toEntity(questionnaireUpdateDto);
+        questionnairePhase.setId(phaseId);
+
+        QuestionnairePhase persistedQuestionnairePhase = questionnairePhaseRepository.findById(questionnairePhase.getId())
+                .orElseThrow(() -> new RuntimeException("Questionnaire phase was not found"));
+        // TODO throw proper exception once kypo2-training is migrated
+
+        // TODO add check to trainingDefinitionId and phaseId (field structure will be probably changed);
+
+
+        questionnairePhase.setTrainingDefinitionId(persistedQuestionnairePhase.getTrainingDefinitionId());
+        questionnairePhase.setOrder(persistedQuestionnairePhase.getOrder());
+
+        // TODO questions, their choices and realtions among questions and training phases must be set here
+
+        QuestionnairePhase savedEntity = questionnairePhaseRepository.save(questionnairePhase);
+
+        return BeanMapper.INSTANCE.toDto(savedEntity);
+    }
+}
-- 
GitLab