From 0cd7d7c9a15b43806517a3585f457195b03ef5f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sat, 11 Nov 2023 17:58:56 +0100 Subject: [PATCH] Stop and finish schedule --- .../api/controller/ScheduleController.java | 15 +++++++++++ .../TaskScheduleStopResponse.java | 18 +++++++++++++ .../timemanager/AbstractSchedule.java | 15 +++++++++++ .../java/core/entities/timemanager/Task.java | 15 +++++++++-- .../core/services/TaskScheduleService.java | 23 ++++++++++++++--- .../core/schedules/ScheduleServiceTest.java | 25 +++++++++++++++++++ .../test/resources/basicScheduleEntries.sql | 4 ++- .../test/resources/taskRepositoryEntries.sql | 2 ++ .../taskgroupRepositoryTestEntries.sql | 5 +++- 9 files changed, 114 insertions(+), 8 deletions(-) create mode 100644 backend/src/main/java/core/api/models/timemanager/taskSchedule/TaskScheduleStopResponse.java diff --git a/backend/src/main/java/core/api/controller/ScheduleController.java b/backend/src/main/java/core/api/controller/ScheduleController.java index 156bdc5..8d523eb 100644 --- a/backend/src/main/java/core/api/controller/ScheduleController.java +++ b/backend/src/main/java/core/api/controller/ScheduleController.java @@ -155,4 +155,19 @@ public class ScheduleController { ServiceResult serviceResult = taskScheduleService.activateSchedule(permissionResult.getResult()); return ResponseEntity.ok(new ScheduleActivateResponse(serviceResult.getResult().getStartTime())); } + + @PostMapping("schedules/{scheduleID}/stop/{finish}") + public ResponseEntity stopSchedule(@PathVariable long scheduleID, @PathVariable boolean finish) { + PermissionResult permissionResult = taskScheduleService.getSchedulePermissions(scheduleID, SecurityContextHolder.getContext().getAuthentication().getName()); + if(permissionResult.isHasPermissions()) { + return ResponseEntity.status(403).body(new SimpleStatusResponse("failed")); + } + + if(permissionResult.getExitCode() == ServiceExitCode.MISSING_ENTITY) { + return ResponseEntity.status(404).body(new SimpleStatusResponse("failed")); + } + + ServiceResult serviceResult = taskScheduleService.stopSchedule(permissionResult.getResult(), finish); + return ResponseEntity.ok(new TaskScheduleStopResponse(serviceResult.getResult().getActiveTime())); + } } diff --git a/backend/src/main/java/core/api/models/timemanager/taskSchedule/TaskScheduleStopResponse.java b/backend/src/main/java/core/api/models/timemanager/taskSchedule/TaskScheduleStopResponse.java new file mode 100644 index 0000000..3c35886 --- /dev/null +++ b/backend/src/main/java/core/api/models/timemanager/taskSchedule/TaskScheduleStopResponse.java @@ -0,0 +1,18 @@ +package core.api.models.timemanager.taskSchedule; + +public class TaskScheduleStopResponse { + + private int activeTime; + + public TaskScheduleStopResponse(int activeTime) { + this.activeTime = activeTime; + } + + public int getActiveTime() { + return activeTime; + } + + public void setActiveTime(int activeTime) { + this.activeTime = activeTime; + } +} diff --git a/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java b/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java index 2ea808f..15d3915 100644 --- a/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java +++ b/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java @@ -3,6 +3,7 @@ package core.entities.timemanager; import core.api.models.timemanager.taskSchedule.ScheduleInfo; import javax.persistence.*; +import java.time.Duration; import java.time.LocalDateTime; import java.util.Objects; @@ -91,4 +92,18 @@ public abstract class AbstractSchedule { public boolean isActive() { return startTime != null && stopTime == null; } + + public int getActiveTime() { + if(startTime == null) { + return 0; + } else if(stopTime == null) { + return (int) Duration.between(startTime, LocalDateTime.now()).toMinutes(); + } else { + return (int) Duration.between(startTime, stopTime).toMinutes(); + } + } + + public boolean isStartable() { + return startTime == null; + } } diff --git a/backend/src/main/java/core/entities/timemanager/Task.java b/backend/src/main/java/core/entities/timemanager/Task.java index da6ce63..a66ad31 100644 --- a/backend/src/main/java/core/entities/timemanager/Task.java +++ b/backend/src/main/java/core/entities/timemanager/Task.java @@ -3,6 +3,7 @@ package core.entities.timemanager; import javax.persistence.*; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Set; @@ -153,11 +154,21 @@ public class Task { } public boolean hasActiveSchedule() { - for(AbstractSchedule schedule : getBasicTaskSchedules()) { - if(schedule.isActive()) { + for (AbstractSchedule schedule : getBasicTaskSchedules()) { + if (schedule.isActive()) { return true; } } return false; } + + public List getStartableSchedules() { + List abstractSchedules = new ArrayList<>(); + for(AbstractSchedule schedule : getBasicTaskSchedules()) { + if(schedule.isStartable()) { + abstractSchedules.add(schedule); + } + } + return abstractSchedules; + } } diff --git a/backend/src/main/java/core/services/TaskScheduleService.java b/backend/src/main/java/core/services/TaskScheduleService.java index d797126..18a088f 100644 --- a/backend/src/main/java/core/services/TaskScheduleService.java +++ b/backend/src/main/java/core/services/TaskScheduleService.java @@ -1,20 +1,17 @@ package core.services; import core.api.models.timemanager.taskSchedule.BasicScheduleFieldInfo; -import core.api.models.timemanager.taskSchedule.BasicScheduleInfo; -import core.api.models.timemanager.taskSchedule.ScheduleFieldInfo; -import core.entities.User; import core.entities.timemanager.AbstractSchedule; import core.entities.timemanager.BasicTaskSchedule; import core.entities.timemanager.Task; import core.repositories.UserRepository; import core.repositories.timemanager.ScheduleRepository; +import core.repositories.timemanager.TaskRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Optional; @@ -24,6 +21,8 @@ public class TaskScheduleService { @Autowired private ScheduleRepository scheduleRepository; @Autowired private UserRepository userRepository; + @Autowired + private TaskRepository taskRepository; public List getAllSchedulesOfUser(String username) { return scheduleRepository.findAllByUsername(username); @@ -107,4 +106,20 @@ public class TaskScheduleService { } return new ServiceResult<>(schedule); } + + public ServiceResult stopSchedule(AbstractSchedule schedule, boolean finish) { + if(schedule.getStartTime() != null && schedule.getStopTime() == null) { + schedule.setStopTime(LocalDateTime.now()); + scheduleRepository.save(schedule); + } + + if(finish) { + schedule.getTask().setFinished(true); + taskRepository.save(schedule.getTask()); + + List startableSchedules = schedule.getTask().getStartableSchedules(); + scheduleRepository.deleteAll(startableSchedules); + } + return new ServiceResult<>(schedule); + } } diff --git a/backend/src/test/java/core/schedules/ScheduleServiceTest.java b/backend/src/test/java/core/schedules/ScheduleServiceTest.java index 154a92e..5d95094 100644 --- a/backend/src/test/java/core/schedules/ScheduleServiceTest.java +++ b/backend/src/test/java/core/schedules/ScheduleServiceTest.java @@ -178,4 +178,29 @@ public class ScheduleServiceTest { assertNotNull(result_2.getResult().getStartTime()); assertNull(result_2.getResult().getStopTime()); } + + @Test + @SqlGroup({ + @Sql("classpath:taskgroupRepositoryTestEntries.sql"), + @Sql("classpath:taskRepositoryEntries.sql"), + @Sql("classpath:basicScheduleEntries.sql") + }) + void stopSchedule() { + //Stop schedule that is not running 4 + ServiceResult result_1 = taskScheduleService.stopSchedule(entityManager.find(BasicTaskSchedule.class, 5L), false); + assertNull(result_1.getResult().getStartTime()); + assertNull(result_1.getResult().getStopTime()); + + //Stop schedule (without finishing) + ServiceResult result_2 = taskScheduleService.stopSchedule(entityManager.find(BasicTaskSchedule.class, 4L), false); + assertNotNull(result_2.getResult().getStartTime()); + assertNotNull(result_2.getResult().getStopTime()); + + //Stop schedule with finishing + ServiceResult result_3 = taskScheduleService.stopSchedule(entityManager.find(BasicTaskSchedule.class, 7L), true); + assertNotNull(result_3.getResult().getStartTime()); + assertNotNull(result_3.getResult().getStopTime()); + assertTrue(result_3.getResult().getTask().isFinished()); + assertFalse(result_3.getResult().isStartable()); + } } diff --git a/backend/src/test/resources/basicScheduleEntries.sql b/backend/src/test/resources/basicScheduleEntries.sql index 14b19a5..8179cd6 100644 --- a/backend/src/test/resources/basicScheduleEntries.sql +++ b/backend/src/test/resources/basicScheduleEntries.sql @@ -3,4 +3,6 @@ VALUES (0, 1, null, null, '2024-11-11', 1, null, null), (0, 2, null, null, '2024-11-11', 2, null, null), (0, 3, '2023-10-10', '2023-10-10', '2024-11-11', 1, null, null), (0, 4, '2023-10-10', null, '2024-11-11', 3, null, null), - (0, 5, null, null, '2024-11-11', 5, null, null); \ No newline at end of file + (0, 5, null, null, '2024-11-11', 5, null, null), + (0, 6, '2023-10-10', null, '2024-11-11', 16, null, null), + (0, 7, '2023-10-10', null, '2024-11-11', 16, null, null); \ No newline at end of file diff --git a/backend/src/test/resources/taskRepositoryEntries.sql b/backend/src/test/resources/taskRepositoryEntries.sql index f326ec1..fb3e127 100644 --- a/backend/src/test/resources/taskRepositoryEntries.sql +++ b/backend/src/test/resources/taskRepositoryEntries.sql @@ -17,3 +17,5 @@ INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, f INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (13, NULL, 0, '2022-03-20', 'Task 6', 2, true, 0); INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (14, '2044-03-20', 0, '2022-03-20', 'Task 6', 2, true, 0); INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (15, NULL, 0, NULL, 'Task 15', 2, false, 0); + +INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (16, NULL, 0, NULL, 'Task 15', 9, false, 0); \ No newline at end of file diff --git a/backend/src/test/resources/taskgroupRepositoryTestEntries.sql b/backend/src/test/resources/taskgroupRepositoryTestEntries.sql index 2c65e97..7a31b37 100644 --- a/backend/src/test/resources/taskgroupRepositoryTestEntries.sql +++ b/backend/src/test/resources/taskgroupRepositoryTestEntries.sql @@ -1,5 +1,6 @@ INSERT INTO users (id, username, email, password) VALUES (1, 'Testuser1', 'test1@test.com', '123456'); INSERT INTO users (id, username, email, password) VALUES (2, 'Testuser2', 'test2@test.com', '123456'); +INSERT INTO users (id, username, email, password) VALUES (3, 'Testuser3', 'test3@test.com', '123456'); INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (1, 'No children', null, 1); INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (2, 'Taskgroup 1', null, 1); @@ -9,4 +10,6 @@ INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (4, INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (5, 'Taskgroup 2', null, 1); INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (6, 'Taskgroup 2.1', 5, 1); INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (7, 'Taskgroup 2.2', 5, 1); -INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (8, 'Taskgroup 2.1.2', 6, 1); \ No newline at end of file +INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (8, 'Taskgroup 2.1.2', 6, 1); + +INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (9, 'Taskgroup 1', null, 3); \ No newline at end of file