From 7d24ed12296a808c71906a18e7195441b1f03008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Fri, 15 Mar 2024 18:07:40 +0100 Subject: [PATCH] Implement Generating Repeating Task on Weekly Basis --- .../api/controller/TaskSeriesController.java | 13 ++---- .../repeatinginfo/TaskRepeatWeekDayInfo.java | 30 ++++++++++++- .../repeatinginfo/TaskRepeatWeekInfo.java | 6 ++- .../java/core/services/TaskSeriesService.java | 45 ++++++++++++++++++- 4 files changed, 81 insertions(+), 13 deletions(-) diff --git a/backend/src/main/java/core/api/controller/TaskSeriesController.java b/backend/src/main/java/core/api/controller/TaskSeriesController.java index c2d2994..bc0238b 100644 --- a/backend/src/main/java/core/api/controller/TaskSeriesController.java +++ b/backend/src/main/java/core/api/controller/TaskSeriesController.java @@ -21,15 +21,10 @@ public class TaskSeriesController { @Autowired private TaskService taskService; @Autowired private TaskSeriesService taskSeriesService; - @PostMapping("/tasks/{taskID}/taskseries/weekly") - public ResponseEntity onCreateTaskSeries(@PathVariable long taskID, @Valid @RequestBody TaskRepeatWeekInfo taskRepeatWeekInfo) { - var taskPermission = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName()); - if(taskPermission.hasIssue()) { - return taskPermission.mapToResponseEntity(); - } else { - ServiceExitCode serviceExitCode = taskSeriesService.createTaskSeries(taskPermission.getResult(), taskRepeatWeekInfo); - return serviceExitCode.mapToResponseEntity(); - } + @PostMapping("/tasks/taskseries/weekly") + public ResponseEntity onCreateTaskSeries(@Valid @RequestBody TaskRepeatWeekInfo taskRepeatWeekInfo) { + ServiceExitCode serviceExitCode = taskSeriesService.createTaskSeries(taskRepeatWeekInfo); + return serviceExitCode.mapToResponseEntity(); } @PostMapping("/tasks/{taskID}/taskseries/daily") diff --git a/backend/src/main/java/core/api/models/timemanager/tasks/repeatinginfo/TaskRepeatWeekDayInfo.java b/backend/src/main/java/core/api/models/timemanager/tasks/repeatinginfo/TaskRepeatWeekDayInfo.java index 8589f14..0466638 100644 --- a/backend/src/main/java/core/api/models/timemanager/tasks/repeatinginfo/TaskRepeatWeekDayInfo.java +++ b/backend/src/main/java/core/api/models/timemanager/tasks/repeatinginfo/TaskRepeatWeekDayInfo.java @@ -1,9 +1,37 @@ package core.api.models.timemanager.tasks.repeatinginfo; +import core.api.models.timemanager.tasks.TaskEntityInfo; +import core.entities.timemanager.Task; + +import java.time.DayOfWeek; + public class TaskRepeatWeekDayInfo { - private int weekday; + private DayOfWeek dayOfWeek; private int offset; + private long taskID; + public DayOfWeek getDayOfWeek() { + return dayOfWeek; + } + public void setDayOfWeek(DayOfWeek dayOfWeek) { + this.dayOfWeek = dayOfWeek; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + public long getTaskID() { + return taskID; + } + + public void setTaskID(long taskID) { + this.taskID = taskID; + } } diff --git a/backend/src/main/java/core/api/models/timemanager/tasks/repeatinginfo/TaskRepeatWeekInfo.java b/backend/src/main/java/core/api/models/timemanager/tasks/repeatinginfo/TaskRepeatWeekInfo.java index 19a4ce8..fc5301f 100644 --- a/backend/src/main/java/core/api/models/timemanager/tasks/repeatinginfo/TaskRepeatWeekInfo.java +++ b/backend/src/main/java/core/api/models/timemanager/tasks/repeatinginfo/TaskRepeatWeekInfo.java @@ -1,5 +1,6 @@ package core.api.models.timemanager.tasks.repeatinginfo; +import com.fasterxml.jackson.annotation.JsonFormat; import org.hibernate.validator.constraints.Length; import java.time.LocalDate; @@ -9,10 +10,11 @@ public class TaskRepeatWeekInfo { @Length(min = 1, max = 7) private List weekDayInfos; - private DeadlineStrategy deadlineStrategy; - + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") private LocalDate endDate; + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") + private LocalDate startDate; public List getWeekDayInfos() { return weekDayInfos; diff --git a/backend/src/main/java/core/services/TaskSeriesService.java b/backend/src/main/java/core/services/TaskSeriesService.java index 5952dab..7541fd1 100644 --- a/backend/src/main/java/core/services/TaskSeriesService.java +++ b/backend/src/main/java/core/services/TaskSeriesService.java @@ -2,6 +2,7 @@ package core.services; import core.api.models.timemanager.tasks.repeatinginfo.DeadlineStrategy; import core.api.models.timemanager.tasks.repeatinginfo.TaskRepeatDayInfo; +import core.api.models.timemanager.tasks.repeatinginfo.TaskRepeatWeekDayInfo; import core.api.models.timemanager.tasks.repeatinginfo.TaskRepeatWeekInfo; import core.entities.timemanager.Task; import core.entities.timemanager.TaskSerie; @@ -13,10 +14,12 @@ import core.repositories.timemanager.TaskSeriesRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.Duration; import java.time.LocalDate; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Optional; @Service public class TaskSeriesService { @@ -26,8 +29,48 @@ public class TaskSeriesService { @Autowired private TaskSerieItemRepository taskSerieItemRepository; + public ServiceExitCode createTaskSeries(TaskRepeatWeekInfo taskRepeatInfo) { + List createdTasks = new ArrayList<>(); + TaskSerie taskSerie = new TaskSerie(); + for(TaskRepeatWeekDayInfo taskRepeatDayInfo : taskRepeatInfo.getWeekDayInfos()) { + Optional task = taskRepository.findById(taskRepeatDayInfo.getTaskID()); + if(task.isEmpty()) return ServiceExitCode.MISSING_ENTITY; + + LocalDate currentTaskDate = task.get().getStartDate().plusDays(taskRepeatDayInfo.getOffset()); + while(currentTaskDate.isBefore(taskRepeatInfo.getEndDate())) { + Task clonedTask = Task.cloneTask(task.get()); + clonedTask.setStartDate(currentTaskDate); + + TaskSerieItem taskSerieItem = taskSerie.addTask(clonedTask); + clonedTask.setTaskSerieItem(taskSerieItem); + createdTasks.add(clonedTask); + } + } + + taskSerie.getTasks().sort(Comparator.comparing(o -> o.getTask().getStartDate())); + for(int i=0; i