schedule-refactor #45

Merged
sebastian merged 18 commits from schedule-refactor into master 2023-11-11 18:56:16 +01:00
12 changed files with 229 additions and 125 deletions
Showing only changes of commit 4d1b4a0d9e - Show all commits

View File

@ -1,26 +1,27 @@
package core.api.controller; package core.api.controller;
import core.api.models.auth.SimpleStatusResponse;
import core.api.models.timemanager.taskSchedule.*; import core.entities.timemanager.AbstractSchedule;
import core.entities.User; import core.services.TaskScheduleService;
import core.entities.timemanager.BasicTaskSchedule;
import core.entities.timemanager.ScheduleType;
import core.entities.timemanager.Task;
import core.repositories.UserRepository;
import core.repositories.timemanager.BasicTaskScheduleRepository;
import core.services.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
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.*;
@CrossOrigin(origins = "*", maxAge = 3600) @CrossOrigin(origins = "*", maxAge = 3600)
@RestController @RestController
@RequestMapping("/api") @RequestMapping("/api")
public class ScheduleController { public class ScheduleController {
@Autowired private TaskScheduleService taskScheduleService;
@GetMapping("/schedules")
public ResponseEntity<?> loadAllSchedulesOfUser() {
String username = SecurityContextHolder.getContext().getAuthentication().getName();
List<AbstractSchedule> schedules = taskScheduleService.getAllSchedulesOfUser(username);
return ResponseEntity.ok(schedules);
}
} }

View File

@ -0,0 +1,77 @@
package core.entities.timemanager;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.Objects;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="scheduleType",
discriminatorType = DiscriminatorType.INTEGER)
public abstract class AbstractSchedule {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long scheduleID;
@ManyToOne
@JoinColumn(referencedColumnName = "taskID", name = "task")
private Task task;
private LocalDateTime startTime;
private LocalDateTime stopTime;
public AbstractSchedule() {
}
public AbstractSchedule(Task task, LocalDateTime startTime, LocalDateTime stopTime) {
this.task = task;
this.startTime = startTime;
this.stopTime = stopTime;
}
public long getScheduleID() {
return scheduleID;
}
public void setScheduleID(long scheduleID) {
this.scheduleID = scheduleID;
}
public Task getTask() {
return task;
}
public void setTask(Task task) {
this.task = task;
}
public LocalDateTime getStartTime() {
return startTime;
}
public void setStartTime(LocalDateTime startTime) {
this.startTime = startTime;
}
public LocalDateTime getStopTime() {
return stopTime;
}
public void setStopTime(LocalDateTime stopTime) {
this.stopTime = stopTime;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AbstractSchedule that = (AbstractSchedule) o;
return scheduleID == that.scheduleID && Objects.equals(task, that.task) && Objects.equals(startTime, that.startTime) && Objects.equals(stopTime, that.stopTime);
}
@Override
public int hashCode() {
return Objects.hash(scheduleID, task, startTime, stopTime);
}
}

View File

@ -0,0 +1,12 @@
package core.entities.timemanager;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import java.time.LocalDateTime;
@Entity
@DiscriminatorValue("1")
public class AdvancedTaskSchedule extends AbstractSchedule {
private LocalDateTime scheduleStart;
private LocalDateTime scheduleEnd;
}

View File

