diff --git a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java index b0fe84f10c4ddedc281fab50d3bde5d298791901..98202978a899dcd4850fdf3afc9d2d25d8dce9b2 100644 --- a/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java +++ b/src/main/java/com/example/demo/controller/AdaptiveTrainingDefinitionsRestController.java @@ -1,14 +1,11 @@ package com.example.demo.controller; import com.example.demo.dto.BaseLevelDto; -import com.example.demo.dto.InfoLevelUpdateDto; -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.dto.TaskUpdateDto; import com.example.demo.enums.QuestionType; import com.example.demo.service.LevelOperationsService; import io.swagger.annotations.Api; @@ -46,22 +43,22 @@ public class AdaptiveTrainingDefinitionsRestController { this.levelOperationsService = levelOperationsService; } - @ApiOperation(httpMethod = "PUT", - value = "Move level to specified order", - nickname = "moveLevelToSpecifiedOrder", - produces = MediaType.APPLICATION_JSON_VALUE - ) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Level moved to specified order"), - @ApiResponse(code = 500, message = "Unexpected application error") - }) - @PutMapping(value = "/levels/{levelIdFrom}/move-to/{newPosition}", produces = MediaType.APPLICATION_JSON_VALUE) - public void moveLevelToSpecifiedOrder( - @ApiParam(value = "Level ID - from", required = true) @PathVariable(name = "levelIdFrom") Long levelIdFrom, - @ApiParam(value = "Position (order) to which the level should be moved", required = true) @PathVariable(name = "newPosition") int newPosition) { - - levelOperationsService.moveLevelToSpecifiedOrder(levelIdFrom, newPosition); - } +// @ApiOperation(httpMethod = "PUT", +// value = "Move level to specified order", +// nickname = "moveLevelToSpecifiedOrder", +// produces = MediaType.APPLICATION_JSON_VALUE +// ) +// @ApiResponses(value = { +// @ApiResponse(code = 200, message = "Level moved to specified order"), +// @ApiResponse(code = 500, message = "Unexpected application error") +// }) +// @PutMapping(value = "/levels/{levelIdFrom}/move-to/{newPosition}", produces = MediaType.APPLICATION_JSON_VALUE) +// public void moveLevelToSpecifiedOrder( +// @ApiParam(value = "Level ID - from", required = true) @PathVariable(name = "levelIdFrom") Long levelIdFrom, +// @ApiParam(value = "Position (order) to which the level should be moved", required = true) @PathVariable(name = "newPosition") int newPosition) { +// +// levelOperationsService.moveLevelToSpecifiedOrder(levelIdFrom, newPosition); +// } // @ApiOperation(httpMethod = "DELETE", // value = "Delete a specified level", @@ -115,37 +112,37 @@ public class AdaptiveTrainingDefinitionsRestController { // return levelOperationsService.getLevel(levelId); // } - @ApiOperation(httpMethod = "PUT", - value = "Update info level", - nickname = "updateInfoLevel", - consumes = MediaType.APPLICATION_JSON_VALUE - ) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "Info level updated"), - @ApiResponse(code = 500, message = "Unexpected application error") - }) - @PutMapping(path = "/info-levels") - public void updateInfoLevel( - @ApiParam(value = "Info level to be updated") @RequestBody InfoLevelUpdateDto infoLevelUpdateDto) { - - 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) { +// @ApiOperation(httpMethod = "PUT", +// value = "Update info level", +// nickname = "updateInfoLevel", +// consumes = MediaType.APPLICATION_JSON_VALUE +// ) +// @ApiResponses(value = { +// @ApiResponse(code = 200, message = "Info level updated"), +// @ApiResponse(code = 500, message = "Unexpected application error") +// }) +// @PutMapping(path = "/info-levels") +// public void updateInfoLevel( +// @ApiParam(value = "Info level to be updated") @RequestBody InfoLevelUpdateDto infoLevelUpdateDto) { +// +// levelOperationsService.updateInfoLevel(infoLevelUpdateDto); +// } - levelOperationsService.updatePhaseLevel(phaseLevelUpdateDto); - } +// @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", diff --git a/src/main/java/com/example/demo/controller/PhasesController.java b/src/main/java/com/example/demo/controller/PhasesController.java index 7b8f336b0fff1558a68e757ebf5cb4532bade5e3..ac3ce30b428c84e46c9f4549915329df6e0e5883 100644 --- a/src/main/java/com/example/demo/controller/PhasesController.java +++ b/src/main/java/com/example/demo/controller/PhasesController.java @@ -1,7 +1,11 @@ package com.example.demo.controller; import com.example.demo.dto.BaseLevelDto; +import com.example.demo.dto.InfoLevelDto; +import com.example.demo.dto.InfoLevelUpdateDto; import com.example.demo.dto.PhaseCreateDTO; +import com.example.demo.dto.PhaseLevelDto; +import com.example.demo.dto.PhaseLevelUpdateDto; import com.example.demo.facade.TrainingPhaseFacade; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -13,12 +17,15 @@ 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.CrossOrigin; 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; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; @@ -26,6 +33,8 @@ import java.util.List; @RestController @RequestMapping(value = "/training-definitions/{definitionId}/phases", produces = MediaType.APPLICATION_JSON_VALUE) +@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*", + methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE, RequestMethod.PUT}) @Api(value = "/training-definitions/{definitionId}/phases", tags = "Phases", consumes = MediaType.APPLICATION_JSON_VALUE, @@ -123,4 +132,70 @@ public class PhasesController { return new ResponseEntity<>(remainingPhases, HttpStatus.OK); } + @ApiOperation(httpMethod = "PUT", + value = "Update info phase", + nickname = "updateInfoPhase", + response = InfoLevelDto.class, + consumes = MediaType.APPLICATION_JSON_VALUE + ) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Info phase updated"), + @ApiResponse(code = 500, message = "Unexpected application error") + }) + @PutMapping(path = "/{phaseId}/info") + public ResponseEntity<InfoLevelDto> updateInfoPhase( + @ApiParam(value = "Training definition ID", required = true) + @PathVariable(name = "definitionId") Long definitionId, + @ApiParam(value = "Level ID", required = true) + @PathVariable("phaseId") Long phaseId, + @ApiParam(value = "Info phase to be updated") + @RequestBody @Valid InfoLevelUpdateDto infoLevelUpdateDto) { + + InfoLevelDto updatedInfoPhase = trainingPhaseFacade.updateInfoPhase(definitionId, phaseId, infoLevelUpdateDto); + + return new ResponseEntity<>(updatedInfoPhase, HttpStatus.OK); + } + + @ApiOperation(httpMethod = "PUT", + value = "Update training phase", + nickname = "updateTrainingPhase", + response = PhaseLevelDto.class, + consumes = MediaType.APPLICATION_JSON_VALUE + ) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Training phase updated"), + @ApiResponse(code = 500, message = "Unexpected application error") + }) + @PutMapping(path = "/{phaseId}/training") + public ResponseEntity<PhaseLevelDto> 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) { + + PhaseLevelDto updatedTrainingPhase = trainingPhaseFacade.updateTrainingPhase(definitionId, phaseId, phaseLevelUpdateDto); + + return new ResponseEntity<>(updatedTrainingPhase, HttpStatus.OK); + } + + @ApiOperation(httpMethod = "PUT", + value = "Move phase to specified order", + nickname = "movePhaseToSpecifiedOrder", + produces = MediaType.APPLICATION_JSON_VALUE + ) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Phase moved to specified order"), + @ApiResponse(code = 500, message = "Unexpected application error") + }) + @PutMapping(value = "/{phaseIdFrom}/move-to/{newPosition}", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity<Void> movePhaseToSpecifiedOrder( + @ApiParam(value = "Phase ID - from", required = true) @PathVariable(name = "phaseIdFrom") Long phaseIdFrom, + @ApiParam(value = "Position (order) to which the phase should be moved", required = true) @PathVariable(name = "newPosition") int newPosition) { + + trainingPhaseFacade.movePhaseToSpecifiedOrder(phaseIdFrom, newPosition); + + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/com/example/demo/controller/TasksController.java b/src/main/java/com/example/demo/controller/TasksController.java index ca50097adf8f119a1a697060b972f01510dd5d56..eb252c4c4defbcf50f84cf025b26a0fcf0849eb3 100644 --- a/src/main/java/com/example/demo/controller/TasksController.java +++ b/src/main/java/com/example/demo/controller/TasksController.java @@ -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.CrossOrigin; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -20,12 +21,15 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; @RestController @RequestMapping(value = "/training-definitions/{definitionId}/phases/{phaseId}/tasks", produces = MediaType.APPLICATION_JSON_VALUE) +@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*", + methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE, RequestMethod.PUT}) @Api(value = "/training-definitions/{definitionId}/phases", tags = "Tasks", consumes = MediaType.APPLICATION_JSON_VALUE, diff --git a/src/main/java/com/example/demo/dto/InfoLevelUpdateDto.java b/src/main/java/com/example/demo/dto/InfoLevelUpdateDto.java index 98519fb2bc26a8d5567c3d9aa7a8dc9e132a7ba9..9d871d47ee42165415d15d1be1ba2da5f39c1475 100644 --- a/src/main/java/com/example/demo/dto/InfoLevelUpdateDto.java +++ b/src/main/java/com/example/demo/dto/InfoLevelUpdateDto.java @@ -1,18 +1,18 @@ package com.example.demo.dto; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotEmpty; + public class InfoLevelUpdateDto { - private Long id; + @ApiModelProperty(value = "Short description of info phase", required = true, example = "Info phase title") + @NotEmpty(message = "Info phase title must not be blank") private String title; - private String content; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } + @ApiModelProperty(value = "The information of info phase that is displayed to a player", required = true, example = "Read the info") + @NotEmpty(message = "Info phase content must not be blank") + private String content; public String getTitle() { return title; @@ -33,8 +33,7 @@ public class InfoLevelUpdateDto { @Override public String toString() { return "InfoLevelUpdateDto{" + - "id=" + id + - ", title='" + title + '\'' + + "title='" + title + '\'' + ", content='" + content + '\'' + '}'; } diff --git a/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java b/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java index 199653042cfcc0522d9a8af220c47e34cf8c82f8..3777a3bd68a3c2e221748e9490310381c3ecf80f 100644 --- a/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java +++ b/src/main/java/com/example/demo/dto/PhaseLevelUpdateDto.java @@ -1,25 +1,35 @@ package com.example.demo.dto; +import io.swagger.annotations.ApiModelProperty; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.PositiveOrZero; import java.util.List; public class PhaseLevelUpdateDto { - private Long id; + @ApiModelProperty(value = "Short description of training phase", required = true, example = "Training phase title") + @NotEmpty(message = "Training phase title must not be blank") private String title; - private Integer order; + + @ApiModelProperty(value = "Maximal number of allowed wrong flags provided by played", required = true, example = "10") + @NotNull(message = "Maximal number of allowed wrong flags must be set") private Integer allowedWrongFlags; + + @ApiModelProperty(value = "Maximal number of allowed commands provided by played", required = true, example = "10") + @NotNull(message = "Maximal number of allowed commands must be set") private Integer allowedCommands; + + @ApiModelProperty(value = "Estimated time (minutes) taken by the player to solve the training phase", example = "20") + @NotNull(message = "Estimated duration of phase task must be set") private Integer estimatedDuration; - private Long maxScore; - private List<DecisionMatrixRowDto> decisionMatrix; - public Long getId() { - return id; - } + @ApiModelProperty(value = "Maximal score player can achieve in the training phase", example = "200") + @PositiveOrZero + private Long maxScore; - public void setId(Long id) { - this.id = id; - } + private List<DecisionMatrixRowDto> decisionMatrix; public String getTitle() { return title; @@ -29,14 +39,6 @@ public class PhaseLevelUpdateDto { this.title = title; } - public Integer getOrder() { - return order; - } - - public void setOrder(Integer order) { - this.order = order; - } - public Integer getAllowedWrongFlags() { return allowedWrongFlags; } diff --git a/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java b/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java new file mode 100644 index 0000000000000000000000000000000000000000..de568cb7ce783ecc365ae2074df3b0183ae81f0c --- /dev/null +++ b/src/main/java/com/example/demo/facade/TrainingPhaseFacade.java @@ -0,0 +1,81 @@ +package com.example.demo.facade; + +import com.example.demo.dto.BaseLevelDto; +import com.example.demo.dto.InfoLevelDto; +import com.example.demo.dto.InfoLevelUpdateDto; +import com.example.demo.dto.PhaseCreateDTO; +import com.example.demo.dto.PhaseLevelDto; +import com.example.demo.dto.PhaseLevelUpdateDto; +import com.example.demo.enums.PhaseType; +import com.example.demo.service.InfoLevelService; +import com.example.demo.service.PhaseLevelService; +import com.example.demo.service.PhaseService; +import com.example.demo.service.QuestionnaireLevelService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class TrainingPhaseFacade { + + @Autowired + private PhaseService phaseService; + + @Autowired + private InfoLevelService infoLevelService; + + @Autowired + private QuestionnaireLevelService questionnaireLevelService; + + @Autowired + private PhaseLevelService phaseLevelService; + + public BaseLevelDto createPhase(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; + } + + + @Transactional + public List<BaseLevelDto> deletePhase(Long definitionId, Long phaseId) { + + phaseService.deletePhase(definitionId, phaseId); + + return getPhases(definitionId); + } + + public BaseLevelDto getPhase(Long definitionId, Long phaseId) { + return phaseService.getPhase(definitionId, phaseId); + } + + public List<BaseLevelDto> getPhases(Long definitionId) { + + return phaseService.getPhases(definitionId); + } + + public InfoLevelDto updateInfoPhase(Long definitionId, Long phaseId, InfoLevelUpdateDto infoLevelUpdateDto) { + return infoLevelService.updateInfoLevel(definitionId, phaseId, infoLevelUpdateDto); + } + + public PhaseLevelDto updateTrainingPhase(Long definitionId, Long phaseId, PhaseLevelUpdateDto trainingPhaseUpdate) { + return phaseLevelService.updatePhaseLevel(definitionId, phaseId, trainingPhaseUpdate); + } + + public void movePhaseToSpecifiedOrder(Long phaseIdFrom, int newPosition) { + phaseService.moveLevelToSpecifiedOrder(phaseIdFrom, newPosition); + } + + +} diff --git a/src/main/java/com/example/demo/service/InfoLevelService.java b/src/main/java/com/example/demo/service/InfoLevelService.java index 41e961a4d8d61531b0ffd0b1d2dabdc3a98988a7..0725c71786d0c548c0eb60d89e67b2733e8ddf6c 100644 --- a/src/main/java/com/example/demo/service/InfoLevelService.java +++ b/src/main/java/com/example/demo/service/InfoLevelService.java @@ -3,6 +3,7 @@ package com.example.demo.service; import com.example.demo.domain.InfoLevel; import com.example.demo.dto.InfoLevelCreateDto; import com.example.demo.dto.InfoLevelDto; +import com.example.demo.dto.InfoLevelUpdateDto; import com.example.demo.mapper.BeanMapper; import com.example.demo.repository.BaseLevelRepository; import com.example.demo.repository.InfoLevelRepository; @@ -24,8 +25,6 @@ public class InfoLevelService { private final InfoLevelRepository infoLevelRepository; private final BaseLevelRepository baseLevelRepository; - - @Autowired public InfoLevelService(InfoLevelRepository infoLevelRepository, BaseLevelRepository baseLevelRepository) { this.infoLevelRepository = infoLevelRepository; @@ -78,17 +77,18 @@ public class InfoLevelService { return BeanMapper.INSTANCE.toDto(infoLevel.get()); } - public InfoLevelDto updateInfoLevel(InfoLevel infoLevelUpdate) { - Optional<InfoLevel> persistedInfoLevel = infoLevelRepository.findById(infoLevelUpdate.getId()); + public InfoLevelDto updateInfoLevel(Long definitionId, Long phaseId, InfoLevelUpdateDto infoLevelUpdateDto) { + InfoLevel infoLevelUpdate = BeanMapper.INSTANCE.toEntity(infoLevelUpdateDto); + infoLevelUpdate.setId(phaseId); - if (persistedInfoLevel.isEmpty()) { - // TODO return 404 - LOG.error("No info level found with ID {}.", infoLevelUpdate.getId()); - return new InfoLevelDto(); - } + InfoLevel persistedInfoLevel = infoLevelRepository.findById(infoLevelUpdate.getId()) + .orElseThrow(() -> new RuntimeException("Info 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) - infoLevelUpdate.setTrainingDefinitionId(persistedInfoLevel.get().getTrainingDefinitionId()); - infoLevelUpdate.setOrder(persistedInfoLevel.get().getOrder()); + infoLevelUpdate.setTrainingDefinitionId(persistedInfoLevel.getTrainingDefinitionId()); + infoLevelUpdate.setOrder(persistedInfoLevel.getOrder()); InfoLevel savedEntity = infoLevelRepository.save(infoLevelUpdate); diff --git a/src/main/java/com/example/demo/service/LevelOperationsService.java b/src/main/java/com/example/demo/service/LevelOperationsService.java index ebccb11366234940f1be03fe7a72b956ecd58891..bba817c4be28896ff43a0666388c932f3022fb56 100644 --- a/src/main/java/com/example/demo/service/LevelOperationsService.java +++ b/src/main/java/com/example/demo/service/LevelOperationsService.java @@ -50,31 +50,31 @@ public class LevelOperationsService { @Autowired private QuestionChoiceService questionChoiceService; - @Transactional - public void moveLevelToSpecifiedOrder(Long levelIdFrom, int newPosition) { - Optional<BaseLevel> levelFrom = baseLevelRepository.findById(levelIdFrom); - - if (levelFrom.isEmpty()) { - // TODO throw a proper exception - return; - } - - int fromOrder = levelFrom.get().getOrder(); - - if (fromOrder < newPosition) { - baseLevelRepository.decreaseOrderOfLevelsOnInterval(levelFrom.get().getTrainingDefinitionId(), fromOrder, newPosition); - } else if (fromOrder > newPosition) { - baseLevelRepository.increaseOrderOfLevelsOnInterval(levelFrom.get().getTrainingDefinitionId(), newPosition, fromOrder); - } else { - // nothing should be changed, no further actions needed - return; - } - - levelFrom.get().setOrder(newPosition); - baseLevelRepository.save(levelFrom.get()); - - phaseLevelService.alignDecisionMatrixForPhasesInTrainingDefinition(levelFrom.get().getTrainingDefinitionId()); - } +// @Transactional +// public void moveLevelToSpecifiedOrder(Long levelIdFrom, int newPosition) { +// Optional<BaseLevel> levelFrom = baseLevelRepository.findById(levelIdFrom); +// +// if (levelFrom.isEmpty()) { +// // TODO throw a proper exception +// return; +// } +// +// int fromOrder = levelFrom.get().getOrder(); +// +// if (fromOrder < newPosition) { +// baseLevelRepository.decreaseOrderOfLevelsOnInterval(levelFrom.get().getTrainingDefinitionId(), fromOrder, newPosition); +// } else if (fromOrder > newPosition) { +// baseLevelRepository.increaseOrderOfLevelsOnInterval(levelFrom.get().getTrainingDefinitionId(), newPosition, fromOrder); +// } else { +// // nothing should be changed, no further actions needed +// return; +// } +// +// levelFrom.get().setOrder(newPosition); +// baseLevelRepository.save(levelFrom.get()); +// +// phaseLevelService.alignDecisionMatrixForPhasesInTrainingDefinition(levelFrom.get().getTrainingDefinitionId()); +// } // @Transactional // public void deleteLevel(Long levelId) { @@ -141,15 +141,15 @@ public class LevelOperationsService { return BeanMapper.INSTANCE.toDto(level.get()); } - public void updateInfoLevel(InfoLevelUpdateDto infoLevelUpdateDto) { - InfoLevel infoLevel = BeanMapper.INSTANCE.toEntity(infoLevelUpdateDto); - infoLevelService.updateInfoLevel(infoLevel); - } +// public void updateInfoLevel(InfoLevelUpdateDto infoLevelUpdateDto) { +// InfoLevel infoLevel = BeanMapper.INSTANCE.toEntity(infoLevelUpdateDto); +// infoLevelService.updateInfoLevel(infoLevel); +// } - public void updatePhaseLevel(PhaseLevelUpdateDto phaseLevelUpdateDto) { - PhaseLevel phaseLevel = BeanMapper.INSTANCE.toEntity(phaseLevelUpdateDto); - phaseLevelService.updatePhaseLevel(phaseLevel); - } +// public void updatePhaseLevel(PhaseLevelUpdateDto phaseLevelUpdateDto) { +// PhaseLevel phaseLevel = BeanMapper.INSTANCE.toEntity(phaseLevelUpdateDto); +// phaseLevelService.updatePhaseLevel(phaseLevel); +// } public QuestionDto createQuestion(Long questionnaireId, QuestionType questionType) { QuestionDto createdQuestion = questionService.createDefaultQuestion(questionnaireId, questionType); diff --git a/src/main/java/com/example/demo/service/PhaseLevelService.java b/src/main/java/com/example/demo/service/PhaseLevelService.java index 981b391983db2d3bbb810d32d92df034e0800d70..9b19e0db88a26dc771060f001e501b9b1df25817 100644 --- a/src/main/java/com/example/demo/service/PhaseLevelService.java +++ b/src/main/java/com/example/demo/service/PhaseLevelService.java @@ -1,8 +1,10 @@ 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; @@ -10,6 +12,7 @@ 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; @@ -44,18 +47,19 @@ public class PhaseLevelService { return BeanMapper.INSTANCE.toDto(persistedEntity); } - public PhaseLevelDto updatePhaseLevel(PhaseLevel phaseLevel) { - Optional<PhaseLevel> persistedPhaseLevel = phaseLevelRepository.findById(phaseLevel.getId()); + public PhaseLevelDto updatePhaseLevel(Long definitionId, Long phaseId, PhaseLevelUpdateDto trainingPhaseUpdate) { + PhaseLevel phaseLevel = BeanMapper.INSTANCE.toEntity(trainingPhaseUpdate); + phaseLevel.setId(phaseId); - if (persistedPhaseLevel.isEmpty()) { - // TODO return 404 - LOG.error("No phase level found with ID {}.", phaseLevel.getId()); - return new PhaseLevelDto(); - } + 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.get().getTrainingDefinitionId()); - phaseLevel.setOrder(persistedPhaseLevel.get().getOrder()); - phaseLevel.setSubLevels(persistedPhaseLevel.get().getSubLevels()); + phaseLevel.setTrainingDefinitionId(persistedPhaseLevel.getTrainingDefinitionId()); + phaseLevel.setOrder(persistedPhaseLevel.getOrder()); + phaseLevel.setSubLevels(persistedPhaseLevel.getSubLevels()); if (!CollectionUtils.isEmpty(phaseLevel.getDecisionMatrix())) { phaseLevel.getDecisionMatrix().forEach(x -> x.setPhaseLevel(phaseLevel)); diff --git a/src/main/java/com/example/demo/service/PhaseService.java b/src/main/java/com/example/demo/service/PhaseService.java new file mode 100644 index 0000000000000000000000000000000000000000..d575252771a06dcd02b66ddc061d42f3459e9919 --- /dev/null +++ b/src/main/java/com/example/demo/service/PhaseService.java @@ -0,0 +1,79 @@ +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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class PhaseService { + + @Autowired + private BaseLevelRepository baseLevelRepository; + + @Autowired + private PhaseLevelService phaseLevelService; + + @Transactional + public void deletePhase(Long definitionId, Long phaseId) { + BaseLevel phase = baseLevelRepository.findById(phaseId) + .orElseThrow(() -> new RuntimeException("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) + + + int levelOrder = phase.getOrder(); + baseLevelRepository.decreaseOrderAfterLevelWasDeleted(definitionId, levelOrder); + + baseLevelRepository.delete(phase); + } + + public BaseLevelDto getPhase(Long definitionId, Long phaseId) { + BaseLevel phase = baseLevelRepository.findById(phaseId) + .orElseThrow(() -> new RuntimeException("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) + + return BeanMapper.INSTANCE.toDto(phase); + } + + + public List<BaseLevelDto> getPhases(Long trainingDefinitionId) { + List<BaseLevel> phases = baseLevelRepository.findAllByTrainingDefinitionIdOrderByOrder(trainingDefinitionId); + + return BeanMapper.INSTANCE.toDtoList(phases); + } + + @Transactional + public void moveLevelToSpecifiedOrder(Long phaseIdFrom, int newPosition) { + BaseLevel levelFrom = baseLevelRepository.findById(phaseIdFrom) + .orElseThrow(() -> new RuntimeException("Phase was not found")); + // TODO throw proper exception once kypo2-training is migrated + + + int fromOrder = levelFrom.getOrder(); + + if (fromOrder < newPosition) { + baseLevelRepository.decreaseOrderOfLevelsOnInterval(levelFrom.getTrainingDefinitionId(), fromOrder, newPosition); + } else if (fromOrder > newPosition) { + baseLevelRepository.increaseOrderOfLevelsOnInterval(levelFrom.getTrainingDefinitionId(), newPosition, fromOrder); + } else { + // nothing should be changed, no further actions needed + return; + } + + levelFrom.setOrder(newPosition); + baseLevelRepository.save(levelFrom); + + phaseLevelService.alignDecisionMatrixForPhasesInTrainingDefinition(levelFrom.getTrainingDefinitionId()); + } + +}