From fea17c3fb9f9ea991eb040d108f7555cf0a89f33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sun, 17 Mar 2024 07:48:06 +0100 Subject: [PATCH] Refactor Code for Repeating Weekly --- .../repeatinginfo/TaskRepeatWeekInfo.java | 4 + .../java/core/services/TaskSeriesService.java | 110 ++++++++++-------- 2 files changed, 66 insertions(+), 48 deletions(-) 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 39b4b22..eadf689 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 @@ -2,9 +2,13 @@ package core.api.models.timemanager.tasks.repeatinginfo; import com.fasterxml.jackson.annotation.JsonFormat; import org.hibernate.validator.constraints.Length; +import util.Tupel; import javax.validation.constraints.Size; +import java.time.DayOfWeek; import java.time.LocalDate; +import java.util.Comparator; +import java.util.HashMap; import java.util.List; public class TaskRepeatWeekInfo { diff --git a/backend/src/main/java/core/services/TaskSeriesService.java b/backend/src/main/java/core/services/TaskSeriesService.java index 93827fd..10c752f 100644 --- a/backend/src/main/java/core/services/TaskSeriesService.java +++ b/backend/src/main/java/core/services/TaskSeriesService.java @@ -29,44 +29,27 @@ public class TaskSeriesService { public ServiceExitCode createTaskSeries(TaskRepeatWeekInfo taskRepeatInfo) { - Map> offsetMap = calcOffsetMap(taskRepeatInfo); + HashMap> offsetMap = calcWeeklyOffsetMap(taskRepeatInfo); TaskSerie taskSerie = new TaskSerie(); List clonedTasks = new ArrayList<>(); List clonedSchedules = new ArrayList<>(); int weekDayIndex = 0; - for(TaskRepeatWeekDayInfo weekDayInfo : taskRepeatInfo.getWeekDayInfos()) { - Optional requestedTask = taskRepository.findById(weekDayInfo.getTaskID()); - if(requestedTask.isEmpty()) return ServiceExitCode.MISSING_ENTITY; - Task rootTask = requestedTask.get(); + for(Map.Entry> repeatingTaskInfo: offsetMap.entrySet()) { + Task rootTask = repeatingTaskInfo.getKey(); + TaskSerieItem rootItem = new TaskSerieItem(rootTask, weekDayIndex); + taskSerie.addItem(rootItem); - LocalDate currentDate = rootTask.getStartDate().plusDays(weekDayInfo.getOffset()); - - int itemIndex = weekDayIndex; - while(currentDate.isBefore(taskRepeatInfo.getEndDate())) { - var cloneResult = rootTask.cloneTask(); - Task clonedRootTask = cloneResult.getValue00(); - clonedTasks.addAll(cloneResult.getValue01()); - clonedSchedules.addAll(cloneResult.getValue02()); - - for(Task clonedTask : cloneResult.getValue01()) { - TaskSerieItem item = new TaskSerieItem(clonedTask, itemIndex); - taskSerie.addItem(item); - } - - Tupel offsetEntry = offsetMap.get(weekDayInfo); - clonedRootTask.shiftTask(offsetEntry.getValue00(), offsetEntry.getValue01()); - - currentDate = currentDate.plusDays(weekDayInfo.getOffset()); - itemIndex += taskRepeatInfo.getWeekDayInfos().size(); - } + int itemIndex = weekDayIndex +1; + Tupel, Collection> repeatingResult = repeatTask(rootTask, taskRepeatInfo.getEndDate(), offsetMap, taskSerie, itemIndex); + clonedTasks.addAll(repeatingResult.getValue00()); + clonedSchedules.addAll(repeatingResult.getValue01()); weekDayIndex++; } - taskSeriesRepository.save(taskSerie); taskRepository.saveAll(clonedTasks); taskSerieItemRepository.saveAll(taskSerie.getTasks()); @@ -75,33 +58,69 @@ public class TaskSeriesService { return ServiceExitCode.OK; } - private HashMap> calcOffsetMap(TaskRepeatWeekInfo weekInfo) { - HashMap> offsetMap = new HashMap<>(); + private Tupel, Collection> repeatTask(Task rootTask, LocalDate endingDate, HashMap> offsetMap,TaskSerie taskSerie, int itemIndex) { + List clonedTasks = new ArrayList<>(); + List clonedSchedules = new ArrayList<>(); + + LocalDate currentDate = rootTask.getStartDate().plusDays(offsetMap.get(rootTask).getValue00()); + while(currentDate.isBefore(endingDate)) { + var cloneResult = rootTask.cloneTask(); + Task clonedRootTask = cloneResult.getValue00(); + clonedTasks.addAll(cloneResult.getValue01()); + clonedSchedules.addAll(cloneResult.getValue02()); + + for(Task clonedTask : cloneResult.getValue01()) { + TaskSerieItem item = new TaskSerieItem(clonedTask, itemIndex); + taskSerie.addItem(item); + } + + Tupel offsetEntry = offsetMap.get(rootTask); + clonedRootTask.shiftTask(offsetEntry.getValue00(), offsetEntry.getValue01()); + + currentDate = currentDate.plusDays(offsetEntry.getValue00()); + itemIndex += offsetMap.size(); + } + + return new Tupel<>(clonedTasks, clonedSchedules); + } + + private HashMap> calcWeeklyOffsetMap(TaskRepeatWeekInfo weekInfo) throws NoSuchElementException { + HashMap> offsetMap = new HashMap<>(); weekInfo.getWeekDayInfos().sort(Comparator.comparing(TaskRepeatWeekDayInfo::getDayOfWeek)); for(int i=0; i(offset, offset)); + Optional requestedTask = taskRepository.findById(weekInfo.getWeekDayInfos().get(i).getTaskID()); + if(requestedTask.isEmpty()) { + throw new NoSuchElementException(); } else { - int startingOffset = weekInfo.getWeekDayInfos().get(i).getOffset() -1; - - DayOfWeek nextWeekday = null; - if(i == weekInfo.getWeekDayInfos().size()-1) { - nextWeekday = weekInfo.getWeekDayInfos().get(0).getDayOfWeek(); + if(weekInfo.getDeadlineStrategy() == DeadlineStrategy.DEADLINE_EQUAL_START) { + int offset = weekInfo.getWeekDayInfos().get(i).getOffset()-1; + offsetMap.put(requestedTask.get(), new Tupel<>(offset, offset)); } else { - nextWeekday = weekInfo.getWeekDayInfos().get(i+1).getDayOfWeek(); + int startingOffset = weekInfo.getWeekDayInfos().get(i).getOffset() -1; + int endingOffset = getEndingOffset(weekInfo, i, startingOffset); + + offsetMap.put(requestedTask.get(), new Tupel<>(startingOffset, endingOffset)); } - - DayOfWeek currentWeekDay = weekInfo.getWeekDayInfos().get(i).getDayOfWeek(); - - int endingOffset = startingOffset + Math.abs(nextWeekday.getValue() - currentWeekDay.getValue()); - - offsetMap.put(weekInfo.getWeekDayInfos().get(i), new Tupel<>(startingOffset, endingOffset)); } + } return offsetMap; } + private static int getEndingOffset(TaskRepeatWeekInfo weekInfo, int i, int startingOffset) { + DayOfWeek nextWeekday; + if(i == weekInfo.getWeekDayInfos().size()-1) { + nextWeekday = weekInfo.getWeekDayInfos().get(0).getDayOfWeek(); + } else { + nextWeekday = weekInfo.getWeekDayInfos().get(i +1).getDayOfWeek(); + } + + DayOfWeek currentWeekDay = weekInfo.getWeekDayInfos().get(i).getDayOfWeek(); + + int endingOffset = startingOffset + Math.abs(nextWeekday.getValue() - currentWeekDay.getValue()); + return endingOffset; + } + public ServiceExitCode createTaskSeries(Task rootTask, TaskRepeatDayInfo taskRepeatInfo) { if(taskRepeatInfo.getDeadlineStrategy() == DeadlineStrategy.FIX_DEADLINE) { return ServiceExitCode.INVALID_PARAMETER; @@ -113,12 +132,7 @@ public class TaskSeriesService { TaskSerieItem rootItem = taskSerie.addTask(rootTask); rootTask.setTaskSerieItem(rootItem); - LocalDate currentTaskDate = rootTask.getStartDate().plusDays(taskRepeatInfo.getOffset()); - while(currentTaskDate.isBefore(taskRepeatInfo.getEndingDate())) { - Tupel> clonedTasks = rootTask.cloneTask(); - currentTaskDate = currentTaskDate.plusDays(taskRepeatInfo.getOffset()); - } taskSeriesRepository.save(taskSerie); taskRepository.saveAll(taskList);