@ -6,51 +6,17 @@ import java.time.LocalDateTime;
import java.util.Objects; import java.util.Objects;
@Entity @Entity
@Table(name = "basic_schedules") @DiscriminatorValue("0")
public class BasicTaskSchedule { public class BasicTaskSchedule extends AbstractSchedule{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long scheduleID;
@ManyToOne
@JoinColumn(referencedColumnName = "taskID", name = "task")
private Task task;
private LocalDate scheduleDate; private LocalDate scheduleDate;
private LocalDateTime startTime;
private LocalDateTime finishedTime;
public BasicTaskSchedule(Task task, LocalDate scheduleDate) {
this.task = task;
this.scheduleDate = scheduleDate;
}
public BasicTaskSchedule() { public BasicTaskSchedule() {
} }
public void start() { public BasicTaskSchedule(Task task, LocalDateTime startTime, LocalDateTime stopTime, LocalDate scheduleDate) {
this.startTime = LocalDateTime.now(); super(task, startTime, stopTime);
} this.scheduleDate = scheduleDate;
public void end() {
this.finishedTime = LocalDateTime.now();
}
public long getScheduleID() {
return scheduleID;
}
public void setScheduleID(long scheduleID) {
this.scheduleID = scheduleID;
}
public Task getTask() {
return task;
}
public void setTask(Task task) {
this.task = task;
} }
public LocalDate getScheduleDate() { public LocalDate getScheduleDate() {
@ -60,37 +26,4 @@ public class BasicTaskSchedule {
public void setScheduleDate(LocalDate scheduleDate) { public void setScheduleDate(LocalDate scheduleDate) {
this.scheduleDate = scheduleDate; this.scheduleDate = scheduleDate;
} }
public LocalDateTime getStartTime() {
return startTime;
}
public void setStartTime(LocalDateTime startTime) {
this.startTime = startTime;
}
public LocalDateTime getFinishedTime() {
return finishedTime;
}
public void setFinishedTime(LocalDateTime finishedTime) {
this.finishedTime = finishedTime;
}
public boolean isActivateAble() {
return startTime == null;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BasicTaskSchedule that = (BasicTaskSchedule) o;
return scheduleID == that.scheduleID;
}
@Override
public int hashCode() {
return Objects.hash(scheduleID);
}
} }

View File

@ -29,7 +29,7 @@ public class Task {
private boolean finished; private boolean finished;
@OneToMany(mappedBy = "task", cascade = CascadeType.ALL, fetch = FetchType.EAGER) @OneToMany(mappedBy = "task", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<BasicTaskSchedule> basicTaskSchedules; private List<AbstractSchedule> basicTaskSchedules;
private int workTime; private int workTime;
@ -117,27 +117,14 @@ public class Task {
this.taskID = taskID; this.taskID = taskID;
} }
public List<BasicTaskSchedule> getBasicTaskSchedules() { public List<AbstractSchedule> getBasicTaskSchedules() {
return basicTaskSchedules; return basicTaskSchedules;
} }
public void setBasicTaskSchedules(List<BasicTaskSchedule> basicTaskSchedules) { public void setBasicTaskSchedules(List<AbstractSchedule> basicTaskSchedules) {
this.basicTaskSchedules = basicTaskSchedules; this.basicTaskSchedules = basicTaskSchedules;
} }
public boolean hasActiveSchedule() {
for(BasicTaskSchedule basicTaskSchedule : basicTaskSchedules) {
if(basicTaskSchedule.getStartTime() != null && basicTaskSchedule.getFinishedTime() == null) {
return true;
}
}
return false;
}
public void increaseActiveTime(int minutesSpent) {
this.workTime += minutesSpent;
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;

View File

@ -1,19 +0,0 @@
package core.repositories.timemanager;
import core.entities.User;
import core.entities.timemanager.BasicTaskSchedule;
import core.entities.timemanager.Task;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import javax.transaction.Transactional;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
@Repository
public interface BasicTaskScheduleRepository extends CrudRepository<BasicTaskSchedule, Long> {
}

View File

@ -0,0 +1,16 @@
package core.repositories.timemanager;
import core.entities.timemanager.AbstractSchedule;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface ScheduleRepository extends CrudRepository<AbstractSchedule, Long> {
@Query(value = "SELECT s FROM AbstractSchedule s WHERE s.task.taskgroup.user.username = ?1")
List<AbstractSchedule> findAllByUsername(String username);
}

View File

@ -1,9 +1,22 @@
package core.services; package core.services;
import core.entities.User;
import core.entities.timemanager.AbstractSchedule;
import core.repositories.UserRepository;
import core.repositories.timemanager.ScheduleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service @Service
public class TaskScheduleService { public class TaskScheduleService {
@Autowired private ScheduleRepository scheduleRepository;
@Autowired private UserRepository userRepository;
public List<AbstractSchedule> getAllSchedulesOfUser(String username) {
return scheduleRepository.findAllByUsername(username);
}
} }

View File

@ -2,17 +2,14 @@ package core.services;
import core.api.models.timemanager.tasks.TaskFieldInfo; import core.api.models.timemanager.tasks.TaskFieldInfo;
import core.api.models.timemanager.tasks.TaskScope; import core.api.models.timemanager.tasks.TaskScope;
import core.entities.timemanager.BasicTaskSchedule;
import core.entities.timemanager.Task; import core.entities.timemanager.Task;
import core.entities.timemanager.Taskgroup; import core.entities.timemanager.Taskgroup;
import core.repositories.timemanager.BasicTaskScheduleRepository;
import core.repositories.timemanager.TaskRepository; import core.repositories.timemanager.TaskRepository;
import core.repositories.timemanager.TaskgroupRepository; import core.repositories.timemanager.TaskgroupRepository;
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.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*; import java.util.*;
@Service @Service
@ -93,7 +90,7 @@ public class TaskService {
} }
public void deleteTask(Task task) { public void deleteTask(Task task) {
taskScheduleService.deleteScheduleByTask(task); //taskScheduleService.deleteScheduleByTask(task);
taskRepository.deleteByTaskID(task.getTaskID()); taskRepository.deleteByTaskID(task.getTaskID());
} }
@ -106,7 +103,7 @@ public class TaskService {
task.finish(); task.finish();
taskRepository.save(task); taskRepository.save(task);
List<BasicTaskSchedule> removedBasicTaskSchedules = new LinkedList<>(); /*List<BasicTaskSchedule> removedBasicTaskSchedules = new LinkedList<>();
for(BasicTaskSchedule basicTaskSchedule : task.getBasicTaskSchedules()) { for(BasicTaskSchedule basicTaskSchedule : task.getBasicTaskSchedules()) {
if(basicTaskSchedule.getStartTime() == null) { if(basicTaskSchedule.getStartTime() == null) {
removedBasicTaskSchedules.add(basicTaskSchedule); removedBasicTaskSchedules.add(basicTaskSchedule);
@ -120,7 +117,7 @@ public class TaskService {
task.getBasicTaskSchedules().remove(deletedTaskSchedule); task.getBasicTaskSchedules().remove(deletedTaskSchedule);
taskRepository.save(task); taskRepository.save(task);
taskScheduleService.deleteBasicSchedule(deletedTaskSchedule); taskScheduleService.deleteBasicSchedule(deletedTaskSchedule);
} }*/
} }
public List<Task> loadAllTasks(String username, TaskScope scope) { public List<Task> loadAllTasks(String username, TaskScope scope) {

View File

@ -0,0 +1,35 @@
package core.schedules;
import core.entities.User;
import core.repositories.timemanager.ScheduleRepository;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.jdbc.SqlGroup;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ExtendWith(SpringExtension.class)
@DataJpaTest
public class ScheduleRepositoryTest {
@Autowired private ScheduleRepository scheduleRepository;
@Autowired private TestEntityManager entityManager;
@Test
@SqlGroup({
@Sql("classpath:taskgroupRepositoryTestEntries.sql"),
@Sql("classpath:taskRepositoryEntries.sql"),
@Sql("classpath:basicScheduleEntries.sql")
})
void getAllSchedulesOfUser() {
User referenceUser_1 = entityManager.find(User.class, 1L);
User referenceUser_2 = entityManager.find(User.class, 2L);
assertEquals(0, scheduleRepository.findAllByUsername(referenceUser_2.getUsername()).size());
assertEquals(2, scheduleRepository.findAllByUsername(referenceUser_1.getUsername()).size());
}
}

View File

@ -0,0 +1,49 @@
package core.schedules;
import core.entities.timemanager.AbstractSchedule;
import core.repositories.timemanager.TaskgroupRepository;
import core.services.TaskScheduleService;
import core.services.TaskgroupService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.jdbc.SqlGroup;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;
import java.util.List;
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;
@SpringBootTest
@Transactional
public class ScheduleServiceTest {
@Autowired
private EntityManager entityManager;
@Autowired private TaskScheduleService taskScheduleService;
private static final String username = "Testuser1";
private static final String username2 = "Testuser2";
@Test
@SqlGroup({
@Sql("classpath:taskgroupRepositoryTestEntries.sql"),
@Sql("classpath:taskRepositoryEntries.sql"),
@Sql("classpath:basicScheduleEntries.sql")
})
void getAllSchedulesOfUser() {
assertEquals(0, taskScheduleService.getAllSchedulesOfUser(username2).size());
List<AbstractSchedule> result_1 = taskScheduleService.getAllSchedulesOfUser(username);
assertEquals(2, result_1.size());
assertTrue(result_1.contains(entityManager.find(AbstractSchedule.class, 1L)));
assertTrue(result_1.contains(entityManager.find(AbstractSchedule.class, 2L)));
}
}

View File

@ -0,0 +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);