issue-77 #105
@ -41,7 +41,7 @@ public class ScheduleController {
|
||||
@GetMapping("/schedules/{taskID}")
|
||||
public ResponseEntity<?> loadAllSchedulesOfTask(@PathVariable long taskID) {
|
||||
PermissionResult<Task> permissionResult = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -72,7 +72,7 @@ public class ScheduleController {
|
||||
|
||||
private ResponseEntity<?> createAbstractSchedule(long taskID, ScheduleFieldInfo scheduleFieldInfo) {
|
||||
PermissionResult<Task> permissionResult = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -111,7 +111,7 @@ public class ScheduleController {
|
||||
|
||||
private ResponseEntity<?> editAbstractSchedule(long scheduleID, ScheduleFieldInfo scheduleFieldInfo) {
|
||||
PermissionResult<AbstractSchedule> permissionResult = taskScheduleService.getSchedulePermissions(scheduleID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -141,7 +141,7 @@ public class ScheduleController {
|
||||
@DeleteMapping("/schedules/{scheduleID}")
|
||||
public ResponseEntity<?> deleteSchedule(@PathVariable long scheduleID) {
|
||||
PermissionResult<AbstractSchedule> permissionResult = taskScheduleService.getSchedulePermissions(scheduleID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -163,7 +163,7 @@ public class ScheduleController {
|
||||
@PostMapping("/schedules/{taskID}/now")
|
||||
public ResponseEntity<?> scheduleNow(@PathVariable long taskID) {
|
||||
PermissionResult<Task> permissionResult = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -193,7 +193,7 @@ public class ScheduleController {
|
||||
@PostMapping("/schedules/{scheduleID}/activate")
|
||||
public ResponseEntity<?> activateSchedule(@PathVariable long scheduleID) {
|
||||
PermissionResult<AbstractSchedule> permissionResult = taskScheduleService.getSchedulePermissions(scheduleID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -217,7 +217,7 @@ public class ScheduleController {
|
||||
@PostMapping("/schedules/{scheduleID}/stop/{finish}")
|
||||
public ResponseEntity<?> stopSchedule(@PathVariable long scheduleID, @PathVariable boolean finish) {
|
||||
PermissionResult<AbstractSchedule> permissionResult = taskScheduleService.getSchedulePermissions(scheduleID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -232,7 +232,7 @@ public class ScheduleController {
|
||||
@PostMapping("/schedules/{taskID}/forgotten")
|
||||
public ResponseEntity<?> registerForgottenSchedule(@PathVariable long taskID, @RequestBody @Valid ForgottenScheduleInfo forgottenScheduleInfo) {
|
||||
PermissionResult<Task> permissionResult = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -259,7 +259,7 @@ public class ScheduleController {
|
||||
List<PermissionResult<AbstractSchedule>> permissionResults = new ArrayList<>();
|
||||
for(long scheduleID: scheduleIDs) {
|
||||
PermissionResult<AbstractSchedule> permissionResult = taskScheduleService.getSchedulePermissions(scheduleID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -278,7 +278,7 @@ public class ScheduleController {
|
||||
@GetMapping("/schedules/{scheduleID}/details")
|
||||
public ResponseEntity<?> loadScheduleDetails(@PathVariable long scheduleID) {
|
||||
PermissionResult<AbstractSchedule> permissionResult = taskScheduleService.getSchedulePermissions(scheduleID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -292,7 +292,7 @@ public class ScheduleController {
|
||||
@PostMapping("/schedules/{scheduleID}/stopManual")
|
||||
public ResponseEntity<?> stopManual(@PathVariable long scheduleID, @Valid @RequestBody ManualScheduleStopInfo manualScheduleStopInfo) {
|
||||
PermissionResult<AbstractSchedule> permissionResult = taskScheduleService.getSchedulePermissions(scheduleID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!permissionResult.isHasPermissions()) {
|
||||
if(permissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
|
@ -3,9 +3,7 @@ package core.api.controller;
|
||||
import core.api.models.auth.SimpleStatusResponse;
|
||||
import core.api.models.timemanager.history.TaskgroupActivityInfo;
|
||||
import core.api.models.timemanager.history.WorkingStatus;
|
||||
import core.api.models.timemanager.taskgroup.TaskgroupEntityInfo;
|
||||
import core.entities.timemanager.AbstractSchedule;
|
||||
import core.entities.timemanager.Task;
|
||||
import core.entities.timemanager.Taskgroup;
|
||||
import core.services.PermissionResult;
|
||||
import core.services.ServiceExitCode;
|
||||
@ -14,12 +12,10 @@ import core.services.TaskgroupService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.security.core.parameters.P;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.*;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.TemporalAdjusters;
|
||||
import java.util.*;
|
||||
|
||||
@CrossOrigin(origins = "*", maxAge = 3600)
|
||||
@ -49,7 +45,7 @@ public class StatisticController {
|
||||
@GetMapping("/statistics/taskgroup-activity/{taskgroupID}/{startingDate}/{endingDate}/{includeSubTaskgroups}")
|
||||
public ResponseEntity<?> getTaskgroupActivity(@PathVariable long taskgroupID, @PathVariable String startingDate, @PathVariable String endingDate, @PathVariable boolean includeSubTaskgroups){
|
||||
PermissionResult<Taskgroup> taskgroupPermissionResult = taskgroupService.getTaskgroupByIDAndUsername(taskgroupID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!taskgroupPermissionResult.isHasPermissions()) {
|
||||
if(taskgroupPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
} else if(taskgroupPermissionResult.getExitCode() == ServiceExitCode.MISSING_ENTITY) {
|
||||
return ResponseEntity.status(404).body(new SimpleStatusResponse("failed"));
|
||||
|
@ -64,7 +64,7 @@ public class TaskController {
|
||||
@GetMapping("/tasks/{taskgroupID}/{status}")
|
||||
public ResponseEntity<?> listTasksOfTaskgroup(@PathVariable long taskgroupID, @PathVariable String status) {
|
||||
PermissionResult<Taskgroup> taskgroupPermissionResult = taskgroupService.getTaskgroupByIDAndUsername(taskgroupID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!taskgroupPermissionResult.isHasPermissions()) {
|
||||
if(taskgroupPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -78,7 +78,7 @@ public class TaskController {
|
||||
@PutMapping("/tasks/{taskgroupID}")
|
||||
public ResponseEntity<?> createTask(@PathVariable long taskgroupID, @RequestBody @Valid TaskFieldInfo taskFieldInfo) {
|
||||
PermissionResult<Taskgroup> taskgroupPermissionResult = taskgroupService.getTaskgroupByIDAndUsername(taskgroupID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!taskgroupPermissionResult.isHasPermissions()) {
|
||||
if(taskgroupPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -101,7 +101,7 @@ public class TaskController {
|
||||
@PostMapping("/tasks/{taskID}")
|
||||
public ResponseEntity<?> editTask(@PathVariable long taskID, @RequestBody @Valid TaskFieldInfo taskFieldInfo) {
|
||||
PermissionResult<Task> taskPermissionResult = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if (!taskPermissionResult.isHasPermissions()) {
|
||||
if (taskPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -124,7 +124,7 @@ public class TaskController {
|
||||
@DeleteMapping("/tasks/{taskID}")
|
||||
public ResponseEntity<?> deleteTask(@PathVariable long taskID) {
|
||||
PermissionResult<Task> taskPermissionResult = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if (!taskPermissionResult.isHasPermissions()) {
|
||||
if (taskPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -139,7 +139,7 @@ public class TaskController {
|
||||
@GetMapping("/tasks/{taskID}")
|
||||
public ResponseEntity<?> loadTaskDetails(@PathVariable long taskID) {
|
||||
PermissionResult<Task> taskPermissionResult = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if (!taskPermissionResult.isHasPermissions()) {
|
||||
if (taskPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -153,7 +153,7 @@ public class TaskController {
|
||||
@PostMapping("/tasks/{taskID}/finish")
|
||||
public ResponseEntity<?> finishTask(@PathVariable long taskID) {
|
||||
PermissionResult<Task> taskPermissionResult = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if (!taskPermissionResult.isHasPermissions()) {
|
||||
if (taskPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,45 @@
|
||||
package core.api.controller;
|
||||
|
||||
import core.api.models.timemanager.tasks.repeatinginfo.TaskRepeatDayInfo;
|
||||
import core.api.models.timemanager.tasks.repeatinginfo.TaskRepeatWeekInfo;
|
||||
import core.services.ServiceExitCode;
|
||||
import core.services.ServiceResult;
|
||||
import core.services.TaskSeriesService;
|
||||
import core.services.TaskService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.validation.Valid;
|
||||
|
||||
@CrossOrigin(origins = "*", maxAge = 3600)
|
||||
@RestController
|
||||
@RequestMapping("/api")
|
||||
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/{taskID}/taskseries/daily")
|
||||
public ResponseEntity<?> onCreateTaskSeries(@PathVariable long taskID, @Valid @RequestBody TaskRepeatDayInfo taskRepeatDayInfo) {
|
||||
var taskPermission = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(taskPermission.hasIssue()) {
|
||||
return taskPermission.mapToResponseEntity();
|
||||
} else {
|
||||
ServiceExitCode serviceExitCode = taskSeriesService.createTaskSeries(taskPermission.getResult(), taskRepeatDayInfo);
|
||||
return serviceExitCode.mapToResponseEntity();
|
||||
}
|
||||
}
|
||||
}
|
@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@CrossOrigin(origins = "*", maxAge = 3600)
|
||||
@RestController
|
||||
@ -40,7 +39,7 @@ public class TaskgroupController {
|
||||
@PostMapping("/taskgroups/{taskgroupID}")
|
||||
public ResponseEntity<?> editTaskgroup(@PathVariable long taskgroupID, @Valid @RequestBody TaskgroupFieldInfo taskgroupFieldInfo) {
|
||||
PermissionResult<Taskgroup> taskgroupPermissionResult = taskgroupService.getTaskgroupByIDAndUsername(taskgroupID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!taskgroupPermissionResult.isHasPermissions()) {
|
||||
if(taskgroupPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -59,7 +58,7 @@ public class TaskgroupController {
|
||||
@DeleteMapping("/taskgroups/{taskgroupID}")
|
||||
public ResponseEntity<?> deleteTaskgroup(@PathVariable long taskgroupID) {
|
||||
PermissionResult<Taskgroup> taskgroupPermissionResult = taskgroupService.getTaskgroupByIDAndUsername(taskgroupID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if (!taskgroupPermissionResult.isHasPermissions()) {
|
||||
if (taskgroupPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -88,7 +87,7 @@ public class TaskgroupController {
|
||||
@GetMapping("/taskgroups/{taskgroupID}")
|
||||
public ResponseEntity<?> getDetails(@PathVariable long taskgroupID) {
|
||||
PermissionResult<Taskgroup> taskgroupPermissionResult = taskgroupService.getTaskgroupByIDAndUsername(taskgroupID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if(!taskgroupPermissionResult.isHasPermissions()) {
|
||||
if(taskgroupPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
@ -102,7 +101,7 @@ public class TaskgroupController {
|
||||
@DeleteMapping("/taskgroups/{taskgroupID}/clear")
|
||||
public ResponseEntity<?> clearTasks(@PathVariable long taskgroupID) {
|
||||
PermissionResult<Taskgroup> taskgroupPermissionResult = taskgroupService.getTaskgroupByIDAndUsername(taskgroupID, SecurityContextHolder.getContext().getAuthentication().getName());
|
||||
if (!taskgroupPermissionResult.isHasPermissions()) {
|
||||
if (taskgroupPermissionResult.isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,8 @@
|
||||
package core.api.models.timemanager.tasks.repeatinginfo;
|
||||
|
||||
public enum DeadlineStrategy {
|
||||
|
||||
FIX_DEADLINE,
|
||||
DEADLINE_EQUAL_START,
|
||||
DEADLINE_FIT_START
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package core.api.models.timemanager.tasks.repeatinginfo;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
public class TaskRepeatDayInfo {
|
||||
|
||||
private int offset;
|
||||
private DeadlineStrategy deadlineStrategy;
|
||||
|
||||
private LocalDate endDate;
|
||||
|
||||
public int getOffset() {
|
||||
return offset;
|
||||
}
|
||||
|
||||
public void setOffset(int offset) {
|
||||
this.offset = offset;
|
||||
}
|
||||
|
||||
public DeadlineStrategy getDeadlineStrategy() {
|
||||
return deadlineStrategy;
|
||||
}
|
||||
|
||||
public void setDeadlineStrategy(DeadlineStrategy deadlineStrategy) {
|
||||
this.deadlineStrategy = deadlineStrategy;
|
||||
}
|
||||
|
||||
public LocalDate getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public void setEndDate(LocalDate endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package core.api.models.timemanager.tasks.repeatinginfo;
|
||||
|
||||
public class TaskRepeatWeekDayInfo {
|
||||
|
||||
private int weekday;
|
||||
private int offset;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package core.api.models.timemanager.tasks.repeatinginfo;
|
||||
|
||||
import org.hibernate.validator.constraints.Length;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
public class TaskRepeatWeekInfo {
|
||||
|
||||
@Length(min = 1, max = 7)
|
||||
private List<TaskRepeatWeekDayInfo> weekDayInfos;
|
||||
|
||||
private DeadlineStrategy deadlineStrategy;
|
||||
|
||||
private LocalDate endDate;
|
||||
|
||||
public List<TaskRepeatWeekDayInfo> getWeekDayInfos() {
|
||||
return weekDayInfos;
|
||||
}
|
||||
|
||||
public void setWeekDayInfos(List<TaskRepeatWeekDayInfo> weekDayInfos) {
|
||||
this.weekDayInfos = weekDayInfos;
|
||||
}
|
||||
|
||||
public DeadlineStrategy getDeadlineStrategy() {
|
||||
return deadlineStrategy;
|
||||
}
|
||||
|
||||
public void setDeadlineStrategy(DeadlineStrategy deadlineStrategy) {
|
||||
this.deadlineStrategy = deadlineStrategy;
|
||||
}
|
||||
|
||||
public LocalDate getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public void setEndDate(LocalDate endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
}
|
@ -22,21 +22,17 @@ public class Task {
|
||||
@JoinColumn(name = "taskgroup_id")
|
||||
private Taskgroup taskgroup;
|
||||
private String taskName;
|
||||
|
||||
private LocalDate startDate;
|
||||
|
||||
private LocalDate deadline;
|
||||
|
||||
private int eta;
|
||||
|
||||
private boolean finished;
|
||||
|
||||
private boolean finishable;
|
||||
|
||||
@OneToMany(mappedBy = "task", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
|
||||
private List<AbstractSchedule> basicTaskSchedules;
|
||||
|
||||
private int workTime;
|
||||
@ManyToOne
|
||||
@JoinColumn(referencedColumnName = "taskSerieID")
|
||||
private TaskSerie taskSerie;
|
||||
|
||||
public Task() {
|
||||
this.basicTaskSchedules = new ArrayList<>();
|
||||
@ -52,6 +48,17 @@ public class Task {
|
||||
this.finishable = taskFieldInfo.isFinishable();
|
||||
}
|
||||
|
||||
public static Task cloneTask(Task task) {
|
||||
Task clonedTask = new Task();
|
||||
clonedTask.setTaskgroup(task.getTaskgroup());
|
||||
clonedTask.setTaskName(task.taskName);
|
||||
clonedTask.setEta(task.eta);
|
||||
clonedTask.setFinished(false);
|
||||
clonedTask.setFinishable(task.finishable);
|
||||
return clonedTask;
|
||||
}
|
||||
|
||||
|
||||
public long getTaskID() {
|
||||
return taskID;
|
||||
}
|
||||
@ -124,6 +131,14 @@ public class Task {
|
||||
this.taskID = taskID;
|
||||
}
|
||||
|
||||
public TaskSerie getTaskSerie() {
|
||||
return taskSerie;
|
||||
}
|
||||
|
||||
public void setTaskSerie(TaskSerie taskSerie) {
|
||||
this.taskSerie = taskSerie;
|
||||
}
|
||||
|
||||
public List<AbstractSchedule> getBasicTaskSchedules() {
|
||||
if(basicTaskSchedules == null) {
|
||||
return new ArrayList<>();
|
||||
|
@ -0,0 +1,36 @@
|
||||
package core.entities.timemanager;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Table(name = "task_series")
|
||||
public class TaskSerie {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private long taskSerieID;
|
||||
|
||||
@OneToMany(orphanRemoval = false, cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "taskSerie")
|
||||
List<Task> tasks = new ArrayList<>();
|
||||
|
||||
|
||||
|
||||
|
||||
public long getTaskSerieID() {
|
||||
return taskSerieID;
|
||||
}
|
||||
|
||||
public List<Task> getTasks() {
|
||||
return tasks;
|
||||
}
|
||||
|
||||
public void setTasks(List<Task> tasks) {
|
||||
this.tasks = tasks;
|
||||
}
|
||||
|
||||
public void addTask(Task task) {
|
||||
this.tasks.add(task);
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package core.repositories.timemanager;
|
||||
|
||||
import core.entities.timemanager.TaskSerie;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface TaskSeriesRepository extends CrudRepository<TaskSerie, Long> {
|
||||
}
|
@ -1,5 +1,8 @@
|
||||
package core.services;
|
||||
|
||||
import core.api.models.auth.SimpleStatusResponse;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
||||
public class PermissionResult <T> extends ServiceResult<T> {
|
||||
|
||||
private boolean hasPermissions;
|
||||
@ -30,11 +33,25 @@ public class PermissionResult <T> extends ServiceResult<T> {
|
||||
this.hasPermissions = hasPermissions;
|
||||
}
|
||||
|
||||
public boolean isHasPermissions() {
|
||||
return hasPermissions;
|
||||
public boolean isNoPermissions() {
|
||||
return !hasPermissions;
|
||||
}
|
||||
|
||||
public void setHasPermissions(boolean hasPermissions) {
|
||||
this.hasPermissions = hasPermissions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResponseEntity<?> mapToResponseEntity() {
|
||||
if(isNoPermissions()) {
|
||||
return ResponseEntity.status(403).body(new SimpleStatusResponse("failed"));
|
||||
} else {
|
||||
return super.mapToResponseEntity();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasIssue() {
|
||||
return super.hasIssue() || isNoPermissions();
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,8 @@
|
||||
package core.services;
|
||||
|
||||
import core.api.models.auth.SimpleStatusResponse;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
||||
public enum ServiceExitCode {
|
||||
|
||||
OK,
|
||||
@ -7,4 +10,13 @@ public enum ServiceExitCode {
|
||||
MISSING_ENTITY,
|
||||
INVALID_OPERATION,
|
||||
INVALID_PARAMETER;
|
||||
|
||||
public ResponseEntity<SimpleStatusResponse> mapToResponseEntity() {
|
||||
return switch (this) {
|
||||
case OK -> ResponseEntity.ok(new SimpleStatusResponse("success"));
|
||||
case MISSING_ENTITY -> ResponseEntity.status(404).body(new SimpleStatusResponse("failed"));
|
||||
case ENTITY_ALREADY_EXIST -> ResponseEntity.status(409).body(new SimpleStatusResponse("failed"));
|
||||
case INVALID_OPERATION, INVALID_PARAMETER -> ResponseEntity.status(400).body(new SimpleStatusResponse("failed"));
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,8 @@
|
||||
package core.services;
|
||||
|
||||
import core.api.models.auth.SimpleStatusResponse;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
|
||||
public class ServiceResult <T> {
|
||||
|
||||
private ServiceExitCode exitCode;
|
||||
@ -34,4 +37,12 @@ public class ServiceResult <T> {
|
||||
public void setResult(T result) {
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
public boolean hasIssue() {
|
||||
return exitCode != ServiceExitCode.OK;
|
||||
}
|
||||
|
||||
public ResponseEntity<?> mapToResponseEntity() {
|
||||
return exitCode.mapToResponseEntity();
|
||||
}
|
||||
}
|
||||
|
59
backend/src/main/java/core/services/TaskSeriesService.java
Normal file
59
backend/src/main/java/core/services/TaskSeriesService.java
Normal file
@ -0,0 +1,59 @@
|
||||
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.TaskRepeatWeekInfo;
|
||||
import core.entities.timemanager.Task;
|
||||
import core.entities.timemanager.TaskSerie;
|
||||
import core.repositories.timemanager.TaskRepository;
|
||||
import core.repositories.timemanager.TaskSeriesRepository;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Service
|
||||
public class TaskSeriesService {
|
||||
|
||||
@Autowired private TaskRepository taskRepository;
|
||||
@Autowired private TaskSeriesRepository taskSeriesRepository;
|
||||
|
||||
public ServiceExitCode createTaskSeries(Task rootTask, TaskRepeatWeekInfo taskRepeatInfo) {
|
||||
return ServiceExitCode.OK;
|
||||
}
|
||||
|
||||
public ServiceExitCode createTaskSeries(Task rootTask, TaskRepeatDayInfo taskRepeatInfo) {
|
||||
if(taskRepeatInfo.getDeadlineStrategy() == DeadlineStrategy.FIX_DEADLINE) {
|
||||
return ServiceExitCode.INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
LocalDate currentTaskDate = rootTask.getStartDate().plusDays(taskRepeatInfo.getOffset());
|
||||
TaskSerie taskSerie = new TaskSerie();
|
||||
int index = 1;
|
||||
while(currentTaskDate.isBefore(taskRepeatInfo.getEndDate())) {
|
||||
Task task = Task.cloneTask(rootTask);
|
||||
task.setStartDate(currentTaskDate);
|
||||
if(taskRepeatInfo.getDeadlineStrategy() == DeadlineStrategy.DEADLINE_EQUAL_START) {
|
||||
task.setDeadline(currentTaskDate);
|
||||
} else if(taskRepeatInfo.getDeadlineStrategy() == DeadlineStrategy.DEADLINE_FIT_START) {
|
||||
task.setDeadline(currentTaskDate.plusDays(taskRepeatInfo.getOffset()-1));
|
||||
}
|
||||
taskSerie.addTask(task);
|
||||
task.setTaskSerie(taskSerie);
|
||||
task.setTaskName(task.getTaskName().replace("${i}", convertIndexToString(index)));
|
||||
currentTaskDate = currentTaskDate.plusDays(taskRepeatInfo.getOffset());
|
||||
index++;
|
||||
}
|
||||
|
||||
taskRepository.saveAll(taskSerie.getTasks());
|
||||
return ServiceExitCode.OK;
|
||||
}
|
||||
|
||||
public static String convertIndexToString(int index) {
|
||||
if(index < 10) {
|
||||
return "0" + index;
|
||||
} else {
|
||||
return String.valueOf(index);
|
||||
}
|
||||
}
|
||||
}
|
62
openapi.yaml
62
openapi.yaml
@ -2073,6 +2073,52 @@ paths:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/SimpleStatusResponse'
|
||||
/tasks/{taskID}/taskseries/daily:
|
||||
post:
|
||||
security:
|
||||
- API_TOKEN: []
|
||||
tags:
|
||||
- taskseries
|
||||
description: Creates a daily repeating task
|
||||
summary: daily repeating task creation
|
||||
parameters:
|
||||
- name: taskID
|
||||
in: path
|
||||
description: internal id of taskgroup
|
||||
required: true
|
||||
schema:
|
||||
type: number
|
||||
example: 1
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/TaskRepeatDayInfo'
|
||||
responses:
|
||||
200:
|
||||
description: Operation successfull
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/SimpleStatusResponse'
|
||||
403:
|
||||
description: No permission
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/SimpleStatusResponse'
|
||||
404:
|
||||
description: Task not found
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/SimpleStatusResponse'
|
||||
400:
|
||||
description: Invalid deadlineStrategy
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/SimpleStatusResponse'
|
||||
|
||||
|
||||
components:
|
||||
@ -2780,3 +2826,19 @@ components:
|
||||
ntfy_token:
|
||||
type: string
|
||||
description: token to ntfy useraccount
|
||||
TaskRepeatDayInfo:
|
||||
required:
|
||||
- offset
|
||||
- deadlineStrategy
|
||||
additionalProperties: false
|
||||
properties:
|
||||
offset:
|
||||
type: number
|
||||
description: number repeating days
|
||||
example: 7
|
||||
minimum: 1
|
||||
deadlineStrategy:
|
||||
type: string
|
||||
enum:
|
||||
- DEADLINE_EQUAL_START
|
||||
- DEADLINE_FIT_START
|
Loading…
Reference in New Issue
Block a user