From 4d1b4a0d9e9c527666062f7175e4da1c8f9b1dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sat, 11 Nov 2023 14:21:19 +0100 Subject: [PATCH] Get All Schedules of User --- .../api/controller/ScheduleController.java | 23 +++--- .../timemanager/AbstractSchedule.java | 77 ++++++++++++++++++ .../timemanager/AdvancedTaskSchedule.java | 12 +++ .../timemanager/BasicTaskSchedule.java | 79 ++----------------- .../java/core/entities/timemanager/Task.java | 19 +---- .../BasicTaskScheduleRepository.java | 19 ----- .../timemanager/ScheduleRepository.java | 16 ++++ .../core/services/TaskScheduleService.java | 13 +++ .../main/java/core/services/TaskService.java | 9 +-- .../schedules/ScheduleRepositoryTest.java | 35 ++++++++ .../core/schedules/ScheduleServiceTest.java | 49 ++++++++++++ .../test/resources/basicScheduleEntries.sql | 3 + 12 files changed, 229 insertions(+), 125 deletions(-) create mode 100644 backend/src/main/java/core/entities/timemanager/AbstractSchedule.java create mode 100644 backend/src/main/java/core/entities/timemanager/AdvancedTaskSchedule.java delete mode 100644 backend/src/main/java/core/repositories/timemanager/BasicTaskScheduleRepository.java create mode 100644 backend/src/main/java/core/repositories/timemanager/ScheduleRepository.java create mode 100644 backend/src/test/java/core/schedules/ScheduleRepositoryTest.java create mode 100644 backend/src/test/java/core/schedules/ScheduleServiceTest.java create mode 100644 backend/src/test/resources/basicScheduleEntries.sql diff --git a/backend/src/main/java/core/api/controller/ScheduleController.java b/backend/src/main/java/core/api/controller/ScheduleController.java index 5406dfe..da39359 100644 --- a/backend/src/main/java/core/api/controller/ScheduleController.java +++ b/backend/src/main/java/core/api/controller/ScheduleController.java @@ -1,26 +1,27 @@ package core.api.controller; -import core.api.models.auth.SimpleStatusResponse; -import core.api.models.timemanager.taskSchedule.*; -import core.entities.User; -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 core.entities.timemanager.AbstractSchedule; +import core.services.TaskScheduleService; 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; -import java.util.*; +import java.util.List; + @CrossOrigin(origins = "*", maxAge = 3600) @RestController @RequestMapping("/api") public class ScheduleController { + @Autowired private TaskScheduleService taskScheduleService; + @GetMapping("/schedules") + public ResponseEntity loadAllSchedulesOfUser() { + String username = SecurityContextHolder.getContext().getAuthentication().getName(); + List schedules = taskScheduleService.getAllSchedulesOfUser(username); + return ResponseEntity.ok(schedules); + } } diff --git a/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java b/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java new file mode 100644 index 0000000..d04e04f --- /dev/null +++ b/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java @@ -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); + } +} diff --git a/backend/src/main/java/core/entities/timemanager/AdvancedTaskSchedule.java b/backend/src/main/java/core/entities/timemanager/AdvancedTaskSchedule.java new file mode 100644 index 0000000..2f5a0c1 --- /dev/null +++ b/backend/src/main/java/core/entities/timemanager/AdvancedTaskSchedule.java @@ -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; +} diff --git a/backend/src/main/java/core/entities/timemanager/BasicTaskSchedule.java b/backend/src/main/java/core/entities/timemanager/BasicTaskSchedule.java index 00d281e..aab9e9b 100644 --- a/backend/src/main/java/core/entities/timemanager/BasicTaskSchedule.java +++ b/backend/src/main/java/core/entities/timemanager/BasicTaskSchedule.java @@ -6,51 +6,17 @@ import java.time.LocalDateTime; import java.util.Objects; @Entity -@Table(name = "basic_schedules") -public class BasicTaskSchedule { +@DiscriminatorValue("0") +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 LocalDateTime startTime; - private LocalDateTime finishedTime; - - public BasicTaskSchedule(Task task, LocalDate scheduleDate) { - this.task = task; - this.scheduleDate = scheduleDate; - } + private LocalDate scheduleDate; public BasicTaskSchedule() { } - public void start() { - this.startTime = LocalDateTime.now(); - } - - 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 BasicTaskSchedule(Task task, LocalDateTime startTime, LocalDateTime stopTime, LocalDate scheduleDate) { + super(task, startTime, stopTime); + this.scheduleDate = scheduleDate; } public LocalDate getScheduleDate() { @@ -60,37 +26,4 @@ public class BasicTaskSchedule { public void setScheduleDate(LocalDate 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); - } } diff --git a/backend/src/main/java/core/entities/timemanager/Task.java b/backend/src/main/java/core/entities/timemanager/Task.java index 440f59b..4d9271a 100644 --- a/backend/src/main/java/core/entities/timemanager/Task.java +++ b/backend/src/main/java/core/entities/timemanager/Task.java @@ -29,7 +29,7 @@ public class Task { private boolean finished; @OneToMany(mappedBy = "task", cascade = CascadeType.ALL, fetch = FetchType.EAGER) - private List basicTaskSchedules; + private List basicTaskSchedules; private int workTime; @@ -117,27 +117,14 @@ public class Task { this.taskID = taskID; } - public List getBasicTaskSchedules() { + public List getBasicTaskSchedules() { return basicTaskSchedules; } - public void setBasicTaskSchedules(List basicTaskSchedules) { + public void setBasicTaskSchedules(List 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 public boolean equals(Object o) { if (this == o) return true; diff --git a/backend/src/main/java/core/repositories/timemanager/BasicTaskScheduleRepository.java b/backend/src/main/java/core/repositories/timemanager/BasicTaskScheduleRepository.java deleted file mode 100644 index a809c32..0000000 --- a/backend/src/main/java/core/repositories/timemanager/BasicTaskScheduleRepository.java +++ /dev/null @@ -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 { - -} diff --git a/backend/src/main/java/core/repositories/timemanager/ScheduleRepository.java b/backend/src/main/java/core/repositories/timemanager/ScheduleRepository.java new file mode 100644 index 0000000..c947222 --- /dev/null +++ b/backend/src/main/java/core/repositories/timemanager/ScheduleRepository.java @@ -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 { + + @Query(value = "SELECT s FROM AbstractSchedule s WHERE s.task.taskgroup.user.username = ?1") + List findAllByUsername(String username); + +} diff --git a/backend/src/main/java/core/services/TaskScheduleService.java b/backend/src/main/java/core/services/TaskScheduleService.java index c489411..a546c36 100644 --- a/backend/src/main/java/core/services/TaskScheduleService.java +++ b/backend/src/main/java/core/services/TaskScheduleService.java @@ -1,9 +1,22 @@ 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 java.util.List; +import java.util.Optional; + @Service public class TaskScheduleService { + @Autowired private ScheduleRepository scheduleRepository; + @Autowired private UserRepository userRepository; + public List getAllSchedulesOfUser(String username) { + return scheduleRepository.findAllByUsername(username); + } } diff --git a/backend/src/main/java/core/services/TaskService.java b/backend/src/main/java/core/services/TaskService.java index eaa1f24..1df8378 100644 --- a/backend/src/main/java/core/services/TaskService.java +++ b/backend/src/main/java/core/services/TaskService.java @@ -2,17 +2,14 @@ package core.services; import core.api.models.timemanager.tasks.TaskFieldInfo; import core.api.models.timemanager.tasks.TaskScope; -import core.entities.timemanager.BasicTaskSchedule; import core.entities.timemanager.Task; import core.entities.timemanager.Taskgroup; -import core.repositories.timemanager.BasicTaskScheduleRepository; import core.repositories.timemanager.TaskRepository; import core.repositories.timemanager.TaskgroupRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.*; @Service @@ -93,7 +90,7 @@ public class TaskService { } public void deleteTask(Task task) { - taskScheduleService.deleteScheduleByTask(task); + //taskScheduleService.deleteScheduleByTask(task); taskRepository.deleteByTaskID(task.getTaskID()); } @@ -106,7 +103,7 @@ public class TaskService { task.finish(); taskRepository.save(task); - List removedBasicTaskSchedules = new LinkedList<>(); + /*List removedBasicTaskSchedules = new LinkedList<>(); for(BasicTaskSchedule basicTaskSchedule : task.getBasicTaskSchedules()) { if(basicTaskSchedule.getStartTime() == null) { removedBasicTaskSchedules.add(basicTaskSchedule); @@ -120,7 +117,7 @@ public class TaskService { task.getBasicTaskSchedules().remove(deletedTaskSchedule); taskRepository.save(task); taskScheduleService.deleteBasicSchedule(deletedTaskSchedule); - } + }*/ } public List loadAllTasks(String username, TaskScope scope) { diff --git a/backend/src/test/java/core/schedules/ScheduleRepositoryTest.java b/backend/src/test/java/core/schedules/ScheduleRepositoryTest.java new file mode 100644 index 0000000..c113d3e --- /dev/null +++ b/backend/src/test/java/core/schedules/ScheduleRepositoryTest.java @@ -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()); + } +} diff --git a/backend/src/test/java/core/schedules/ScheduleServiceTest.java b/backend/src/test/java/core/schedules/ScheduleServiceTest.java new file mode 100644 index 0000000..1d83cfb --- /dev/null +++ b/backend/src/test/java/core/schedules/ScheduleServiceTest.java @@ -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 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))); + } +} diff --git a/backend/src/test/resources/basicScheduleEntries.sql b/backend/src/test/resources/basicScheduleEntries.sql new file mode 100644 index 0000000..894eab7 --- /dev/null +++ b/backend/src/test/resources/basicScheduleEntries.sql @@ -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); \ No newline at end of file