From e36bbb0d659364b84af36f5fc3770f031fd4bd0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sat, 11 Nov 2023 15:50:14 +0100 Subject: [PATCH] Basic Reschedule --- .../api/controller/ScheduleController.java | 24 +++++++++++++++++ .../core/services/TaskScheduleService.java | 16 ++++++++++++ .../core/schedules/ScheduleServiceTest.java | 26 ++++++++++++++++--- .../test/resources/basicScheduleEntries.sql | 4 +-- 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/core/api/controller/ScheduleController.java b/backend/src/main/java/core/api/controller/ScheduleController.java index 6e8abb6..e6e1528 100644 --- a/backend/src/main/java/core/api/controller/ScheduleController.java +++ b/backend/src/main/java/core/api/controller/ScheduleController.java @@ -6,6 +6,7 @@ import core.api.models.timemanager.taskSchedule.BasicScheduleFieldInfo; import core.api.models.timemanager.taskSchedule.BasicScheduleInfo; import core.api.models.timemanager.taskSchedule.ScheduleFieldInfo; import core.entities.timemanager.AbstractSchedule; +import core.entities.timemanager.BasicTaskSchedule; import core.entities.timemanager.Task; import core.services.*; import org.springframework.beans.factory.annotation.Autowired; @@ -66,4 +67,27 @@ public class ScheduleController { return ResponseEntity.status(400).body(new SimpleStatusResponse("failed")); } } + + @PostMapping("/schedules/{scheduleID}") + public ResponseEntity editSchedule(@PathVariable long scheduleID, @RequestBody @Valid ScheduleFieldInfo scheduleFieldInfo) { + 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")); + } + + if(permissionResult.getResult() instanceof BasicTaskSchedule && scheduleFieldInfo instanceof BasicScheduleFieldInfo) { + ServiceResult updatedSchedule = taskScheduleService.editBasicSchedule((BasicTaskSchedule) permissionResult.getResult(), (BasicScheduleFieldInfo) scheduleFieldInfo); + if(updatedSchedule.getExitCode() == ServiceExitCode.INVALID_OPERATION) { + return ResponseEntity.status(400).body(new SimpleStatusResponse("failed")); + } else { + return ResponseEntity.ok(updatedSchedule.getResult().toScheduleInfo()); + } + } + + return ResponseEntity.status(400).body(new SimpleStatusResponse("failed")); + } } diff --git a/backend/src/main/java/core/services/TaskScheduleService.java b/backend/src/main/java/core/services/TaskScheduleService.java index cc8242c..1f11bd6 100644 --- a/backend/src/main/java/core/services/TaskScheduleService.java +++ b/backend/src/main/java/core/services/TaskScheduleService.java @@ -1,6 +1,7 @@ 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; @@ -35,4 +36,19 @@ public class TaskScheduleService { return new ServiceResult<>(basicTaskSchedule); } + + public PermissionResult getSchedulePermissions(long scheduleID, String username) { + Optional abstractSchedule = scheduleRepository.findById(scheduleID); + return abstractSchedule.map(schedule -> new PermissionResult<>(schedule, schedule.getTask().getTaskgroup().getUser().getUsername().equals(username))).orElseGet(() -> new PermissionResult<>(ServiceExitCode.MISSING_ENTITY)); + } + + public ServiceResult editBasicSchedule(BasicTaskSchedule schedule, BasicScheduleFieldInfo scheduleFieldInfo) { + if(schedule.getTask().isFinished() || scheduleFieldInfo.getScheduleDate().isBefore(LocalDate.now())) { + return new ServiceResult<>(ServiceExitCode.INVALID_OPERATION); + } + + schedule.setScheduleDate(scheduleFieldInfo.getScheduleDate()); + scheduleRepository.save(schedule); + 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 356c8f6..edc4ef7 100644 --- a/backend/src/test/java/core/schedules/ScheduleServiceTest.java +++ b/backend/src/test/java/core/schedules/ScheduleServiceTest.java @@ -23,9 +23,7 @@ import java.time.LocalDate; import java.util.List; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.hibernate.validator.internal.util.Contracts.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; @SpringBootTest @Transactional @@ -75,4 +73,26 @@ public class ScheduleServiceTest { assertEquals(ServiceExitCode.OK, result_3.getExitCode()); assertThat(entityManager.find(BasicTaskSchedule.class, result_3.getResult().getScheduleID())).isNotNull(); } + + @Test + @SqlGroup({ + @Sql("classpath:taskgroupRepositoryTestEntries.sql"), + @Sql("classpath:taskRepositoryEntries.sql"), + @Sql("classpath:basicScheduleEntries.sql") + }) + void editBasicSchedule() { + //Situation 1: Reschedule finished task + ServiceResult result_1 = taskScheduleService.editBasicSchedule(entityManager.find(BasicTaskSchedule.class, 2L), new BasicScheduleFieldInfo(LocalDate.now())); + assertEquals(ServiceExitCode.INVALID_OPERATION, result_1.getExitCode()); + + //Situation 2: Reschedule unfinished task with invalid reschedule date + ServiceResult result_2 = taskScheduleService.editBasicSchedule(entityManager.find(BasicTaskSchedule.class, 1L), new BasicScheduleFieldInfo(LocalDate.of(2011, 3, 4))); + assertEquals(ServiceExitCode.INVALID_OPERATION, result_2.getExitCode()); + + //Situation 3: Reschedule unfinished task with valid reschedule date + LocalDate oldDate = entityManager.find(BasicTaskSchedule.class, 1L).getScheduleDate(); + ServiceResult result_3 = taskScheduleService.editBasicSchedule(entityManager.find(BasicTaskSchedule.class, 1L), new BasicScheduleFieldInfo(LocalDate.now())); + assertEquals(ServiceExitCode.OK, result_3.getExitCode()); + assertNotEquals(((BasicTaskSchedule) result_3.getResult()).getScheduleDate(), oldDate); + } } diff --git a/backend/src/test/resources/basicScheduleEntries.sql b/backend/src/test/resources/basicScheduleEntries.sql index 894eab7..5726e26 100644 --- a/backend/src/test/resources/basicScheduleEntries.sql +++ b/backend/src/test/resources/basicScheduleEntries.sql @@ -1,3 +1,3 @@ INSERT INTO abstract_schedule (schedule_type, scheduleid, start_time, stop_time, schedule_date, task, schedule_end, schedule_start) -VALUES (0, 1, null, null, '2023-11-11', 1, null, null), - (0, 2, null, null, '2023-11-11', 2, null, null); \ No newline at end of file +VALUES (0, 1, null, null, '2024-11-11', 1, null, null), + (0, 2, null, null, '2024-11-11', 2, null, null); \ No newline at end of file