Skip to content
Snippets Groups Projects
Commit e463cca9 authored by Jan Tymel's avatar Jan Tymel
Browse files

Add API for changing tasks' order

Resolves #2
parent a57f08c7
No related branches found
No related tags found
No related merge requests found
......@@ -30,11 +30,10 @@ import javax.validation.Valid;
@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",
@Api(value = "/training-definitions/{definitionId}/tasks",
tags = "Tasks",
consumes = MediaType.APPLICATION_JSON_VALUE,
authorizations = @Authorization(value = "bearerAuth"))
public class TasksController {
@Autowired
......@@ -161,4 +160,23 @@ public class TasksController {
return ResponseEntity.ok().build();
}
@ApiOperation(httpMethod = "PUT",
value = "Move task to specified order",
nickname = "moveTaskToSpecifiedOrder",
produces = MediaType.APPLICATION_JSON_VALUE
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Task moved to specified order"),
@ApiResponse(code = 500, message = "Unexpected application error")
})
@PutMapping(value = "/{taskIdFrom}/move-to/{newPosition}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Void> moveTaskToSpecifiedOrder(
@ApiParam(value = "Task ID - from", required = true) @PathVariable(name = "taskIdFrom") Long taskIdFrom,
@ApiParam(value = "Position (order) to which the task should be moved", required = true) @PathVariable(name = "newPosition") int newPosition) {
taskService.moveTaskToSpecifiedOrder(taskIdFrom, newPosition);
return ResponseEntity.ok().build();
}
}
......@@ -12,6 +12,26 @@ public interface TaskRepository extends JpaRepository<Task, Long> {
@Query("SELECT COALESCE(MAX(g.order), -1) FROM Task g WHERE g.trainingPhase.id = :phaseId")
Integer getCurrentMaxOrder(@Param("phaseId") Long phaseId);
@Modifying
@Query("UPDATE Task t SET t.order = t.order - 1 " +
"WHERE t.trainingPhase.id = :trainingPhaseId " +
"AND t.order > :lowerBound " +
"AND t.order <= :upperBound ")
void decreaseOrderOfTasksOnInterval(@Param("trainingPhaseId") Long trainingPhaseId,
@Param("lowerBound") int lowerBound,
@Param("upperBound") int upperBound);
@Modifying
@Query("UPDATE Task t SET t.order = t.order + 1 " +
"WHERE t.trainingPhase.id = :trainingPhaseId " +
"AND t.order >= :lowerBound " +
"AND t.order < :upperBound ")
void increaseOrderOfTasksOnInterval(@Param("trainingPhaseId") Long trainingPhaseId,
@Param("lowerBound") int lowerBound,
@Param("upperBound") int upperBound);
@Transactional
@Modifying
@Query("UPDATE Task t SET t.order = t.order - 1 " +
......
......@@ -14,6 +14,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
......@@ -133,4 +134,25 @@ public class TaskService {
taskRepository.delete(task);
}
@Transactional
public void moveTaskToSpecifiedOrder(Long taskIdFrom, int newPosition) {
Task task = taskRepository.findById(taskIdFrom)
.orElseThrow(() -> new RuntimeException("Task was not found"));
// TODO throw proper exception once kypo2-training is migrated
int fromOrder = task.getOrder();
if (fromOrder < newPosition) {
taskRepository.decreaseOrderOfTasksOnInterval(task.getTrainingPhase().getId(), fromOrder, newPosition);
} else if (fromOrder > newPosition) {
taskRepository.increaseOrderOfTasksOnInterval(task.getTrainingPhase().getId(), newPosition, fromOrder);
} else {
// nothing should be changed, no further actions needed
return;
}
task.setOrder(newPosition);
taskRepository.save(task);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment