diff --git a/src/main/java/com/example/demo/controller/PhasesController.java b/src/main/java/com/example/demo/controller/PhasesController.java index 26e398c45ded63a0dc5eff2e7b101bf0fe5a64a5..20f3370a8fb1c0464d0d3729ceb2b09f8b3a252d 100644 --- a/src/main/java/com/example/demo/controller/PhasesController.java +++ b/src/main/java/com/example/demo/controller/PhasesController.java @@ -4,8 +4,8 @@ import com.example.demo.dto.BaseLevelDto; import com.example.demo.dto.InfoPhaseDto; import com.example.demo.dto.InfoPhaseUpdateDto; import com.example.demo.dto.PhaseCreateDTO; -import com.example.demo.dto.PhaseLevelDto; -import com.example.demo.dto.PhaseLevelUpdateDto; +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; @@ -161,7 +161,7 @@ public class PhasesController { @ApiOperation(httpMethod = "PUT", value = "Update training phase", nickname = "updateTrainingPhase", - response = PhaseLevelDto.class, + response = TrainingPhaseDto.class, consumes = MediaType.APPLICATION_JSON_VALUE ) @ApiResponses(value = { @@ -169,15 +169,15 @@ public class PhasesController { @ApiResponse(code = 500, message = "Unexpected application error") }) @PutMapping(path = "/{phaseId}/training") - public ResponseEntity<PhaseLevelDto> updateTrainingPhase( + public ResponseEntity<TrainingPhaseDto> updateTrainingPhase( @ApiParam(value = "Training definition ID", required = true) @PathVariable(name = "definitionId") Long definitionId, @ApiParam(value = "Phase ID", required = true) @PathVariable("phaseId") Long phaseId, @ApiParam(value = "Training phase to be updated") - @RequestBody @Valid PhaseLevelUpdateDto phaseLevelUpdateDto) { + @RequestBody @Valid TrainingPhaseUpdateDto trainingPhaseUpdateDto) { - PhaseLevelDto updatedTrainingPhase = trainingPhaseFacade.updateTrainingPhase(definitionId, phaseId, phaseLevelUpdateDto); + TrainingPhaseDto updatedTrainingPhase = trainingPhaseFacade.updateTrainingPhase(definitionId, phaseId, trainingPhaseUpdateDto); return new ResponseEntity<>(updatedTrainingPhase, HttpStatus.OK); } diff --git a/src/main/java/com/example/demo/domain/BaseLevel.java b/src/main/java/com/example/demo/domain/BaseLevel.java index 9f94a94ea23daf4cbb6085b87a92afdc807d1725..58119c0a0f882c6c828478cef67eddfc6a08b385 100644 --- a/src/main/java/com/example/demo/domain/BaseLevel.java +++ b/src/main/java/com/example/demo/domain/BaseLevel.java @@ -30,8 +30,8 @@ public abstract class BaseLevel { @Column(name = "order_in_training_definition", nullable = false) private Integer order; - @ManyToOne(fetch = FetchType.LAZY) - private PhaseLevel phaseLevel; +// @ManyToOne(fetch = FetchType.LAZY) +// private TrainingPhase trainingPhase; private Long trainingDefinitionId; @@ -75,13 +75,13 @@ public abstract class BaseLevel { this.id = id; } - public PhaseLevel getPhaseLevel() { - return phaseLevel; - } +// public TrainingPhase getPhaseLevel() { +// return trainingPhase; +// } - public void setPhaseLevel(PhaseLevel phaseLevel) { - this.phaseLevel = phaseLevel; - } +// public void setPhaseLevel(TrainingPhase trainingPhase) { +// this.trainingPhase = trainingPhase; +// } public Long getTrainingDefinitionId() { return trainingDefinitionId; diff --git a/src/main/java/com/example/demo/domain/DecisionMatrixRow.java b/src/main/java/com/example/demo/domain/DecisionMatrixRow.java index 86b787e5687c35aafdda924071a990be0a97b6c6..f45091451877013830ef16da0826be6db4b4a3de 100644 --- a/src/main/java/com/example/demo/domain/DecisionMatrixRow.java +++ b/src/main/java/com/example/demo/domain/DecisionMatrixRow.java @@ -23,7 +23,7 @@ public class DecisionMatrixRow { double WF; @ManyToOne(fetch = FetchType.LAZY) - private PhaseLevel phaseLevel; + private TrainingPhase trainingPhase; public Long getId() { return id; @@ -81,12 +81,12 @@ public class DecisionMatrixRow { this.WF = WF; } - public PhaseLevel getPhaseLevel() { - return phaseLevel; + public TrainingPhase getTrainingPhase() { + return trainingPhase; } - public void setPhaseLevel(PhaseLevel phaseLevel) { - this.phaseLevel = phaseLevel; + public void setTrainingPhase(TrainingPhase trainingPhase) { + this.trainingPhase = trainingPhase; } @Override diff --git a/src/main/java/com/example/demo/domain/Task.java b/src/main/java/com/example/demo/domain/Task.java index e8ab3e06a4c21558ad4173738f719cf5893a6976..2a28026aab2fe4c3c3b25d35181e2b409493bb49 100644 --- a/src/main/java/com/example/demo/domain/Task.java +++ b/src/main/java/com/example/demo/domain/Task.java @@ -3,6 +3,7 @@ package com.example.demo.domain; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; +import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import java.util.List; @@ -16,6 +17,9 @@ public class Task extends BaseLevel { private String solution; private Long incorrectFlagLimit; + @ManyToOne(fetch = FetchType.LAZY) + private TrainingPhase trainingPhase; + // @OrderBy // @OneToMany(mappedBy = "task", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) // private List<Attachment> attachments; @@ -60,6 +64,14 @@ public class Task extends BaseLevel { this.incorrectFlagLimit = incorrectFlagLimit; } + public TrainingPhase getTrainingPhase() { + return trainingPhase; + } + + public void setTrainingPhase(TrainingPhase trainingPhase) { + this.trainingPhase = trainingPhase; + } + @Override public String toString() { return "Task{" + "content='" + content + '\'' + ", flag='" + diff --git a/src/main/java/com/example/demo/domain/PhaseLevel.java b/src/main/java/com/example/demo/domain/TrainingPhase.java similarity index 55% rename from src/main/java/com/example/demo/domain/PhaseLevel.java rename to src/main/java/com/example/demo/domain/TrainingPhase.java index e0d4f63082226b93ed39d0e11fa445ce43a2749b..f2b223e6604a1fdb4d954a5e656a3dabb3055e81 100644 --- a/src/main/java/com/example/demo/domain/PhaseLevel.java +++ b/src/main/java/com/example/demo/domain/TrainingPhase.java @@ -8,22 +8,22 @@ import javax.persistence.OrderBy; import java.util.List; @Entity -public class PhaseLevel extends BaseLevel { +public class TrainingPhase extends BaseLevel { @OrderBy - @OneToMany(mappedBy = "phaseLevel", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) - private List<Task> subLevels; + @OneToMany(mappedBy = "trainingPhase", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) + private List<Task> tasks; @OrderBy - @OneToMany(mappedBy = "phaseLevel", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) + @OneToMany(mappedBy = "trainingPhase", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) private List<DecisionMatrixRow> decisionMatrix; - public List<Task> getSubLevels() { - return subLevels; + public List<Task> getTasks() { + return tasks; } - public void setSubLevels(List<Task> subLevels) { - this.subLevels = subLevels; + public void setTasks(List<Task> subLevels) { + this.tasks = subLevels; } public List<DecisionMatrixRow> getDecisionMatrix() { diff --git a/src/main/java/com/example/demo/dto/PhaseLevelDto.java b/src/main/java/com/example/demo/dto/TrainingPhaseDto.java similarity index 59% rename from src/main/java/com/example/demo/dto/PhaseLevelDto.java rename to src/main/java/com/example/demo/dto/TrainingPhaseDto.java index 7b9aa43c73c2890e9b2418d6b9e413eb368e21dc..9753e3f49f7399225901ee246ae6182de0b5b7d1 100644 --- a/src/main/java/com/example/demo/dto/PhaseLevelDto.java +++ b/src/main/java/com/example/demo/dto/TrainingPhaseDto.java @@ -2,18 +2,18 @@ package com.example.demo.dto; import java.util.List; -public class PhaseLevelDto extends BaseLevelDto { +public class TrainingPhaseDto extends BaseLevelDto { - private List<TaskDto> subLevels; + private List<TaskDto> tasks; private List<DecisionMatrixRowDto> decisionMatrix; - public List<TaskDto> getSubLevels() { - return subLevels; + public List<TaskDto> getTasks() { + return tasks; } - public void setSubLevels(List<TaskDto> subLevels) { - this.subLevels = subLevels; + public void setTasks(List<TaskDto> tasks) { + this.tasks = tasks; } public List<DecisionMatrixRowDto> getDecisionMatrix() { diff --git a/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java b/src/main/java/com/example/demo/dto/TrainingPhaseUpdateDto.java similarity index 98% rename from src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java rename to src/main/java/com/example/demo/dto/TrainingPhaseUpdateDto.java index 3777a3bd68a3c2e221748e9490310381c3ecf80f..ffb4138eec631596cf788e56ac5061c55575512e 100644 --- a/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java +++ b/src/main/java/com/example/demo/dto/TrainingPhaseUpdateDto.java @@ -7,7 +7,7 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; import java.util.List; -public class PhaseLevelUpdateDto { +public class TrainingPhaseUpdateDto { @ApiModelProperty(value = "Short description of training phase", required = true, example = "Training phase title") @NotEmpty(message = "Training phase title must not be blank") diff --git a/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java b/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java index a27439ae297c50c572993f41b309936fdd3c75aa..a2ca2b853d202859105463944fbfec5ff200e970 100644 --- a/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java +++ b/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java @@ -4,13 +4,13 @@ import com.example.demo.dto.BaseLevelDto; import com.example.demo.dto.InfoPhaseDto; import com.example.demo.dto.InfoPhaseUpdateDto; import com.example.demo.dto.PhaseCreateDTO; -import com.example.demo.dto.PhaseLevelDto; -import com.example.demo.dto.PhaseLevelUpdateDto; +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.PhaseLevelService; +import com.example.demo.service.TrainingPhaseService; import com.example.demo.service.PhaseService; import com.example.demo.service.QuestionnaireLevelService; import org.springframework.beans.factory.annotation.Autowired; @@ -32,7 +32,7 @@ public class TrainingPhaseFacade { private QuestionnaireLevelService questionnaireLevelService; @Autowired - private PhaseLevelService phaseLevelService; + private TrainingPhaseService trainingPhaseService; public BaseLevelDto createPhase(Long trainingDefinitionId, PhaseCreateDTO phaseCreateDTO) { BaseLevelDto baseLevelDto; @@ -41,7 +41,7 @@ public class TrainingPhaseFacade { } else if (PhaseType.QUESTIONNAIRE.equals(phaseCreateDTO.getPhaseType())) { baseLevelDto = questionnaireLevelService.createDefaultQuestionnaireLevel(trainingDefinitionId); } else { - baseLevelDto = phaseLevelService.createDefaultPhaseLevel(trainingDefinitionId); + baseLevelDto = trainingPhaseService.createDefaultTrainingPhase(trainingDefinitionId); } baseLevelDto.setPhaseType(phaseCreateDTO.getPhaseType()); @@ -71,8 +71,8 @@ public class TrainingPhaseFacade { return infoPhaseService.updateInfoPhase(definitionId, phaseId, infoPhaseUpdateDto); } - public PhaseLevelDto updateTrainingPhase(Long definitionId, Long phaseId, PhaseLevelUpdateDto trainingPhaseUpdate) { - return phaseLevelService.updatePhaseLevel(definitionId, phaseId, trainingPhaseUpdate); + public TrainingPhaseDto updateTrainingPhase(Long definitionId, Long phaseId, TrainingPhaseUpdateDto trainingPhaseUpdate) { + return trainingPhaseService.updateTrainingPhase(definitionId, phaseId, trainingPhaseUpdate); } public QuestionnaireLevelDto updateQuestionnairePhase(Long definitionId, Long phaseId, QuestionnaireUpdateDto questionnaireUpdateDto) { diff --git a/src/main/java/com/example/demo/mapper/BeanMapper.java b/src/main/java/com/example/demo/mapper/BeanMapper.java index 13ec5117ebb7478bc065d9179e5fe57283057173..7cfc42c4171b6eb3972ae4567943a67a6722bf1c 100644 --- a/src/main/java/com/example/demo/mapper/BeanMapper.java +++ b/src/main/java/com/example/demo/mapper/BeanMapper.java @@ -4,7 +4,7 @@ import com.example.demo.domain.Attachment; import com.example.demo.domain.BaseLevel; import com.example.demo.domain.DecisionMatrixRow; import com.example.demo.domain.InfoPhase; -import com.example.demo.domain.PhaseLevel; +import com.example.demo.domain.TrainingPhase; import com.example.demo.domain.Question; import com.example.demo.domain.QuestionChoice; import com.example.demo.domain.QuestionnaireLevel; @@ -14,8 +14,8 @@ import com.example.demo.dto.BaseLevelDto; import com.example.demo.dto.DecisionMatrixRowDto; import com.example.demo.dto.InfoPhaseDto; import com.example.demo.dto.InfoPhaseUpdateDto; -import com.example.demo.dto.PhaseLevelDto; -import com.example.demo.dto.PhaseLevelUpdateDto; +import com.example.demo.dto.TrainingPhaseDto; +import com.example.demo.dto.TrainingPhaseUpdateDto; import com.example.demo.dto.QuestionChoiceDto; import com.example.demo.dto.QuestionChoiceUpdateDto; import com.example.demo.dto.QuestionDto; @@ -28,7 +28,6 @@ import com.example.demo.dto.TaskUpdateDto; import com.example.demo.dto.input.GameDefinitionCreateDto; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -import org.mapstruct.MappingTarget; import org.mapstruct.factory.Mappers; import java.util.List; @@ -41,8 +40,8 @@ public interface BeanMapper { default BaseLevelDto toDto(BaseLevel baseLevel) { BaseLevelDto baseLevelDto; - if (baseLevel instanceof PhaseLevel) { - baseLevelDto = toDto((PhaseLevel) baseLevel); + if (baseLevel instanceof TrainingPhase) { + baseLevelDto = toDto((TrainingPhase) baseLevel); } else if (baseLevel instanceof InfoPhase) { baseLevelDto = toDto((InfoPhase) baseLevel); } else if (baseLevel instanceof Task) { @@ -77,24 +76,14 @@ public interface BeanMapper { Attachment toEntity(AttachmentDto attachment); @Mapping(target = "phaseType", constant = "GAME") - PhaseLevelDto toDto(PhaseLevel phaseLevel); + TrainingPhaseDto toDto(TrainingPhase trainingPhase); - PhaseLevel toEntity(PhaseLevelDto phaseLevel); + TrainingPhase toEntity(TrainingPhaseDto trainingPhaseDto); - PhaseLevel toEntity(PhaseLevelUpdateDto phaseLevelUpdateDto); + TrainingPhase toEntity(TrainingPhaseUpdateDto trainingPhaseUpdateDto); Task toGameLevel(GameDefinitionCreateDto gameDefinitionCreateDto); - PhaseLevel toPhaseLevel(GameDefinitionCreateDto gameDefinitionCreateDto); - - @Mapping(target = "phaseLevel", ignore = true) -// @Mapping(target = "attachments", ignore = true) - // TODO not really sure about this - Task updateTask(@MappingTarget Task task, GameDefinitionCreateDto gameDefinitionCreateDto); - - @Mapping(target = "subLevels", ignore = true) - PhaseLevel updatePhaseLevel(@MappingTarget PhaseLevel phaseLevel, GameDefinitionCreateDto gameDefinitionCreateDto); - // @Mapping(target = "type", constant = "task") GameDefinitionCreateDto toLevelDefinitionDto(Task task); @@ -102,7 +91,7 @@ public interface BeanMapper { GameDefinitionCreateDto toLevelDefinitionDto(InfoPhase infoPhase); // @Mapping(target = "type", constant = "phase") - GameDefinitionCreateDto toLevelDefinitionDto(PhaseLevel phaseLevel); + GameDefinitionCreateDto toLevelDefinitionDto(TrainingPhase trainingPhase); DecisionMatrixRow toEntity(DecisionMatrixRowDto decisionMatrixRowDto); diff --git a/src/main/java/com/example/demo/repository/PhaseLevelRepository.java b/src/main/java/com/example/demo/repository/PhaseLevelRepository.java deleted file mode 100644 index f71587d1ca678c15d6c9d89a240505f1e8d070a1..0000000000000000000000000000000000000000 --- a/src/main/java/com/example/demo/repository/PhaseLevelRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.demo.repository; - -import com.example.demo.domain.PhaseLevel; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; - -public interface PhaseLevelRepository extends JpaRepository<PhaseLevel, Long> { - - @Query("SELECT COUNT(p.id) FROM PhaseLevel p WHERE p.trainingDefinitionId = :trainingDefinitionId") - int getNumberOfExistingPhases(@Param("trainingDefinitionId") Long trainingDefinitionId); - - List<PhaseLevel> findAllByTrainingDefinitionIdOrderByOrder(Long trainingDefinitionId); -} diff --git a/src/main/java/com/example/demo/repository/TaskRepository.java b/src/main/java/com/example/demo/repository/TaskRepository.java index 7fa3776911456960bd06bbdfe42897c17724a43e..91642c889971b857b736931955735b71521ba2a6 100644 --- a/src/main/java/com/example/demo/repository/TaskRepository.java +++ b/src/main/java/com/example/demo/repository/TaskRepository.java @@ -9,14 +9,14 @@ import org.springframework.transaction.annotation.Transactional; public interface TaskRepository extends JpaRepository<Task, Long> { - @Query("SELECT COALESCE(MAX(g.order), -1) FROM Task g WHERE g.phaseLevel.id = :phaseId") + @Query("SELECT COALESCE(MAX(g.order), -1) FROM Task g WHERE g.trainingPhase.id = :phaseId") Integer getCurrentMaxOrder(@Param("phaseId") Long phaseId); @Transactional @Modifying @Query("UPDATE Task t SET t.order = t.order - 1 " + - "WHERE t.phaseLevel.id = :gamePhaseId " + + "WHERE t.trainingPhase.id = :trainingPhaseId " + "AND t.order > :order ") - void decreaseOrderAfterTaskWasDeleted(@Param("gamePhaseId") Long gamePhaseId, + void decreaseOrderAfterTaskWasDeleted(@Param("trainingPhaseId") Long trainingPhaseId, @Param("order") int order); } diff --git a/src/main/java/com/example/demo/repository/TrainingPhaseRepository.java b/src/main/java/com/example/demo/repository/TrainingPhaseRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..eee479058627befc3129ba0b059dac4b1d3816da --- /dev/null +++ b/src/main/java/com/example/demo/repository/TrainingPhaseRepository.java @@ -0,0 +1,16 @@ +package com.example.demo.repository; + +import com.example.demo.domain.TrainingPhase; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface TrainingPhaseRepository extends JpaRepository<TrainingPhase, Long> { + + @Query("SELECT COUNT(p.id) FROM TrainingPhase p WHERE p.trainingDefinitionId = :trainingDefinitionId") + int getNumberOfExistingPhases(@Param("trainingDefinitionId") Long trainingDefinitionId); + + List<TrainingPhase> findAllByTrainingDefinitionIdOrderByOrder(Long trainingDefinitionId); +} diff --git a/src/main/java/com/example/demo/service/LevelOperationsService.java b/src/main/java/com/example/demo/service/LevelOperationsService.java index 001be757d64362ff08d169c5e9616e821d05c970..9abfb7a9c2f00ca6eb963d24ea853d7d49d6b0dd 100644 --- a/src/main/java/com/example/demo/service/LevelOperationsService.java +++ b/src/main/java/com/example/demo/service/LevelOperationsService.java @@ -32,7 +32,7 @@ public class LevelOperationsService { private QuestionnaireLevelService questionnaireLevelService; @Autowired - private PhaseLevelService phaseLevelService; + private TrainingPhaseService trainingPhaseService; @Autowired private TaskService taskService; diff --git a/src/main/java/com/example/demo/service/PhaseLevelService.java b/src/main/java/com/example/demo/service/PhaseLevelService.java deleted file mode 100644 index 9b19e0db88a26dc771060f001e501b9b1df25817..0000000000000000000000000000000000000000 --- a/src/main/java/com/example/demo/service/PhaseLevelService.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.example.demo.service; - -import com.example.demo.domain.BaseLevel; -import com.example.demo.domain.DecisionMatrixRow; -import com.example.demo.domain.PhaseLevel; -import com.example.demo.dto.PhaseLevelDto; -import com.example.demo.dto.PhaseLevelUpdateDto; -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.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -@Service -public class PhaseLevelService { - - private static final Logger LOG = LoggerFactory.getLogger(PhaseLevelService.class); - - @Autowired - private PhaseLevelRepository phaseLevelRepository; - - @Autowired - private BaseLevelRepository baseLevelRepository; - - public PhaseLevelDto createDefaultPhaseLevel(Long trainingDefinitionId) { - - PhaseLevel phaseLevel = new PhaseLevel(); - phaseLevel.setTitle("Title of phase level"); - phaseLevel.setTrainingDefinitionId(trainingDefinitionId); - phaseLevel.setOrder(baseLevelRepository.getCurrentMaxOrder(trainingDefinitionId) + 1); - - phaseLevel.setDecisionMatrix(prepareDefaultDecisionMatrix(trainingDefinitionId, phaseLevel)); - - PhaseLevel persistedEntity = phaseLevelRepository.save(phaseLevel); - - return BeanMapper.INSTANCE.toDto(persistedEntity); - } - - public PhaseLevelDto updatePhaseLevel(Long definitionId, Long phaseId, PhaseLevelUpdateDto trainingPhaseUpdate) { - PhaseLevel phaseLevel = BeanMapper.INSTANCE.toEntity(trainingPhaseUpdate); - phaseLevel.setId(phaseId); - - PhaseLevel persistedPhaseLevel = phaseLevelRepository.findById(phaseLevel.getId()) - .orElseThrow(() -> new RuntimeException("Training 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); - - phaseLevel.setTrainingDefinitionId(persistedPhaseLevel.getTrainingDefinitionId()); - phaseLevel.setOrder(persistedPhaseLevel.getOrder()); - phaseLevel.setSubLevels(persistedPhaseLevel.getSubLevels()); - - if (!CollectionUtils.isEmpty(phaseLevel.getDecisionMatrix())) { - phaseLevel.getDecisionMatrix().forEach(x -> x.setPhaseLevel(phaseLevel)); - } - - PhaseLevel savedEntity = phaseLevelRepository.save(phaseLevel); - - return BeanMapper.INSTANCE.toDto(savedEntity); - } - - public void alignDecisionMatrixForPhasesInTrainingDefinition(Long trainingDefinitionId) { - List<PhaseLevel> phaseLevels = phaseLevelRepository.findAllByTrainingDefinitionIdOrderByOrder(trainingDefinitionId); - - int currentPhaseOrder = 0; - for (PhaseLevel phaseLevel : phaseLevels) { - alignDecisionMatrixForPhase(phaseLevel, currentPhaseOrder); - currentPhaseOrder++; - } - } - - private List<DecisionMatrixRow> prepareDefaultDecisionMatrix(Long trainingDefinitionId, PhaseLevel phaseLevel) { - List<DecisionMatrixRow> result = new ArrayList<>(); - - int numberOfExistingPhases = phaseLevelRepository.getNumberOfExistingPhases(trainingDefinitionId); - - // number of rows should be equal to number of existing phases + 1 - for (int i = 0; i <= numberOfExistingPhases; i++) { - DecisionMatrixRow decisionMatrixRow = new DecisionMatrixRow(); - decisionMatrixRow.setPhaseLevel(phaseLevel); - decisionMatrixRow.setOrder(i); - - result.add(decisionMatrixRow); - } - - return result; - } - - private void alignDecisionMatrixForPhase(PhaseLevel phaseLevel, int currentPhaseOrder) { - if (Objects.isNull(phaseLevel)) { - return; - } - - int numberOfRows = 0; - if (!CollectionUtils.isEmpty(phaseLevel.getDecisionMatrix())) { - numberOfRows = phaseLevel.getDecisionMatrix().size(); - } - - final int expectedNumberOfRows = currentPhaseOrder + 1; - - if (numberOfRows == expectedNumberOfRows) { - return; - } else if (numberOfRows < expectedNumberOfRows) { - List<DecisionMatrixRow> newDecisionMatrixRows = getNewDecisionMatrixRows(numberOfRows, expectedNumberOfRows, phaseLevel); - phaseLevel.getDecisionMatrix().addAll(newDecisionMatrixRows); - } else { - List<DecisionMatrixRow> neededDecisionMatrixRows = getOnlyNeededDecisionMatrixRows(expectedNumberOfRows, phaseLevel); - - phaseLevel.getDecisionMatrix().clear(); - phaseLevel.getDecisionMatrix().addAll(neededDecisionMatrixRows); - } - - phaseLevelRepository.save(phaseLevel); - } - - private List<DecisionMatrixRow> getNewDecisionMatrixRows(int currentNumberOfNewRows, int expectedNumberOfRows, PhaseLevel phaseLevel) { - List<DecisionMatrixRow> result = new ArrayList<>(); - for (int i = currentNumberOfNewRows; i < expectedNumberOfRows; i++) { - DecisionMatrixRow decisionMatrixRow = new DecisionMatrixRow(); - decisionMatrixRow.setPhaseLevel(phaseLevel); - decisionMatrixRow.setOrder(i); - - result.add(decisionMatrixRow); - } - - return result; - } - - private List<DecisionMatrixRow> getOnlyNeededDecisionMatrixRows(int expectedNumberOfRows, PhaseLevel phaseLevel) { - List<DecisionMatrixRow> decisionMatrix = phaseLevel.getDecisionMatrix(); - - return decisionMatrix.stream() - .sorted(Comparator.comparingInt(DecisionMatrixRow::getOrder)) - .limit(expectedNumberOfRows) - .collect(Collectors.toList()); - - } -} diff --git a/src/main/java/com/example/demo/service/PhaseService.java b/src/main/java/com/example/demo/service/PhaseService.java index d575252771a06dcd02b66ddc061d42f3459e9919..5e40ff9877314c0b675d0b08bbd2485ea82bae60 100644 --- a/src/main/java/com/example/demo/service/PhaseService.java +++ b/src/main/java/com/example/demo/service/PhaseService.java @@ -1,7 +1,6 @@ package com.example.demo.service; import com.example.demo.domain.BaseLevel; -import com.example.demo.domain.PhaseLevel; import com.example.demo.dto.BaseLevelDto; import com.example.demo.mapper.BeanMapper; import com.example.demo.repository.BaseLevelRepository; @@ -18,7 +17,7 @@ public class PhaseService { private BaseLevelRepository baseLevelRepository; @Autowired - private PhaseLevelService phaseLevelService; + private TrainingPhaseService trainingPhaseService; @Transactional public void deletePhase(Long definitionId, Long phaseId) { @@ -73,7 +72,7 @@ public class PhaseService { levelFrom.setOrder(newPosition); baseLevelRepository.save(levelFrom); - phaseLevelService.alignDecisionMatrixForPhasesInTrainingDefinition(levelFrom.getTrainingDefinitionId()); + trainingPhaseService.alignDecisionMatrixForPhasesInTrainingDefinition(levelFrom.getTrainingDefinitionId()); } } diff --git a/src/main/java/com/example/demo/service/TaskService.java b/src/main/java/com/example/demo/service/TaskService.java index 166e48abfe38af1f3e5f943d3bb9ba0f577d40da..832c282ffecf90f3e53a4303e413e5365079c1b8 100644 --- a/src/main/java/com/example/demo/service/TaskService.java +++ b/src/main/java/com/example/demo/service/TaskService.java @@ -1,12 +1,12 @@ package com.example.demo.service; -import com.example.demo.domain.PhaseLevel; +import com.example.demo.domain.TrainingPhase; import com.example.demo.domain.Task; import com.example.demo.dto.TaskCreateDto; import com.example.demo.dto.TaskDto; import com.example.demo.dto.TaskUpdateDto; import com.example.demo.mapper.BeanMapper; -import com.example.demo.repository.PhaseLevelRepository; +import com.example.demo.repository.TrainingPhaseRepository; import com.example.demo.repository.TaskRepository; import org.apache.commons.collections4.IterableUtils; import org.slf4j.Logger; @@ -24,16 +24,16 @@ public class TaskService { private static final Logger LOG = LoggerFactory.getLogger(TaskService.class); private final TaskRepository taskRepository; - private final PhaseLevelRepository phaseLevelRepository; + private final TrainingPhaseRepository trainingPhaseRepository; @Autowired - public TaskService(TaskRepository taskRepository, PhaseLevelRepository phaseLevelRepository) { + public TaskService(TaskRepository taskRepository, TrainingPhaseRepository trainingPhaseRepository) { this.taskRepository = taskRepository; - this.phaseLevelRepository = phaseLevelRepository; + this.trainingPhaseRepository = trainingPhaseRepository; } public TaskDto createDefaultTask(Long trainingDefinitionId, Long phaseId) { - PhaseLevel gamePhase = phaseLevelRepository.findById(phaseId) + TrainingPhase trainingPhase = trainingPhaseRepository.findById(phaseId) .orElseThrow(() -> new RuntimeException("Game phase was not found")); // TODO throw proper exception once kypo2-training is migrated @@ -41,7 +41,7 @@ public class TaskService { Task task = new Task(); task.setTitle("Title of task"); - task.setPhaseLevel(gamePhase); + task.setTrainingPhase(trainingPhase); task.setOrder(taskRepository.getCurrentMaxOrder(phaseId) + 1); Task persistedEntity = taskRepository.save(task); @@ -54,7 +54,7 @@ public class TaskService { .orElseThrow(() -> new RuntimeException("Task was not found")); // TODO throw proper exception once kypo2-training is migrated - PhaseLevel gamePhase = phaseLevelRepository.findById(phaseId) + TrainingPhase trainingPhase = trainingPhaseRepository.findById(phaseId) .orElseThrow(() -> new RuntimeException("Game phase was not found")); // TODO add check to trainingDefinitionId (field structure will be probably changed) @@ -63,7 +63,7 @@ public class TaskService { BeanUtils.copyProperties(taskToBeCloned, task); task.setId(null); - task.setPhaseLevel(gamePhase); + task.setTrainingPhase(trainingPhase); task.setOrder(taskRepository.getCurrentMaxOrder(phaseId) + 1); Task persistedEntity = taskRepository.save(task); @@ -114,7 +114,7 @@ public class TaskService { // TODO add check to trainingDefinitionId and phaseId (field structure will be probably changed) - taskUpdate.setPhaseLevel(persistedTask.getPhaseLevel()); + taskUpdate.setTrainingPhase(persistedTask.getTrainingPhase()); taskUpdate.setTrainingDefinitionId(persistedTask.getTrainingDefinitionId()); taskUpdate.setOrder(persistedTask.getOrder()); diff --git a/src/main/java/com/example/demo/service/TrainingPhaseService.java b/src/main/java/com/example/demo/service/TrainingPhaseService.java new file mode 100644 index 0000000000000000000000000000000000000000..8508f5219b0719f2a49ed7651bcdef9b8dcd0a6d --- /dev/null +++ b/src/main/java/com/example/demo/service/TrainingPhaseService.java @@ -0,0 +1,146 @@ +package com.example.demo.service; + +import com.example.demo.domain.DecisionMatrixRow; +import com.example.demo.domain.TrainingPhase; +import com.example.demo.dto.TrainingPhaseDto; +import com.example.demo.dto.TrainingPhaseUpdateDto; +import com.example.demo.mapper.BeanMapper; +import com.example.demo.repository.BaseLevelRepository; +import com.example.demo.repository.TrainingPhaseRepository; +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.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Service +public class TrainingPhaseService { + + private static final Logger LOG = LoggerFactory.getLogger(TrainingPhaseService.class); + + @Autowired + private TrainingPhaseRepository trainingPhaseRepository; + + @Autowired + private BaseLevelRepository baseLevelRepository; + + public TrainingPhaseDto createDefaultTrainingPhase(Long trainingDefinitionId) { + + TrainingPhase trainingPhase = new TrainingPhase(); + trainingPhase.setTitle("Title of phase level"); + trainingPhase.setTrainingDefinitionId(trainingDefinitionId); + trainingPhase.setOrder(baseLevelRepository.getCurrentMaxOrder(trainingDefinitionId) + 1); + + trainingPhase.setDecisionMatrix(prepareDefaultDecisionMatrix(trainingDefinitionId, trainingPhase)); + + TrainingPhase persistedEntity = trainingPhaseRepository.save(trainingPhase); + + return BeanMapper.INSTANCE.toDto(persistedEntity); + } + + public TrainingPhaseDto updateTrainingPhase(Long definitionId, Long phaseId, TrainingPhaseUpdateDto trainingPhaseUpdate) { + TrainingPhase trainingPhase = BeanMapper.INSTANCE.toEntity(trainingPhaseUpdate); + trainingPhase.setId(phaseId); + + TrainingPhase persistedTrainingPhase = trainingPhaseRepository.findById(trainingPhase.getId()) + .orElseThrow(() -> new RuntimeException("Training 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); + + trainingPhase.setTrainingDefinitionId(persistedTrainingPhase.getTrainingDefinitionId()); + trainingPhase.setOrder(persistedTrainingPhase.getOrder()); + trainingPhase.setTasks(persistedTrainingPhase.getTasks()); + + if (!CollectionUtils.isEmpty(trainingPhase.getDecisionMatrix())) { + trainingPhase.getDecisionMatrix().forEach(x -> x.setTrainingPhase(trainingPhase)); + } + + TrainingPhase savedEntity = trainingPhaseRepository.save(trainingPhase); + + return BeanMapper.INSTANCE.toDto(savedEntity); + } + + public void alignDecisionMatrixForPhasesInTrainingDefinition(Long trainingDefinitionId) { + List<TrainingPhase> trainingPhases = trainingPhaseRepository.findAllByTrainingDefinitionIdOrderByOrder(trainingDefinitionId); + + int currentPhaseOrder = 0; + for (TrainingPhase trainingPhase : trainingPhases) { + alignDecisionMatrixForPhase(trainingPhase, currentPhaseOrder); + currentPhaseOrder++; + } + } + + private List<DecisionMatrixRow> prepareDefaultDecisionMatrix(Long trainingDefinitionId, TrainingPhase trainingPhase) { + List<DecisionMatrixRow> result = new ArrayList<>(); + + int numberOfExistingPhases = trainingPhaseRepository.getNumberOfExistingPhases(trainingDefinitionId); + + // number of rows should be equal to number of existing phases + 1 + for (int i = 0; i <= numberOfExistingPhases; i++) { + DecisionMatrixRow decisionMatrixRow = new DecisionMatrixRow(); + decisionMatrixRow.setTrainingPhase(trainingPhase); + decisionMatrixRow.setOrder(i); + + result.add(decisionMatrixRow); + } + + return result; + } + + private void alignDecisionMatrixForPhase(TrainingPhase trainingPhase, int currentPhaseOrder) { + if (Objects.isNull(trainingPhase)) { + return; + } + + int numberOfRows = 0; + if (!CollectionUtils.isEmpty(trainingPhase.getDecisionMatrix())) { + numberOfRows = trainingPhase.getDecisionMatrix().size(); + } + + final int expectedNumberOfRows = currentPhaseOrder + 1; + + if (numberOfRows == expectedNumberOfRows) { + return; + } else if (numberOfRows < expectedNumberOfRows) { + List<DecisionMatrixRow> newDecisionMatrixRows = getNewDecisionMatrixRows(numberOfRows, expectedNumberOfRows, trainingPhase); + trainingPhase.getDecisionMatrix().addAll(newDecisionMatrixRows); + } else { + List<DecisionMatrixRow> neededDecisionMatrixRows = getOnlyNeededDecisionMatrixRows(expectedNumberOfRows, trainingPhase); + + trainingPhase.getDecisionMatrix().clear(); + trainingPhase.getDecisionMatrix().addAll(neededDecisionMatrixRows); + } + + trainingPhaseRepository.save(trainingPhase); + } + + private List<DecisionMatrixRow> getNewDecisionMatrixRows(int currentNumberOfNewRows, int expectedNumberOfRows, TrainingPhase trainingPhase) { + List<DecisionMatrixRow> result = new ArrayList<>(); + for (int i = currentNumberOfNewRows; i < expectedNumberOfRows; i++) { + DecisionMatrixRow decisionMatrixRow = new DecisionMatrixRow(); + decisionMatrixRow.setTrainingPhase(trainingPhase); + decisionMatrixRow.setOrder(i); + + result.add(decisionMatrixRow); + } + + return result; + } + + private List<DecisionMatrixRow> getOnlyNeededDecisionMatrixRows(int expectedNumberOfRows, TrainingPhase trainingPhase) { + List<DecisionMatrixRow> decisionMatrix = trainingPhase.getDecisionMatrix(); + + return decisionMatrix.stream() + .sorted(Comparator.comparingInt(DecisionMatrixRow::getOrder)) + .limit(expectedNumberOfRows) + .collect(Collectors.toList()); + + } +}