diff --git a/backend/src/main/java/core/DemoApplication.java b/backend/src/main/java/core/DemoApplication.java index 70b701e..6b23158 100644 --- a/backend/src/main/java/core/DemoApplication.java +++ b/backend/src/main/java/core/DemoApplication.java @@ -2,6 +2,7 @@ package core; import core.entities.RoleEntity; import core.entities.UserRole; +import core.entities.timemanager.AdvancedTaskSchedule; import core.repositories.RoleRepository; import core.repositories.UserRepository; import core.services.PropertyService; @@ -14,6 +15,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; import org.springframework.scheduling.annotation.EnableScheduling; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + @SpringBootApplication @EnableScheduling public class DemoApplication{ @@ -24,10 +29,9 @@ public class DemoApplication{ @Bean - @NotTest public CommandLineRunner init(TaskSchedulingService taskSchedulingService) { return args -> { - taskSchedulingService.scheduleStartingTask("Finishing ConceptCreator"); + taskSchedulingService.scheduleStartReminders(); }; } diff --git a/backend/src/main/java/core/NotTest.java b/backend/src/main/java/core/NotTest.java deleted file mode 100644 index 871c773..0000000 --- a/backend/src/main/java/core/NotTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package core; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Profile; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - - -@Target({ElementType.TYPE, ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -@Profile("!test") -public @interface NotTest { -} diff --git a/backend/src/main/java/core/api/controller/ScheduleController.java b/backend/src/main/java/core/api/controller/ScheduleController.java index 4fffe8a..dcf1c52 100644 --- a/backend/src/main/java/core/api/controller/ScheduleController.java +++ b/backend/src/main/java/core/api/controller/ScheduleController.java @@ -9,6 +9,8 @@ import core.entities.timemanager.AdvancedTaskSchedule; import core.entities.timemanager.BasicTaskSchedule; import core.entities.timemanager.Task; import core.services.*; +import core.services.ntfy.TaskSchedulingService; +import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.core.context.SecurityContextHolder; @@ -27,6 +29,7 @@ public class ScheduleController { @Autowired private TaskScheduleService taskScheduleService; @Autowired private TaskService taskService; + @Autowired private TaskSchedulingService taskSchedulingService; @GetMapping("/schedules") public ResponseEntity loadAllSchedulesOfUser() { String username = SecurityContextHolder.getContext().getAuthentication().getName(); @@ -198,6 +201,14 @@ public class ScheduleController { } ServiceResult serviceResult = taskScheduleService.activateSchedule(permissionResult.getResult()); + if(serviceResult.getResult() instanceof AdvancedTaskSchedule) { + try { + taskSchedulingService.stopStartReminderNotification((AdvancedTaskSchedule) serviceResult.getResult()); + } catch (SchedulerException e) { + throw new RuntimeException(e); + } + } + return ResponseEntity.ok(new ScheduleActivateResponse(serviceResult.getResult().getStartTime())); } diff --git a/backend/src/main/java/core/repositories/timemanager/AdvancedScheduleRepository.java b/backend/src/main/java/core/repositories/timemanager/AdvancedScheduleRepository.java new file mode 100644 index 0000000..7fbe22f --- /dev/null +++ b/backend/src/main/java/core/repositories/timemanager/AdvancedScheduleRepository.java @@ -0,0 +1,15 @@ +package core.repositories.timemanager; + +import core.entities.timemanager.AdvancedTaskSchedule; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import java.time.LocalDate; +import java.util.List; + +@Repository +public interface AdvancedScheduleRepository extends CrudRepository { + + +} diff --git a/backend/src/main/java/core/repositories/timemanager/ScheduleRepository.java b/backend/src/main/java/core/repositories/timemanager/ScheduleRepository.java index 4486293..df72a88 100644 --- a/backend/src/main/java/core/repositories/timemanager/ScheduleRepository.java +++ b/backend/src/main/java/core/repositories/timemanager/ScheduleRepository.java @@ -19,4 +19,5 @@ public interface ScheduleRepository extends CrudRepository getActiveScheduleOfUser(String username); + } diff --git a/backend/src/main/java/core/services/TaskScheduleService.java b/backend/src/main/java/core/services/TaskScheduleService.java index 63491a8..3ee3e70 100644 --- a/backend/src/main/java/core/services/TaskScheduleService.java +++ b/backend/src/main/java/core/services/TaskScheduleService.java @@ -12,6 +12,7 @@ import core.entities.timemanager.AdvancedTaskSchedule; import core.entities.timemanager.BasicTaskSchedule; import core.entities.timemanager.Task; import core.repositories.UserRepository; +import core.repositories.timemanager.AdvancedScheduleRepository; import core.repositories.timemanager.ScheduleRepository; import core.repositories.timemanager.TaskRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -32,6 +33,7 @@ public class TaskScheduleService { @Autowired private UserRepository userRepository; @Autowired private TaskRepository taskRepository; + @Autowired private AdvancedScheduleRepository advancedScheduleRepository; public List getAllSchedulesOfUser(String username) { return scheduleRepository.findAllByUsername(username); @@ -225,6 +227,18 @@ public class TaskScheduleService { return findScheduleByDate(allSchedules, date); } + public List findSchedulesByDate(LocalDate date) { + Iterable allSchedules = advancedScheduleRepository.findAll(); + List schedulesToday = new ArrayList<>(); + for(AdvancedTaskSchedule advancedTaskSchedule : allSchedules) { + if(advancedTaskSchedule.getScheduleStart().toLocalDate().equals(date)) { + schedulesToday.add(advancedTaskSchedule); + } + } + return schedulesToday; + + } + private List findScheduleByDate(List schedules, LocalDate date) { List filteredSchedules = new ArrayList<>(); for(AbstractSchedule schedule : schedules) { diff --git a/backend/src/main/java/core/services/ntfy/TaskSchedulingService.java b/backend/src/main/java/core/services/ntfy/TaskSchedulingService.java index 5067658..ca34cb9 100644 --- a/backend/src/main/java/core/services/ntfy/TaskSchedulingService.java +++ b/backend/src/main/java/core/services/ntfy/TaskSchedulingService.java @@ -1,18 +1,25 @@ package core.services.ntfy; -import core.NotTest; +import core.entities.timemanager.AbstractSchedule; +import core.entities.timemanager.AdvancedTaskSchedule; +import core.repositories.timemanager.ScheduleRepository; +import core.repositories.timemanager.TaskRepository; +import core.services.TaskScheduleService; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; +import java.util.List; @Service -@NotTest public class TaskSchedulingService { @Value("${ntfy.host}") @@ -24,19 +31,25 @@ public class TaskSchedulingService { @Value("${frontend.domain}") private String frontend_domain; - public void scheduleStartingTask(String taskName) throws SchedulerException { - Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); + @Autowired private TaskScheduleService taskScheduleService; + + private Scheduler scheduler; + + public void scheduleStartingTask(AdvancedTaskSchedule advancedTaskSchedule) throws SchedulerException { + scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); - JobDetail job = JobBuilder.newJob(NtfyTaskStartNotification.class).build(); - job.getJobDataMap().put("task", taskName); + JobDetail job = JobBuilder.newJob(NtfyTaskStartNotification.class) + .withIdentity(String.valueOf(advancedTaskSchedule.getScheduleID())) + .build(); + job.getJobDataMap().put("task", advancedTaskSchedule.getTask().getTaskName()); job.getJobDataMap().put("ntfy_host", ntfy_host); job.getJobDataMap().put("ntfy_topic", ntfy_topic); job.getJobDataMap().put("frontend_domain", frontend_domain); - Trigger immediatly = TriggerBuilder.newTrigger().startNow().build(); + Trigger trigger = TriggerBuilder.newTrigger().startAt(calculateDelayInMillis(advancedTaskSchedule.getScheduleStart())).build(); - scheduler.scheduleJob(job, immediatly); + scheduler.scheduleJob(job, trigger); } public static void scheduleTask() throws SchedulerException { @@ -64,4 +77,16 @@ public class TaskSchedulingService { private static Date calculateDelayInMillis(LocalDateTime executionTime) { return Date.from(executionTime.atZone(ZoneId.systemDefault()).toInstant()); } + + @Scheduled(cron = "0 0 0 * * *") + public void scheduleStartReminders() throws SchedulerException { + List advancedTaskSchedules = taskScheduleService.findSchedulesByDate(LocalDate.now()); + for(AdvancedTaskSchedule advancedTaskSchedule : advancedTaskSchedules) { + scheduleStartingTask(advancedTaskSchedule); + } + } + + public void stopStartReminderNotification(AdvancedTaskSchedule schedule) throws SchedulerException { + scheduler.deleteJob(JobKey.jobKey(String.valueOf(schedule.getScheduleID()))); + } }