schedule-refactor #45
@ -1,13 +1,20 @@
|
|||||||
package core.api.controller;
|
package core.api.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import core.api.models.auth.SimpleStatusResponse;
|
||||||
|
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.AbstractSchedule;
|
||||||
import core.services.TaskScheduleService;
|
import core.entities.timemanager.Task;
|
||||||
|
import core.services.*;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.validation.Valid;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
@ -17,11 +24,46 @@ import java.util.List;
|
|||||||
public class ScheduleController {
|
public class ScheduleController {
|
||||||
|
|
||||||
@Autowired private TaskScheduleService taskScheduleService;
|
@Autowired private TaskScheduleService taskScheduleService;
|
||||||
|
@Autowired private TaskService taskService;
|
||||||
@GetMapping("/schedules")
|
@GetMapping("/schedules")
|
||||||
public ResponseEntity<?> loadAllSchedulesOfUser() {
|
public ResponseEntity<?> loadAllSchedulesOfUser() {
|
||||||
String username = SecurityContextHolder.getContext().getAuthentication().getName();
|
String username = SecurityContextHolder.getContext().getAuthentication().getName();
|
||||||
List<AbstractSchedule> schedules = taskScheduleService.getAllSchedulesOfUser(username);
|
List<AbstractSchedule> schedules = taskScheduleService.getAllSchedulesOfUser(username);
|
||||||
|
|
||||||
return ResponseEntity.ok(schedules);
|
return ResponseEntity.ok(schedules.stream().map(AbstractSchedule::toScheduleInfo).toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/schedules/{taskID}")
|
||||||
|
public ResponseEntity<?> loadAllSchedulesOfTask(@PathVariable long taskID) {
|
||||||
|
PermissionResult<Task> permissionResult = taskService.getTaskPermissions(taskID, 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"));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<AbstractSchedule> taskSchedules = permissionResult.getResult().getBasicTaskSchedules();
|
||||||
|
return ResponseEntity.ok(taskSchedules.stream().map(AbstractSchedule::toScheduleInfo).toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/schedules/{taskID}")
|
||||||
|
public ResponseEntity<?> createSchedule(@PathVariable long taskID, @RequestBody @Valid ScheduleFieldInfo scheduleFieldInfo) {
|
||||||
|
PermissionResult<Task> permissionResult = taskService.getTaskPermissions(taskID, 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(scheduleFieldInfo instanceof BasicScheduleFieldInfo) {
|
||||||
|
ServiceResult<AbstractSchedule> scheduleResult = taskScheduleService.scheduleBasic(permissionResult.getResult(), (BasicScheduleFieldInfo) scheduleFieldInfo);
|
||||||
|
return ResponseEntity.ok(scheduleResult.getResult().toScheduleInfo());
|
||||||
|
} else {
|
||||||
|
return ResponseEntity.status(400).body(new SimpleStatusResponse("failed"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
package core.api.models.timemanager.taskSchedule;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
public class BasicScheduleFieldInfo extends ScheduleFieldInfo{
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private LocalDate scheduleDate;
|
||||||
|
|
||||||
|
public BasicScheduleFieldInfo(LocalDate localDate) {
|
||||||
|
this.scheduleDate = localDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BasicScheduleFieldInfo() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDate getScheduleDate() {
|
||||||
|
return scheduleDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScheduleDate(LocalDate scheduleDate) {
|
||||||
|
this.scheduleDate = scheduleDate;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package core.api.models.timemanager.taskSchedule;
|
||||||
|
|
||||||
|
import core.api.models.timemanager.taskgroup.TaskgroupEntityInfo;
|
||||||
|
import core.entities.timemanager.Task;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BasicScheduleInfo extends ScheduleInfo{
|
||||||
|
|
||||||
|
private LocalDate scheduleDate;
|
||||||
|
public BasicScheduleInfo(long scheduleID, ScheduleType scheduleType, LocalDateTime startTime, LocalDateTime stopTime, int activeMinutes, Task task, List<TaskgroupEntityInfo> taskgroupPath) {
|
||||||
|
super(scheduleID, scheduleType, startTime, stopTime, activeMinutes, task, taskgroupPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
package core.api.models.timemanager.taskSchedule;
|
||||||
|
|
||||||
|
public abstract class ScheduleFieldInfo {
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package core.api.models.timemanager.taskSchedule;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import core.api.models.timemanager.taskgroup.TaskgroupEntityInfo;
|
||||||
|
import core.api.models.timemanager.tasks.TaskShortInfo;
|
||||||
|
import core.entities.timemanager.Task;
|
||||||
|
import core.entities.timemanager.Taskgroup;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public abstract class ScheduleInfo {
|
||||||
|
|
||||||
|
@JsonProperty
|
||||||
|
private long scheduleID;
|
||||||
|
@JsonProperty
|
||||||
|
private ScheduleType scheduleType;
|
||||||
|
@JsonProperty
|
||||||
|
private LocalDateTime startTime;
|
||||||
|
@JsonProperty
|
||||||
|
private LocalDateTime stopTime;
|
||||||
|
@JsonProperty
|
||||||
|
private int activeMinutes;
|
||||||
|
@JsonProperty
|
||||||
|
private TaskShortInfo task;
|
||||||
|
@JsonProperty
|
||||||
|
private List<TaskgroupEntityInfo> taskgroupPath;
|
||||||
|
|
||||||
|
public ScheduleInfo(long scheduleID, ScheduleType scheduleType, LocalDateTime startTime, LocalDateTime stopTime, int activeMinutes, Task task, List<TaskgroupEntityInfo> taskgroupPath) {
|
||||||
|
this.scheduleID = scheduleID;
|
||||||
|
this.scheduleType = scheduleType;
|
||||||
|
this.startTime = startTime;
|
||||||
|
this.stopTime = stopTime;
|
||||||
|
this.activeMinutes = activeMinutes;
|
||||||
|
this.task = new TaskShortInfo(task);
|
||||||
|
this.taskgroupPath = taskgroupPath;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package core.api.models.timemanager.taskSchedule;
|
||||||
|
|
||||||
|
public enum ScheduleType {
|
||||||
|
|
||||||
|
BASIC,
|
||||||
|
MODERATE,
|
||||||
|
ADVANCED;
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
package core.entities.timemanager;
|
package core.entities.timemanager;
|
||||||
|
|
||||||
|
import core.api.models.timemanager.taskSchedule.ScheduleInfo;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -12,14 +14,14 @@ public abstract class AbstractSchedule {
|
|||||||
|
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
private long scheduleID;
|
protected long scheduleID;
|
||||||
|
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(referencedColumnName = "taskID", name = "task")
|
@JoinColumn(referencedColumnName = "taskID", name = "task")
|
||||||
private Task task;
|
protected Task task;
|
||||||
|
|
||||||
private LocalDateTime startTime;
|
protected LocalDateTime startTime;
|
||||||
private LocalDateTime stopTime;
|
protected LocalDateTime stopTime;
|
||||||
|
|
||||||
public AbstractSchedule() {
|
public AbstractSchedule() {
|
||||||
}
|
}
|
||||||
@ -30,6 +32,10 @@ public abstract class AbstractSchedule {
|
|||||||
this.stopTime = stopTime;
|
this.stopTime = stopTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AbstractSchedule(Task task) {
|
||||||
|
this.task = task;
|
||||||
|
}
|
||||||
|
|
||||||
public long getScheduleID() {
|
public long getScheduleID() {
|
||||||
return scheduleID;
|
return scheduleID;
|
||||||
}
|
}
|
||||||
@ -74,4 +80,6 @@ public abstract class AbstractSchedule {
|
|||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hash(scheduleID, task, startTime, stopTime);
|
return Objects.hash(scheduleID, task, startTime, stopTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract ScheduleInfo toScheduleInfo();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package core.entities.timemanager;
|
package core.entities.timemanager;
|
||||||
|
|
||||||
|
import core.api.models.timemanager.taskSchedule.ScheduleInfo;
|
||||||
|
|
||||||
import javax.persistence.DiscriminatorValue;
|
import javax.persistence.DiscriminatorValue;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
@ -9,4 +11,9 @@ public class AdvancedTaskSchedule extends AbstractSchedule {
|
|||||||
|
|
||||||
private LocalDateTime scheduleStart;
|
private LocalDateTime scheduleStart;
|
||||||
private LocalDateTime scheduleEnd;
|
private LocalDateTime scheduleEnd;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ScheduleInfo toScheduleInfo() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,16 @@
|
|||||||
package core.entities.timemanager;
|
package core.entities.timemanager;
|
||||||
|
|
||||||
|
import core.api.models.timemanager.taskSchedule.BasicScheduleInfo;
|
||||||
|
import core.api.models.timemanager.taskSchedule.ScheduleInfo;
|
||||||
|
import core.api.models.timemanager.taskSchedule.ScheduleType;
|
||||||
|
import core.api.models.timemanager.taskgroup.TaskgroupEntityInfo;
|
||||||
|
import core.api.models.timemanager.tasks.TaskEntityInfo;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
|
import java.time.Duration;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@ -19,6 +27,11 @@ public class BasicTaskSchedule extends AbstractSchedule{
|
|||||||
this.scheduleDate = scheduleDate;
|
this.scheduleDate = scheduleDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BasicTaskSchedule(Task task, LocalDate scheduleDate) {
|
||||||
|
super(task);
|
||||||
|
this.scheduleDate = scheduleDate;
|
||||||
|
}
|
||||||
|
|
||||||
public LocalDate getScheduleDate() {
|
public LocalDate getScheduleDate() {
|
||||||
return scheduleDate;
|
return scheduleDate;
|
||||||
}
|
}
|
||||||
@ -26,4 +39,22 @@ public class BasicTaskSchedule extends AbstractSchedule{
|
|||||||
public void setScheduleDate(LocalDate scheduleDate) {
|
public void setScheduleDate(LocalDate scheduleDate) {
|
||||||
this.scheduleDate = scheduleDate;
|
this.scheduleDate = scheduleDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ScheduleInfo toScheduleInfo() {
|
||||||
|
int activeMinutes = calcActiveMinutes();
|
||||||
|
List<TaskgroupEntityInfo> taskgroupEntityInfos = Taskgroup.getAncestorList(task.getTaskgroup()).stream().map(TaskgroupEntityInfo::new).toList();
|
||||||
|
return new BasicScheduleInfo(scheduleID, ScheduleType.BASIC, startTime, stopTime, activeMinutes, task, taskgroupEntityInfos);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int calcActiveMinutes() {
|
||||||
|
if(startTime == null) {
|
||||||
|
return 0;
|
||||||
|
} else if(stopTime == null) {
|
||||||
|
Duration duration = Duration.between(startTime, LocalDateTime.now());
|
||||||
|
return (int) duration.toMinutes();
|
||||||
|
} else {
|
||||||
|
Duration duration = Duration.between(startTime, stopTime);
|
||||||
|
return (int) duration.toMinutes();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,17 @@
|
|||||||
package core.services;
|
package core.services;
|
||||||
|
|
||||||
|
import core.api.models.timemanager.taskSchedule.BasicScheduleFieldInfo;
|
||||||
|
import core.api.models.timemanager.taskSchedule.ScheduleFieldInfo;
|
||||||
import core.entities.User;
|
import core.entities.User;
|
||||||
import core.entities.timemanager.AbstractSchedule;
|
import core.entities.timemanager.AbstractSchedule;
|
||||||
|
import core.entities.timemanager.BasicTaskSchedule;
|
||||||
|
import core.entities.timemanager.Task;
|
||||||
import core.repositories.UserRepository;
|
import core.repositories.UserRepository;
|
||||||
import core.repositories.timemanager.ScheduleRepository;
|
import core.repositories.timemanager.ScheduleRepository;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@ -19,4 +24,15 @@ public class TaskScheduleService {
|
|||||||
public List<AbstractSchedule> getAllSchedulesOfUser(String username) {
|
public List<AbstractSchedule> getAllSchedulesOfUser(String username) {
|
||||||
return scheduleRepository.findAllByUsername(username);
|
return scheduleRepository.findAllByUsername(username);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ServiceResult<AbstractSchedule> scheduleBasic(Task task, BasicScheduleFieldInfo scheduleFieldInfo) {
|
||||||
|
if(task.isFinished() || scheduleFieldInfo.getScheduleDate().isBefore(LocalDate.now())) {
|
||||||
|
return new ServiceResult<>(ServiceExitCode.INVALID_OPERATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicTaskSchedule basicTaskSchedule = new BasicTaskSchedule(task, scheduleFieldInfo.getScheduleDate());
|
||||||
|
scheduleRepository.save(basicTaskSchedule);
|
||||||
|
|
||||||
|
return new ServiceResult<>(basicTaskSchedule);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,13 @@
|
|||||||
package core.schedules;
|
package core.schedules;
|
||||||
|
|
||||||
|
import core.api.models.timemanager.taskSchedule.BasicScheduleFieldInfo;
|
||||||
|
import core.api.models.timemanager.taskSchedule.BasicScheduleInfo;
|
||||||
import core.entities.timemanager.AbstractSchedule;
|
import core.entities.timemanager.AbstractSchedule;
|
||||||
|
import core.entities.timemanager.BasicTaskSchedule;
|
||||||
|
import core.entities.timemanager.Task;
|
||||||
import core.repositories.timemanager.TaskgroupRepository;
|
import core.repositories.timemanager.TaskgroupRepository;
|
||||||
|
import core.services.ServiceExitCode;
|
||||||
|
import core.services.ServiceResult;
|
||||||
import core.services.TaskScheduleService;
|
import core.services.TaskScheduleService;
|
||||||
import core.services.TaskgroupService;
|
import core.services.TaskgroupService;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@ -13,8 +19,10 @@ import org.springframework.test.context.jdbc.SqlGroup;
|
|||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
|
||||||
import static org.hibernate.validator.internal.util.Contracts.assertTrue;
|
import static org.hibernate.validator.internal.util.Contracts.assertTrue;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
@ -46,4 +54,25 @@ public class ScheduleServiceTest {
|
|||||||
assertTrue(result_1.contains(entityManager.find(AbstractSchedule.class, 1L)));
|
assertTrue(result_1.contains(entityManager.find(AbstractSchedule.class, 1L)));
|
||||||
assertTrue(result_1.contains(entityManager.find(AbstractSchedule.class, 2L)));
|
assertTrue(result_1.contains(entityManager.find(AbstractSchedule.class, 2L)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@SqlGroup({
|
||||||
|
@Sql("classpath:taskgroupRepositoryTestEntries.sql"),
|
||||||
|
@Sql("classpath:taskRepositoryEntries.sql"),
|
||||||
|
@Sql("classpath:basicScheduleEntries.sql")
|
||||||
|
})
|
||||||
|
void scheduleBasic() {
|
||||||
|
//Situation 1: Schedule finished Task
|
||||||
|
ServiceResult<AbstractSchedule> result_1 = taskScheduleService.scheduleBasic(entityManager.find(Task.class, 2L), new BasicScheduleFieldInfo(LocalDate.now()));
|
||||||
|
assertEquals(ServiceExitCode.INVALID_OPERATION, result_1.getExitCode());
|
||||||
|
|
||||||
|
//Situation 2: Schedule before today
|
||||||
|
ServiceResult<AbstractSchedule> result_2 = taskScheduleService.scheduleBasic(entityManager.find(Task.class, 1L), new BasicScheduleFieldInfo(LocalDate.of(2010, 3, 14)));
|
||||||
|
assertEquals(ServiceExitCode.INVALID_OPERATION, result_2.getExitCode());
|
||||||
|
|
||||||
|
//Situation 3: Valid schedule
|
||||||
|
ServiceResult<AbstractSchedule> result_3 = taskScheduleService.scheduleBasic(entityManager.find(Task.class, 1L), new BasicScheduleFieldInfo(LocalDate.now()));
|
||||||
|
assertEquals(ServiceExitCode.OK, result_3.getExitCode());
|
||||||
|
assertThat(entityManager.find(BasicTaskSchedule.class, result_3.getResult().getScheduleID())).isNotNull();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user