issue-86 #102
@ -3,25 +3,6 @@ run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
 | 
				
			|||||||
on: [push]
 | 
					on: [push]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  test:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    steps:
 | 
					 | 
				
			||||||
    - uses: actions/checkout@v3
 | 
					 | 
				
			||||||
    - name: Set up JDK 17
 | 
					 | 
				
			||||||
      uses: actions/setup-java@v3
 | 
					 | 
				
			||||||
      with:
 | 
					 | 
				
			||||||
        java-version: '17'
 | 
					 | 
				
			||||||
        distribution: 'temurin'
 | 
					 | 
				
			||||||
        cache: maven
 | 
					 | 
				
			||||||
    - name: Set up Maven
 | 
					 | 
				
			||||||
      uses: stCarolas/setup-maven@v4.5
 | 
					 | 
				
			||||||
      with:
 | 
					 | 
				
			||||||
        maven-version: 3.8.2
 | 
					 | 
				
			||||||
    - name: Build with Maven
 | 
					 | 
				
			||||||
      run: mvn -B package --file backend/pom.xml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  build-and-push-frontend:
 | 
					  build-and-push-frontend:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,11 @@
 | 
				
			|||||||
			<groupId>org.springframework.boot</groupId>
 | 
								<groupId>org.springframework.boot</groupId>
 | 
				
			||||||
			<artifactId>spring-boot-starter-data-jpa</artifactId>
 | 
								<artifactId>spring-boot-starter-data-jpa</artifactId>
 | 
				
			||||||
		</dependency>
 | 
							</dependency>
 | 
				
			||||||
 | 
							<dependency>
 | 
				
			||||||
 | 
								<groupId>org.quartz-scheduler</groupId>
 | 
				
			||||||
 | 
								<artifactId>quartz</artifactId>
 | 
				
			||||||
 | 
								<version>2.3.2</version>
 | 
				
			||||||
 | 
							</dependency>
 | 
				
			||||||
		<dependency>
 | 
							<dependency>
 | 
				
			||||||
			<groupId>org.springframework.boot</groupId>
 | 
								<groupId>org.springframework.boot</groupId>
 | 
				
			||||||
			<artifactId>spring-boot-starter-security</artifactId>
 | 
								<artifactId>spring-boot-starter-security</artifactId>
 | 
				
			||||||
 | 
				
			|||||||
@ -2,15 +2,25 @@ package core;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import core.entities.RoleEntity;
 | 
					import core.entities.RoleEntity;
 | 
				
			||||||
import core.entities.UserRole;
 | 
					import core.entities.UserRole;
 | 
				
			||||||
 | 
					import core.entities.timemanager.AdvancedTaskSchedule;
 | 
				
			||||||
import core.repositories.RoleRepository;
 | 
					import core.repositories.RoleRepository;
 | 
				
			||||||
import core.repositories.UserRepository;
 | 
					import core.repositories.UserRepository;
 | 
				
			||||||
import core.services.PropertyService;
 | 
					import core.services.PropertyService;
 | 
				
			||||||
 | 
					import core.services.TaskScheduleService;
 | 
				
			||||||
 | 
					import core.services.ntfy.TaskSchedulingService;
 | 
				
			||||||
import org.springframework.boot.CommandLineRunner;
 | 
					import org.springframework.boot.CommandLineRunner;
 | 
				
			||||||
import org.springframework.boot.SpringApplication;
 | 
					import org.springframework.boot.SpringApplication;
 | 
				
			||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
 | 
					import org.springframework.boot.autoconfigure.SpringBootApplication;
 | 
				
			||||||
import org.springframework.context.annotation.Bean;
 | 
					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
 | 
					@SpringBootApplication
 | 
				
			||||||
 | 
					@EnableScheduling
 | 
				
			||||||
public class DemoApplication{
 | 
					public class DemoApplication{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public static void main(String[] args) {
 | 
						public static void main(String[] args) {
 | 
				
			||||||
@ -18,19 +28,12 @@ public class DemoApplication{
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*@Bean
 | 
						@Bean
 | 
				
			||||||
	public CommandLineRunner init(RoleRepository roleRepository, UserRepository userRepository, PropertyService propertyService) {
 | 
						public CommandLineRunner init(TaskSchedulingService taskSchedulingService) {
 | 
				
			||||||
		return args -> {
 | 
							return args -> {
 | 
				
			||||||
			for (UserRole userRole :  UserRole.values()) {
 | 
								taskSchedulingService.scheduleStartReminders();
 | 
				
			||||||
				if(!roleRepository.existsByName(userRole)) {
 | 
					 | 
				
			||||||
					roleRepository.save(new RoleEntity(userRole));
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			propertyService.init();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			FirstUserObserver observer = new FirstUserObserver(userRepository);
 | 
					 | 
				
			||||||
			observer.start();
 | 
					 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	}*/
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					package core.api.controller;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import core.api.models.auth.SimpleStatusResponse;
 | 
				
			||||||
 | 
					import core.api.models.users.NtfyInformation;
 | 
				
			||||||
 | 
					import core.entities.User;
 | 
				
			||||||
 | 
					import core.repositories.UserRepository;
 | 
				
			||||||
 | 
					import core.services.UserService;
 | 
				
			||||||
 | 
					import core.services.ntfy.TaskSchedulingService;
 | 
				
			||||||
 | 
					import org.quartz.SchedulerException;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Value;
 | 
				
			||||||
 | 
					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.Optional;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@CrossOrigin(origins = "*", maxAge = 3600)
 | 
				
			||||||
 | 
					@RestController
 | 
				
			||||||
 | 
					@RequestMapping("/api")
 | 
				
			||||||
 | 
					public class NtfyController {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Autowired private UserRepository userRepository;
 | 
				
			||||||
 | 
					    @Autowired private UserService userService;
 | 
				
			||||||
 | 
					    @Autowired private TaskSchedulingService taskSchedulingService;
 | 
				
			||||||
 | 
					    @GetMapping("/ntfy")
 | 
				
			||||||
 | 
					    public ResponseEntity<?> getNtfyInformation() {
 | 
				
			||||||
 | 
					        String username = SecurityContextHolder.getContext().getAuthentication().getName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Optional<User> userOptional = userRepository.findByUsername(username);
 | 
				
			||||||
 | 
					        if(userOptional.isPresent()) {
 | 
				
			||||||
 | 
					            return ResponseEntity.ok(new NtfyInformation(userOptional.get()));
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return ResponseEntity.status(404).body(new SimpleStatusResponse("failed"));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @PostMapping("/ntfy")
 | 
				
			||||||
 | 
					    public ResponseEntity<?> editNtfyInformation(@Valid @RequestBody NtfyInformation ntfyInformation) {
 | 
				
			||||||
 | 
					        String username = SecurityContextHolder.getContext().getAuthentication().getName();
 | 
				
			||||||
 | 
					        Optional<User> user = userRepository.findByUsername(username);
 | 
				
			||||||
 | 
					        if(user.isPresent()) {
 | 
				
			||||||
 | 
					            userService.editNtfyInformation(user.get(), ntfyInformation);
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                taskSchedulingService.scheduleStartReminders();
 | 
				
			||||||
 | 
					            } catch (SchedulerException e) {
 | 
				
			||||||
 | 
					                throw new RuntimeException(e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return ResponseEntity.ok(new SimpleStatusResponse("success"));
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return ResponseEntity.status(404).body(new SimpleStatusResponse("failed"));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -9,6 +9,8 @@ import core.entities.timemanager.AdvancedTaskSchedule;
 | 
				
			|||||||
import core.entities.timemanager.BasicTaskSchedule;
 | 
					import core.entities.timemanager.BasicTaskSchedule;
 | 
				
			||||||
import core.entities.timemanager.Task;
 | 
					import core.entities.timemanager.Task;
 | 
				
			||||||
import core.services.*;
 | 
					import core.services.*;
 | 
				
			||||||
 | 
					import core.services.ntfy.TaskSchedulingService;
 | 
				
			||||||
 | 
					import org.quartz.SchedulerException;
 | 
				
			||||||
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;
 | 
				
			||||||
@ -27,6 +29,7 @@ public class ScheduleController {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Autowired private TaskScheduleService taskScheduleService;
 | 
					    @Autowired private TaskScheduleService taskScheduleService;
 | 
				
			||||||
    @Autowired private TaskService taskService;
 | 
					    @Autowired private TaskService taskService;
 | 
				
			||||||
 | 
					    @Autowired private TaskSchedulingService taskSchedulingService;
 | 
				
			||||||
    @GetMapping("/schedules")
 | 
					    @GetMapping("/schedules")
 | 
				
			||||||
    public ResponseEntity<?> loadAllSchedulesOfUser() {
 | 
					    public ResponseEntity<?> loadAllSchedulesOfUser() {
 | 
				
			||||||
        String username = SecurityContextHolder.getContext().getAuthentication().getName();
 | 
					        String username = SecurityContextHolder.getContext().getAuthentication().getName();
 | 
				
			||||||
@ -172,6 +175,7 @@ public class ScheduleController {
 | 
				
			|||||||
        if(scheduleResult.getExitCode() == ServiceExitCode.ENTITY_ALREADY_EXIST) {
 | 
					        if(scheduleResult.getExitCode() == ServiceExitCode.ENTITY_ALREADY_EXIST) {
 | 
				
			||||||
            return ResponseEntity.status(409).body(new SimpleStatusResponse("failed"));
 | 
					            return ResponseEntity.status(409).body(new SimpleStatusResponse("failed"));
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
 | 
					            taskSchedulingService.sendRunningTaskNotification(scheduleResult.getResult());
 | 
				
			||||||
            return ResponseEntity.ok(scheduleResult.getResult().toScheduleInfo());
 | 
					            return ResponseEntity.ok(scheduleResult.getResult().toScheduleInfo());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -198,6 +202,15 @@ public class ScheduleController {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ServiceResult<AbstractSchedule> serviceResult = taskScheduleService.activateSchedule(permissionResult.getResult());
 | 
					        ServiceResult<AbstractSchedule> serviceResult = taskScheduleService.activateSchedule(permissionResult.getResult());
 | 
				
			||||||
 | 
					        if(serviceResult.getResult() instanceof AdvancedTaskSchedule) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                taskSchedulingService.stopStartReminderNotification((AdvancedTaskSchedule) serviceResult.getResult());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            } catch (SchedulerException e) {
 | 
				
			||||||
 | 
					                throw new RuntimeException(e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        taskSchedulingService.sendRunningTaskNotification(serviceResult.getResult());
 | 
				
			||||||
        return ResponseEntity.ok(new ScheduleActivateResponse(serviceResult.getResult().getStartTime()));
 | 
					        return ResponseEntity.ok(new ScheduleActivateResponse(serviceResult.getResult().getStartTime()));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					package core.api.models.users;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import core.entities.User;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class NtfyInformation {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String ntfy_host;
 | 
				
			||||||
 | 
					    private String ntfy_topic;
 | 
				
			||||||
 | 
					    private String ntfy_user;
 | 
				
			||||||
 | 
					    private String ntfy_token;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public NtfyInformation(User user) {
 | 
				
			||||||
 | 
					        this.ntfy_host = user.getNtfy_host();
 | 
				
			||||||
 | 
					        this.ntfy_topic = user.getNtfy_topic();
 | 
				
			||||||
 | 
					        this.ntfy_user = "****";
 | 
				
			||||||
 | 
					        this.ntfy_token =  "****";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public NtfyInformation() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getNtfy_host() {
 | 
				
			||||||
 | 
					        return ntfy_host;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void setNtfy_host(String ntfy_host) {
 | 
				
			||||||
 | 
					        this.ntfy_host = ntfy_host;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getNtfy_topic() {
 | 
				
			||||||
 | 
					        return ntfy_topic;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void setNtfy_topic(String ntfy_topic) {
 | 
				
			||||||
 | 
					        this.ntfy_topic = ntfy_topic;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getNtfy_user() {
 | 
				
			||||||
 | 
					        return ntfy_user;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void setNtfy_user(String ntfy_user) {
 | 
				
			||||||
 | 
					        this.ntfy_user = ntfy_user;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getNtfy_token() {
 | 
				
			||||||
 | 
					        return ntfy_token;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void setNtfy_token(String ntfy_token) {
 | 
				
			||||||
 | 
					        this.ntfy_token = ntfy_token;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -42,6 +42,11 @@ public class User {
 | 
				
			|||||||
                inverseJoinColumns = @JoinColumn(name = "role_id"))
 | 
					                inverseJoinColumns = @JoinColumn(name = "role_id"))
 | 
				
			||||||
    private Set<RoleEntity> roles = new HashSet<>();
 | 
					    private Set<RoleEntity> roles = new HashSet<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String ntfy_host;
 | 
				
			||||||
 | 
					    private String ntfy_topic;
 | 
				
			||||||
 | 
					    private String ntfy_username;
 | 
				
			||||||
 | 
					    private String ntfy_token;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public User() {
 | 
					    public User() {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -98,6 +103,38 @@ public class User {
 | 
				
			|||||||
        this.roles = roles;
 | 
					        this.roles = roles;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getNtfy_host() {
 | 
				
			||||||
 | 
					        return ntfy_host;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void setNtfy_host(String ntfy_host) {
 | 
				
			||||||
 | 
					        this.ntfy_host = ntfy_host;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getNtfy_topic() {
 | 
				
			||||||
 | 
					        return ntfy_topic;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void setNtfy_topic(String ntfy_topic) {
 | 
				
			||||||
 | 
					        this.ntfy_topic = ntfy_topic;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getNtfy_username() {
 | 
				
			||||||
 | 
					        return ntfy_username;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void setNtfy_username(String ntfy_username) {
 | 
				
			||||||
 | 
					        this.ntfy_username = ntfy_username;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String getNtfy_token() {
 | 
				
			||||||
 | 
					        return ntfy_token;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void setNtfy_token(String ntfy_token) {
 | 
				
			||||||
 | 
					        this.ntfy_token = ntfy_token;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public boolean equals(Object o) {
 | 
					    public boolean equals(Object o) {
 | 
				
			||||||
        if (this == o) return true;
 | 
					        if (this == o) return true;
 | 
				
			||||||
 | 
				
			|||||||
@ -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<AdvancedTaskSchedule, Long> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -19,4 +19,5 @@ public interface ScheduleRepository extends CrudRepository<AbstractSchedule, Lon
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Query(value = "SELECT s FROM AbstractSchedule s WHERE s.task.taskgroup.user.username = ?1 AND s.startTime is NOT NULL and s.stopTime is NULL")
 | 
					    @Query(value = "SELECT s FROM AbstractSchedule s WHERE s.task.taskgroup.user.username = ?1 AND s.startTime is NOT NULL and s.stopTime is NULL")
 | 
				
			||||||
    Optional<AbstractSchedule> getActiveScheduleOfUser(String username);
 | 
					    Optional<AbstractSchedule> getActiveScheduleOfUser(String username);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,7 @@ import core.entities.timemanager.AdvancedTaskSchedule;
 | 
				
			|||||||
import core.entities.timemanager.BasicTaskSchedule;
 | 
					import core.entities.timemanager.BasicTaskSchedule;
 | 
				
			||||||
import core.entities.timemanager.Task;
 | 
					import core.entities.timemanager.Task;
 | 
				
			||||||
import core.repositories.UserRepository;
 | 
					import core.repositories.UserRepository;
 | 
				
			||||||
 | 
					import core.repositories.timemanager.AdvancedScheduleRepository;
 | 
				
			||||||
import core.repositories.timemanager.ScheduleRepository;
 | 
					import core.repositories.timemanager.ScheduleRepository;
 | 
				
			||||||
import core.repositories.timemanager.TaskRepository;
 | 
					import core.repositories.timemanager.TaskRepository;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
@ -32,6 +33,7 @@ public class TaskScheduleService {
 | 
				
			|||||||
    @Autowired private UserRepository userRepository;
 | 
					    @Autowired private UserRepository userRepository;
 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private TaskRepository taskRepository;
 | 
					    private TaskRepository taskRepository;
 | 
				
			||||||
 | 
					    @Autowired private AdvancedScheduleRepository advancedScheduleRepository;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public List<AbstractSchedule> getAllSchedulesOfUser(String username) {
 | 
					    public List<AbstractSchedule> getAllSchedulesOfUser(String username) {
 | 
				
			||||||
        return scheduleRepository.findAllByUsername(username);
 | 
					        return scheduleRepository.findAllByUsername(username);
 | 
				
			||||||
@ -225,6 +227,19 @@ public class TaskScheduleService {
 | 
				
			|||||||
        return findScheduleByDate(allSchedules, date);
 | 
					        return findScheduleByDate(allSchedules, date);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public List<AdvancedTaskSchedule> findSchedulesByDate(LocalDate date) {
 | 
				
			||||||
 | 
					        Iterable<AdvancedTaskSchedule> allSchedules = advancedScheduleRepository.findAll();
 | 
				
			||||||
 | 
					        List<AdvancedTaskSchedule> schedulesToday = new ArrayList<>();
 | 
				
			||||||
 | 
					        for(AdvancedTaskSchedule advancedTaskSchedule : allSchedules) {
 | 
				
			||||||
 | 
					            if(advancedTaskSchedule.getScheduleStart().toLocalDate().equals(date) && advancedTaskSchedule.getStartTime() == null &&
 | 
				
			||||||
 | 
					                    advancedTaskSchedule.getScheduleStart().isBefore(LocalDateTime.now())) {
 | 
				
			||||||
 | 
					                schedulesToday.add(advancedTaskSchedule);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return schedulesToday;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private List<AbstractSchedule> findScheduleByDate(List<AbstractSchedule> schedules, LocalDate date) {
 | 
					    private List<AbstractSchedule> findScheduleByDate(List<AbstractSchedule> schedules, LocalDate date) {
 | 
				
			||||||
        List<AbstractSchedule> filteredSchedules = new ArrayList<>();
 | 
					        List<AbstractSchedule> filteredSchedules = new ArrayList<>();
 | 
				
			||||||
        for(AbstractSchedule schedule : schedules) {
 | 
					        for(AbstractSchedule schedule : schedules) {
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,7 @@ package core.services;
 | 
				
			|||||||
import core.api.models.account.AccountDeleteRequest;
 | 
					import core.api.models.account.AccountDeleteRequest;
 | 
				
			||||||
import core.api.models.account.EmailChangeRequest;
 | 
					import core.api.models.account.EmailChangeRequest;
 | 
				
			||||||
import core.api.models.account.PasswordChangeRequest;
 | 
					import core.api.models.account.PasswordChangeRequest;
 | 
				
			||||||
 | 
					import core.api.models.users.NtfyInformation;
 | 
				
			||||||
import core.api.models.users.UserAddInfo;
 | 
					import core.api.models.users.UserAddInfo;
 | 
				
			||||||
import core.api.models.users.UserInfo;
 | 
					import core.api.models.users.UserInfo;
 | 
				
			||||||
import core.api.models.users.UserUpdateInfo;
 | 
					import core.api.models.users.UserUpdateInfo;
 | 
				
			||||||
@ -152,4 +153,13 @@ public class UserService {
 | 
				
			|||||||
        userRepository.deleteByUsername(username);
 | 
					        userRepository.deleteByUsername(username);
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void editNtfyInformation(User user, NtfyInformation ntfyInformation) {
 | 
				
			||||||
 | 
					        user.setNtfy_host(ntfyInformation.getNtfy_host());
 | 
				
			||||||
 | 
					        user.setNtfy_topic(ntfyInformation.getNtfy_topic());
 | 
				
			||||||
 | 
					        user.setNtfy_username(ntfyInformation.getNtfy_user());
 | 
				
			||||||
 | 
					        user.setNtfy_token(ntfyInformation.getNtfy_token());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        userRepository.save(user);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										29
									
								
								backend/src/main/java/core/services/ntfy/NtfyTask.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								backend/src/main/java/core/services/ntfy/NtfyTask.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					package core.services.ntfy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.quartz.Job;
 | 
				
			||||||
 | 
					import org.quartz.JobExecutionContext;
 | 
				
			||||||
 | 
					import org.quartz.JobExecutionException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.net.*;
 | 
				
			||||||
 | 
					import java.net.http.HttpClient;
 | 
				
			||||||
 | 
					import java.net.http.HttpRequest;
 | 
				
			||||||
 | 
					import java.net.http.HttpResponse;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class NtfyTask implements Job {
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
 | 
				
			||||||
 | 
					        HttpClient httpClient = HttpClient.newHttpClient();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            HttpRequest request = HttpRequest.newBuilder()
 | 
				
			||||||
 | 
					                    .uri(new URI("http://localhost:4280/Test"))
 | 
				
			||||||
 | 
					                    .POST(HttpRequest.BodyPublishers.ofString(jobExecutionContext.getMergedJobDataMap().getString("data")))
 | 
				
			||||||
 | 
					                    .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
 | 
					        } catch (URISyntaxException e) {
 | 
				
			||||||
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					package core.services.ntfy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.quartz.Job;
 | 
				
			||||||
 | 
					import org.quartz.JobExecutionContext;
 | 
				
			||||||
 | 
					import org.quartz.JobExecutionException;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.net.URI;
 | 
				
			||||||
 | 
					import java.net.URISyntaxException;
 | 
				
			||||||
 | 
					import java.net.http.HttpClient;
 | 
				
			||||||
 | 
					import java.net.http.HttpRequest;
 | 
				
			||||||
 | 
					import java.net.http.HttpResponse;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class NtfyTaskStartNotification implements Job {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
 | 
				
			||||||
 | 
					        HttpClient httpClient = HttpClient.newHttpClient();
 | 
				
			||||||
 | 
					        String msg = "Task " + jobExecutionContext.getMergedJobDataMap().getString("task") + " should have been started by now!";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            HttpRequest request = HttpRequest.newBuilder()
 | 
				
			||||||
 | 
					                    .uri(new URI(jobExecutionContext.getMergedJobDataMap().getString("ntfy_host") + "/Test"))
 | 
				
			||||||
 | 
					                    .POST(HttpRequest.BodyPublishers.ofString(msg))
 | 
				
			||||||
 | 
					                    .header("Tags", "warning")
 | 
				
			||||||
 | 
					                    .header("Title", "Task Starting Reminder")
 | 
				
			||||||
 | 
					                    .header("Actions", "view, Open TimeScheduler, "+jobExecutionContext.getMergedJobDataMap().getString("frontend_domain")+", clear=true")
 | 
				
			||||||
 | 
					                    .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
 | 
					        } catch (URISyntaxException e) {
 | 
				
			||||||
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,90 @@
 | 
				
			|||||||
 | 
					package core.services.ntfy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import core.entities.User;
 | 
				
			||||||
 | 
					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.net.URI;
 | 
				
			||||||
 | 
					import java.net.URISyntaxException;
 | 
				
			||||||
 | 
					import java.net.http.HttpClient;
 | 
				
			||||||
 | 
					import java.net.http.HttpRequest;
 | 
				
			||||||
 | 
					import java.net.http.HttpResponse;
 | 
				
			||||||
 | 
					import java.time.LocalDate;
 | 
				
			||||||
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
 | 
					import java.time.ZoneId;
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Service
 | 
				
			||||||
 | 
					public class TaskSchedulingService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Value("${frontend.domain}")
 | 
				
			||||||
 | 
					    private String frontend_domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @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)
 | 
				
			||||||
 | 
					                .withIdentity(String.valueOf(advancedTaskSchedule.getScheduleID()))
 | 
				
			||||||
 | 
					                .build();
 | 
				
			||||||
 | 
					        job.getJobDataMap().put("task", advancedTaskSchedule.getTask().getTaskName());
 | 
				
			||||||
 | 
					        job.getJobDataMap().put("ntfy_host", advancedTaskSchedule.getTask().getTaskgroup().getUser().getNtfy_host());
 | 
				
			||||||
 | 
					        job.getJobDataMap().put("ntfy_topic", advancedTaskSchedule.getTask().getTaskgroup().getUser().getNtfy_topic());
 | 
				
			||||||
 | 
					        job.getJobDataMap().put("frontend_domain", frontend_domain);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Trigger trigger = TriggerBuilder.newTrigger().startAt(calculateDelayInMillis(advancedTaskSchedule.getScheduleStart())).build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        scheduler.scheduleJob(job, trigger);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void sendRunningTaskNotification(AbstractSchedule abstractSchedule) {
 | 
				
			||||||
 | 
					        HttpClient httpClient = HttpClient.newHttpClient();
 | 
				
			||||||
 | 
					        User user = abstractSchedule.getTask().getTaskgroup().getUser();
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            HttpRequest request = HttpRequest.newBuilder()
 | 
				
			||||||
 | 
					                    .uri(new URI(user.getNtfy_host()+ "/" + user.getNtfy_topic()))
 | 
				
			||||||
 | 
					                    .POST(HttpRequest.BodyPublishers.ofString("Running Task " + abstractSchedule.getTask().getTaskName()))
 | 
				
			||||||
 | 
					                    .header("Tags", "heavy_check_mark")
 | 
				
			||||||
 | 
					                    .header("Title", "Task Running")
 | 
				
			||||||
 | 
					                    .header("Actions", "view, Open TimeScheduler, "+frontend_domain+", clear=true")
 | 
				
			||||||
 | 
					                    .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
 | 
					        } catch (URISyntaxException e) {
 | 
				
			||||||
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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<AdvancedTaskSchedule> advancedTaskSchedules = taskScheduleService.findSchedulesByDate(LocalDate.now());
 | 
				
			||||||
 | 
					        for(AdvancedTaskSchedule advancedTaskSchedule : advancedTaskSchedules) {
 | 
				
			||||||
 | 
					            if(advancedTaskSchedule.getTask().getTaskgroup().getUser().getNtfy_host() != null) {
 | 
				
			||||||
 | 
					                scheduleStartingTask(advancedTaskSchedule);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void stopStartReminderNotification(AdvancedTaskSchedule schedule) throws SchedulerException {
 | 
				
			||||||
 | 
					        scheduler.deleteJob(JobKey.jobKey(String.valueOf(schedule.getScheduleID())));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -27,6 +27,7 @@ spring.jpa.open-in-view=false
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Spring Data Rest Setup
 | 
					# Spring Data Rest Setup
 | 
				
			||||||
spring.data.rest.base-path=/api
 | 
					spring.data.rest.base-path=/api
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -43,3 +44,7 @@ demo.webapp.jwtSecret=demoWebappSecretKey
 | 
				
			|||||||
demo.webapp.jwtExpirationMS=86400000
 | 
					demo.webapp.jwtExpirationMS=86400000
 | 
				
			||||||
spring.jackson.time-zone=UTC
 | 
					spring.jackson.time-zone=UTC
 | 
				
			||||||
server.servlet.session.cookie.samesite=None
 | 
					server.servlet.session.cookie.samesite=None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ntfy.host=http://localhost:4280
 | 
				
			||||||
 | 
					ntfy.topic=Test
 | 
				
			||||||
 | 
					frontend.domain=http://localhost:4200
 | 
				
			||||||
@ -1,13 +0,0 @@
 | 
				
			|||||||
package core;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.junit.jupiter.api.Test;
 | 
					 | 
				
			||||||
import org.springframework.boot.test.context.SpringBootTest;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*@SpringBootTest*/
 | 
					 | 
				
			||||||
class DemoApplicationTests {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*@Test
 | 
					 | 
				
			||||||
	void contextLoads() {
 | 
					 | 
				
			||||||
	}*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,57 +0,0 @@
 | 
				
			|||||||
package core.schedules;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import core.entities.User;
 | 
					 | 
				
			||||||
import core.entities.timemanager.AbstractSchedule;
 | 
					 | 
				
			||||||
import core.repositories.timemanager.ScheduleRepository;
 | 
					 | 
				
			||||||
import core.services.ServiceResult;
 | 
					 | 
				
			||||||
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 java.util.Optional;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
 | 
					 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@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(5, scheduleRepository.findAllByUsername(referenceUser_1.getUsername()).size());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void getActiveScheduleOfUser() {
 | 
					 | 
				
			||||||
        User referenceUser_1 = entityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        User referenceUser_2 = entityManager.find(User.class, 2L);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Optional<AbstractSchedule> result_1 = scheduleRepository.getActiveScheduleOfUser(referenceUser_2.getUsername());
 | 
					 | 
				
			||||||
        assertTrue(result_1.isEmpty());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Optional<AbstractSchedule> result_2 = scheduleRepository.getActiveScheduleOfUser(referenceUser_1.getUsername());
 | 
					 | 
				
			||||||
        assertTrue(result_2.isPresent());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,321 +0,0 @@
 | 
				
			|||||||
package core.schedules;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.AdvancedScheduleFieldInfo;
 | 
					 | 
				
			||||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.AdvancedScheduleInfo;
 | 
					 | 
				
			||||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.BasicScheduleFieldInfo;
 | 
					 | 
				
			||||||
import core.api.models.timemanager.taskSchedule.ForgottenScheduleInfo;
 | 
					 | 
				
			||||||
import core.entities.timemanager.AbstractSchedule;
 | 
					 | 
				
			||||||
import core.entities.timemanager.AdvancedTaskSchedule;
 | 
					 | 
				
			||||||
import core.entities.timemanager.BasicTaskSchedule;
 | 
					 | 
				
			||||||
import core.entities.timemanager.Task;
 | 
					 | 
				
			||||||
import core.services.ServiceExitCode;
 | 
					 | 
				
			||||||
import core.services.ServiceResult;
 | 
					 | 
				
			||||||
import core.services.TaskScheduleService;
 | 
					 | 
				
			||||||
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.time.LocalDate;
 | 
					 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 | 
					 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.*;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@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(5, result_1.size());
 | 
					 | 
				
			||||||
        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, 3L)));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @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();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void editBasicSchedule() {
 | 
					 | 
				
			||||||
        //Situation 1: Reschedule finished task
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_1 = taskScheduleService.editBasicSchedule(entityManager.find(BasicTaskSchedule.class, 2L), new BasicScheduleFieldInfo(LocalDate.now()));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_1.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: Reschedule unfinished task with invalid reschedule date
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_2 = taskScheduleService.editBasicSchedule(entityManager.find(BasicTaskSchedule.class, 1L), new BasicScheduleFieldInfo(LocalDate.of(2011, 3, 4)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_2.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: Reschedule unfinished task with valid reschedule date
 | 
					 | 
				
			||||||
        LocalDate oldDate = entityManager.find(BasicTaskSchedule.class, 1L).getScheduleDate();
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_3 = taskScheduleService.editBasicSchedule(entityManager.find(BasicTaskSchedule.class, 1L), new BasicScheduleFieldInfo(LocalDate.now()));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_3.getExitCode());
 | 
					 | 
				
			||||||
        assertNotEquals(((BasicTaskSchedule) result_3.getResult()).getScheduleDate(), oldDate);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 4: Reschedule already running schedule
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_4 = taskScheduleService.editBasicSchedule(entityManager.find(BasicTaskSchedule.class, 4L),
 | 
					 | 
				
			||||||
                new BasicScheduleFieldInfo(LocalDate.now()));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_4.getExitCode());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void deleteSchedule() {
 | 
					 | 
				
			||||||
        for(long i=1; i<=2; i++) {
 | 
					 | 
				
			||||||
            taskScheduleService.deleteSchedule(entityManager.find(BasicTaskSchedule.class, i));
 | 
					 | 
				
			||||||
            assertThat(entityManager.find(BasicTaskSchedule.class, i)).isNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void getFilteredScheduledOfUser() {
 | 
					 | 
				
			||||||
        //Invalid user
 | 
					 | 
				
			||||||
        assertEquals(0, taskScheduleService.getFilteredScheduledOfUser(LocalDate.now(), false, "Quatsch").size());
 | 
					 | 
				
			||||||
        assertEquals(0, taskScheduleService.getFilteredScheduledOfUser(LocalDate.now(), true, "Quatsch").size());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //User with no tasks/schedules
 | 
					 | 
				
			||||||
        assertEquals(0, taskScheduleService.getFilteredScheduledOfUser(LocalDate.now(), false, username2).size());
 | 
					 | 
				
			||||||
        assertEquals(0, taskScheduleService.getFilteredScheduledOfUser(LocalDate.now(), true, username2).size());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //user with tasks and schedules
 | 
					 | 
				
			||||||
        List<AbstractSchedule> result_1 = taskScheduleService.getFilteredScheduledOfUser(LocalDate.of(2024,11,11), false, username);
 | 
					 | 
				
			||||||
        assertEquals(3, result_1.size());
 | 
					 | 
				
			||||||
        assertTrue(result_1.contains(entityManager.find(BasicTaskSchedule.class, 3L)));
 | 
					 | 
				
			||||||
        assertTrue(result_1.contains(entityManager.find(BasicTaskSchedule.class, 4L)));
 | 
					 | 
				
			||||||
        assertTrue(result_1.contains(entityManager.find(BasicTaskSchedule.class, 5L)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        List<AbstractSchedule> result_2 = taskScheduleService.getFilteredScheduledOfUser(LocalDate.of(2024,11,11), true, username);
 | 
					 | 
				
			||||||
        assertEquals(1, result_2.size());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void scheduleNow() {
 | 
					 | 
				
			||||||
        //Situation 1: Task has already an active schedule
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_1 = taskScheduleService.scheduleNow(entityManager.find(Task.class, 3L));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.ENTITY_ALREADY_EXIST, result_1.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: Task is already finished
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_2 = taskScheduleService.scheduleNow(entityManager.find(Task.class, 2L));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_2.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: Task can be scheduled and started
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_3 = taskScheduleService.scheduleNow(entityManager.find(Task.class, 5L));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_3.getExitCode());
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(BasicTaskSchedule.class, result_3.getResult().getScheduleID())).isNotNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 4: Running Advanced Schedule
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_4 = taskScheduleService.scheduleNow(entityManager.find(Task.class, 17L));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.ENTITY_ALREADY_EXIST, result_4.getExitCode());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void activateSchedule() {
 | 
					 | 
				
			||||||
        //Activate already running schedule
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_1 = taskScheduleService.activateSchedule(entityManager.find(BasicTaskSchedule.class, 4L));
 | 
					 | 
				
			||||||
        assertNotNull(result_1.getResult().getStartTime());
 | 
					 | 
				
			||||||
        assertNull(result_1.getResult().getStopTime());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        entityManager.remove(entityManager.find(BasicTaskSchedule.class, 4L));
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(BasicTaskSchedule.class, 4L)).isNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Activate not running schedule
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_2 = taskScheduleService.activateSchedule(entityManager.find(BasicTaskSchedule.class, 5L));
 | 
					 | 
				
			||||||
        assertNotNull(result_2.getResult().getStartTime());
 | 
					 | 
				
			||||||
        assertNull(result_2.getResult().getStopTime());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void stopSchedule() {
 | 
					 | 
				
			||||||
        //Stop schedule that is not running 4
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_1 = taskScheduleService.stopSchedule(entityManager.find(BasicTaskSchedule.class, 5L), false);
 | 
					 | 
				
			||||||
        assertNull(result_1.getResult().getStartTime());
 | 
					 | 
				
			||||||
        assertNull(result_1.getResult().getStopTime());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Stop schedule (without finishing)
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_2 = taskScheduleService.stopSchedule(entityManager.find(BasicTaskSchedule.class, 4L), false);
 | 
					 | 
				
			||||||
        assertNotNull(result_2.getResult().getStartTime());
 | 
					 | 
				
			||||||
        assertNotNull(result_2.getResult().getStopTime());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Stop schedule with finishing
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_3 = taskScheduleService.stopSchedule(entityManager.find(BasicTaskSchedule.class, 7L), true);
 | 
					 | 
				
			||||||
        assertNotNull(result_3.getResult().getStartTime());
 | 
					 | 
				
			||||||
        assertNotNull(result_3.getResult().getStopTime());
 | 
					 | 
				
			||||||
        assertTrue(result_3.getResult().getTask().isFinished());
 | 
					 | 
				
			||||||
        assertFalse(result_3.getResult().isStartable());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void registerForgottenSchedule() {
 | 
					 | 
				
			||||||
        //Register task schedule for task that is already finished
 | 
					 | 
				
			||||||
        LocalDateTime startTime = LocalDateTime.now().minusMinutes(10L);
 | 
					 | 
				
			||||||
        LocalDateTime finishTime = LocalDateTime.now();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_1 = taskScheduleService.registerForgottenSchedule(entityManager.find(Task.class, 2L), new ForgottenScheduleInfo(startTime, finishTime));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_1.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_2 = taskScheduleService.registerForgottenSchedule(entityManager.find(Task.class, 5L), new ForgottenScheduleInfo(startTime, finishTime));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_2.getExitCode());
 | 
					 | 
				
			||||||
        assertEquals(startTime, result_2.getResult().getStartTime());
 | 
					 | 
				
			||||||
        assertEquals(finishTime, result_2.getResult().getStopTime());
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(BasicTaskSchedule.class, result_2.getResult().getScheduleID())).isNotNull();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void getAllMissedSchedulesOfUser() {
 | 
					 | 
				
			||||||
        assertEquals(1, taskScheduleService.getAllMissedSchedulesOfUser(username).size());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void scheduleAdvanced() {
 | 
					 | 
				
			||||||
        //Situation 1: Schedule finished Task
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_1 = taskScheduleService.scheduleAdvanced(entityManager.find(Task.class, 18L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now().plusHours(1L), LocalDateTime.now().plusHours(2L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_1.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: Schedule Start is before today
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_2 = taskScheduleService.scheduleAdvanced(entityManager.find(Task.class, 17L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now().minusDays(1L), LocalDateTime.now().plusHours(2L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_2.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: Schedule End is before today
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_3 = taskScheduleService.scheduleAdvanced(entityManager.find(Task.class, 17L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now().minusDays(2L), LocalDateTime.now().minusDays(1L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_3.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 4: Start after stop
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_4 = taskScheduleService.scheduleAdvanced(entityManager.find(Task.class, 17L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now().plusHours(2L), LocalDateTime.now().plusHours(1L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_PARAMETER, result_4.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 5: Valid schedule
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_5 = taskScheduleService.scheduleAdvanced(entityManager.find(Task.class, 17L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now(), LocalDateTime.now().plusHours(1L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_5.getExitCode());
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(AdvancedTaskSchedule.class, result_5.getResult().getScheduleID())).isNotNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void editscheduleAdvanced() {
 | 
					 | 
				
			||||||
        //Situation 1: Schedule finished Task
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_1 = taskScheduleService.editAdvancedSchedule(entityManager.find(AdvancedTaskSchedule.class, 12L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now().plusHours(1L), LocalDateTime.now().plusHours(2L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_1.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: Schedule Start is before today
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_2 = taskScheduleService.editAdvancedSchedule(entityManager.find(AdvancedTaskSchedule.class, 11L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now().minusDays(1L), LocalDateTime.now().plusHours(2L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_2.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: Schedule End is before today
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_3 = taskScheduleService.editAdvancedSchedule(entityManager.find(AdvancedTaskSchedule.class, 11L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now().minusDays(2L), LocalDateTime.now().minusDays(1L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_3.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 4: Start after stop
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_4 = taskScheduleService.editAdvancedSchedule(entityManager.find(AdvancedTaskSchedule.class, 11L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now().plusHours(2L), LocalDateTime.now().plusHours(1L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_PARAMETER, result_4.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 5: Valid schedule
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_5 = taskScheduleService.editAdvancedSchedule(entityManager.find(AdvancedTaskSchedule.class, 11L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now(), LocalDateTime.now().plusHours(1L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_5.getExitCode());
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(AdvancedTaskSchedule.class, result_5.getResult().getScheduleID())).isNotNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 6: reschedule already running schedule
 | 
					 | 
				
			||||||
        ServiceResult<AbstractSchedule> result_6 = taskScheduleService.editAdvancedSchedule(entityManager.find(AdvancedTaskSchedule.class, 9L),
 | 
					 | 
				
			||||||
                new AdvancedScheduleFieldInfo(LocalDateTime.now(), LocalDateTime.now().plusHours(1L)));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_OPERATION, result_6.getExitCode());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,93 +0,0 @@
 | 
				
			|||||||
package core.taskgroups;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import core.entities.User;
 | 
					 | 
				
			||||||
import core.entities.timemanager.Task;
 | 
					 | 
				
			||||||
import core.entities.timemanager.Taskgroup;
 | 
					 | 
				
			||||||
import core.repositories.timemanager.TaskgroupRepository;
 | 
					 | 
				
			||||||
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.junit.jupiter.SpringExtension;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 | 
					 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.*;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@ExtendWith(SpringExtension.class)
 | 
					 | 
				
			||||||
@DataJpaTest
 | 
					 | 
				
			||||||
public class TaskgroupRepsitoryTest {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Autowired private TaskgroupRepository taskgroupRepository;
 | 
					 | 
				
			||||||
    @Autowired private TestEntityManager testEntityManager;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @Sql("classpath:taskgroupRepositoryTestEntries.sql")
 | 
					 | 
				
			||||||
    void findAllByUser() {
 | 
					 | 
				
			||||||
        User testUser1 = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        User testUser2 = testEntityManager.find(User.class, 2L);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        List<Taskgroup> result_user2 = taskgroupRepository.findAllByUser(testUser2.getUsername());
 | 
					 | 
				
			||||||
        assertEquals(0, result_user2.size());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        List<Taskgroup> result_user1 = taskgroupRepository.findAllByUser(testUser1.getUsername());
 | 
					 | 
				
			||||||
        assertEquals(8, result_user1.size());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @Sql("classpath:taskgroupRepositoryTestEntries.sql")
 | 
					 | 
				
			||||||
    void findAllTopTaskgroupsByUser() {
 | 
					 | 
				
			||||||
        User testUser1 = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        User testUser2 = testEntityManager.find(User.class, 2L);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 1: Empty user, no taskgroups
 | 
					 | 
				
			||||||
        assertEquals(0, taskgroupRepository.findAllTopTaskgroupsByUser(testUser2.getUsername()).size());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: Only top taskgroups are returned
 | 
					 | 
				
			||||||
        List<Taskgroup> topgroups_user1 = taskgroupRepository.findAllTopTaskgroupsByUser(testUser1.getUsername());
 | 
					 | 
				
			||||||
        assertEquals(3, topgroups_user1.size());
 | 
					 | 
				
			||||||
        assertTrue(topgroups_user1.contains(testEntityManager.find(Taskgroup.class, 1L)));
 | 
					 | 
				
			||||||
        assertTrue(topgroups_user1.contains(testEntityManager.find(Taskgroup.class, 2L)));
 | 
					 | 
				
			||||||
        assertTrue(topgroups_user1.contains(testEntityManager.find(Taskgroup.class, 5L)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: User with username does not exist
 | 
					 | 
				
			||||||
        assertEquals(0, taskgroupRepository.findAllTopTaskgroupsByUser("Rotzbakke").size());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @Sql("classpath:taskgroupRepositoryTestEntries.sql")
 | 
					 | 
				
			||||||
    void deleteAllByUser() {
 | 
					 | 
				
			||||||
        User testUser1 = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        User testUser2 = testEntityManager.find(User.class, 2L);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        taskgroupRepository.deleteAllByUser(testUser2);
 | 
					 | 
				
			||||||
        for(long i=1; i<=8; i++) {
 | 
					 | 
				
			||||||
            assertThat(testEntityManager.find(Taskgroup.class, i)).isNotNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        taskgroupRepository.deleteAllByUser(testUser1);
 | 
					 | 
				
			||||||
        for(long i=1; i<=8; i++) {
 | 
					 | 
				
			||||||
            assertThat(testEntityManager.find(Taskgroup.class, i)).isNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @Sql("classpath:taskgroupRepositoryTestEntries.sql")
 | 
					 | 
				
			||||||
    void delete() {
 | 
					 | 
				
			||||||
        Taskgroup no_children = testEntityManager.find(Taskgroup.class, 1L);
 | 
					 | 
				
			||||||
        Taskgroup taskgroup_with_children = testEntityManager.find(Taskgroup.class, 5L);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        taskgroupRepository.delete(no_children);
 | 
					 | 
				
			||||||
        assertThat(testEntityManager.find(Taskgroup.class, 1L)).isNull();
 | 
					 | 
				
			||||||
        for(long i=2; i<=8; i++) {
 | 
					 | 
				
			||||||
            assertThat(testEntityManager.find(Taskgroup.class, i)).isNotNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        taskgroupRepository.delete(taskgroup_with_children);
 | 
					 | 
				
			||||||
        for(long i=5; i<=8; i++) {
 | 
					 | 
				
			||||||
            assertThat(testEntityManager.find(Taskgroup.class, i)).isNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,202 +0,0 @@
 | 
				
			|||||||
package core.taskgroups;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import core.api.models.timemanager.taskgroup.TaskgroupFieldInfo;
 | 
					 | 
				
			||||||
import core.entities.User;
 | 
					 | 
				
			||||||
import core.entities.timemanager.Task;
 | 
					 | 
				
			||||||
import core.entities.timemanager.Taskgroup;
 | 
					 | 
				
			||||||
import core.repositories.UserRepository;
 | 
					 | 
				
			||||||
import core.repositories.timemanager.TaskgroupRepository;
 | 
					 | 
				
			||||||
import core.services.PermissionResult;
 | 
					 | 
				
			||||||
import core.services.ServiceExitCode;
 | 
					 | 
				
			||||||
import core.services.ServiceResult;
 | 
					 | 
				
			||||||
import core.services.TaskgroupService;
 | 
					 | 
				
			||||||
import org.junit.jupiter.api.BeforeAll;
 | 
					 | 
				
			||||||
import org.junit.jupiter.api.Test;
 | 
					 | 
				
			||||||
import org.junit.jupiter.api.extension.ExtendWith;
 | 
					 | 
				
			||||||
import org.junit.runner.RunWith;
 | 
					 | 
				
			||||||
import org.mockito.InjectMocks;
 | 
					 | 
				
			||||||
import org.mockito.Mock;
 | 
					 | 
				
			||||||
import org.mockito.junit.MockitoJUnitRunner;
 | 
					 | 
				
			||||||
import org.mockito.junit.jupiter.MockitoExtension;
 | 
					 | 
				
			||||||
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.boot.test.context.SpringBootTest;
 | 
					 | 
				
			||||||
import org.springframework.test.context.jdbc.Sql;
 | 
					 | 
				
			||||||
import org.springframework.test.context.jdbc.SqlGroup;
 | 
					 | 
				
			||||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
 | 
					 | 
				
			||||||
import org.springframework.test.context.junit4.SpringRunner;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.persistence.EntityManager;
 | 
					 | 
				
			||||||
import javax.transaction.Transactional;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.NoSuchElementException;
 | 
					 | 
				
			||||||
import java.util.Optional;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 | 
					 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.*;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@SpringBootTest
 | 
					 | 
				
			||||||
@Transactional
 | 
					 | 
				
			||||||
public class TaskgroupServiceTest {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private TaskgroupRepository taskgroupRepository;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private TaskgroupService taskgroupService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private EntityManager entityManager;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static final String username = "Testuser1";
 | 
					 | 
				
			||||||
    private static final String username2 = "Testuser2";
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void getTaskgroupByIDAndUsername() {
 | 
					 | 
				
			||||||
        //Situation 1: correct taskgroup and username
 | 
					 | 
				
			||||||
        assertFalse(taskgroupRepository.findById(1L).isEmpty());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        PermissionResult<Taskgroup> permissionResult = taskgroupService.getTaskgroupByIDAndUsername(1L, username);
 | 
					 | 
				
			||||||
        assertThat(permissionResult).isNotNull();
 | 
					 | 
				
			||||||
        assertTrue(permissionResult.isHasPermissions());
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, permissionResult.getExitCode());
 | 
					 | 
				
			||||||
        assertEquals(taskgroupRepository.findById(1L).get(), permissionResult.getResult());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: invalid taskgroup
 | 
					 | 
				
			||||||
        PermissionResult<Taskgroup> invalid_group = taskgroupService.getTaskgroupByIDAndUsername(-1L, username);
 | 
					 | 
				
			||||||
        assertThat(invalid_group).isNotNull();
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.MISSING_ENTITY, invalid_group.getExitCode());
 | 
					 | 
				
			||||||
        assertFalse(invalid_group.isHasPermissions());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: invalid user
 | 
					 | 
				
			||||||
        PermissionResult<Taskgroup> invalid_user = taskgroupService.getTaskgroupByIDAndUsername(1L, "Rotzbakke");
 | 
					 | 
				
			||||||
        assertThat(invalid_user).isNotNull();
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, invalid_user.getExitCode());
 | 
					 | 
				
			||||||
        assertFalse(invalid_user.isHasPermissions());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void addTaskgroup() {
 | 
					 | 
				
			||||||
        TaskgroupFieldInfo taskgroupFieldInfo = new TaskgroupFieldInfo("Taskgroup", -1);
 | 
					 | 
				
			||||||
        //Situation 1: No such user
 | 
					 | 
				
			||||||
        assertThrows(NoSuchElementException.class, () -> taskgroupService.addTaskgroup(taskgroupFieldInfo, "Rotzbakke"));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: Taskgroup already exists
 | 
					 | 
				
			||||||
        Taskgroup taskgroup = taskgroupRepository.findById(1L).get();
 | 
					 | 
				
			||||||
        ServiceResult<Taskgroup> creationResult = taskgroupService.addTaskgroup(new TaskgroupFieldInfo(taskgroup.getTaskgroupName(), -1), username);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.ENTITY_ALREADY_EXIST, creationResult.getExitCode());
 | 
					 | 
				
			||||||
        assertThat(creationResult.getResult()).isNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: Taskgroup does not exist, no parent
 | 
					 | 
				
			||||||
        ServiceResult<Taskgroup> creationResult_3 = taskgroupService.addTaskgroup(taskgroupFieldInfo, username);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, creationResult_3.getExitCode());
 | 
					 | 
				
			||||||
        assertTrue(taskgroupRepository.existsById(creationResult_3.getResult().getTaskgroupID()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 4: Taskgroup does not exist, with parent; invalid parent (no existent)
 | 
					 | 
				
			||||||
        ServiceResult<Taskgroup> creationResult_4 = taskgroupService.addTaskgroup(new TaskgroupFieldInfo("Situation 4", 100L), username);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.MISSING_ENTITY, creationResult_4.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 5: Taskgroup does not exist, parent exist
 | 
					 | 
				
			||||||
        ServiceResult<Taskgroup> creationResult_5 = taskgroupService.addTaskgroup(new TaskgroupFieldInfo("Situation 5", 2L), username);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, creationResult_5.getExitCode());
 | 
					 | 
				
			||||||
        assertTrue(taskgroupRepository.existsById(creationResult_5.getResult().getTaskgroupID()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 6: taskgroup exist on another user
 | 
					 | 
				
			||||||
        ServiceResult<Taskgroup> creationResult_6 = taskgroupService.addTaskgroup(new TaskgroupFieldInfo(taskgroup.getTaskgroupName(), -1), username2);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, creationResult_6.getExitCode());
 | 
					 | 
				
			||||||
        assertTrue(taskgroupRepository.existsById(creationResult_6.getResult().getTaskgroupID()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void editTaskgroup() {
 | 
					 | 
				
			||||||
        Taskgroup taskgroup = taskgroupRepository.findById(1L).get();
 | 
					 | 
				
			||||||
        //Situation 1: Nothing changed
 | 
					 | 
				
			||||||
        ServiceExitCode exitCode_1 = taskgroupService.editTaskgroup(taskgroup, new TaskgroupFieldInfo(taskgroup.getTaskgroupName(),-1));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, exitCode_1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: Name is already taken
 | 
					 | 
				
			||||||
        ServiceExitCode exitCode_2 = taskgroupService.editTaskgroup(taskgroup, new TaskgroupFieldInfo("Taskgroup 1", -1));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.ENTITY_ALREADY_EXIST, exitCode_2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: All fine
 | 
					 | 
				
			||||||
        ServiceExitCode exitCode_3 = taskgroupService.editTaskgroup(taskgroup, new TaskgroupFieldInfo("Situation 3", -1));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, exitCode_3);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void deleteTaskgroup() {
 | 
					 | 
				
			||||||
        taskgroupService.deleteTaskgroup(entityManager.find(Taskgroup.class, 1L));
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(Taskgroup.class, 1L)).isNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        taskgroupService.deleteTaskgroup(entityManager.find(Taskgroup.class, 2L));
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(Taskgroup.class, 2L)).isNull();
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(Taskgroup.class, 3L)).isNull();
 | 
					 | 
				
			||||||
        for(long i=1; i<=14; i++) {
 | 
					 | 
				
			||||||
            assertThat(entityManager.find(Task.class, i)).isNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        taskgroupService.deleteTaskgroup(entityManager.find(Taskgroup.class, 5L));
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(Taskgroup.class, 5L)).isNull();
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(Taskgroup.class, 6L)).isNull();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void getTopTaskgroupsByUser() {
 | 
					 | 
				
			||||||
        //Situation 1: User without taskgroups
 | 
					 | 
				
			||||||
        List<Taskgroup> taskgroups_user2 = taskgroupService.getTopTaskgroupsByUser(username2);
 | 
					 | 
				
			||||||
        assertEquals(0, taskgroups_user2.size());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: user with taskgroups
 | 
					 | 
				
			||||||
        List<Taskgroup> taskgroups_user1 = taskgroupService.getTopTaskgroupsByUser(username);
 | 
					 | 
				
			||||||
        assertEquals(3, taskgroups_user1.size());
 | 
					 | 
				
			||||||
        assertTrue(taskgroups_user1.contains(entityManager.find(Taskgroup.class, 1L)));
 | 
					 | 
				
			||||||
        assertTrue(taskgroups_user1.contains(entityManager.find(Taskgroup.class, 2L)));
 | 
					 | 
				
			||||||
        assertTrue(taskgroups_user1.contains(entityManager.find(Taskgroup.class, 5L)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: No existent username
 | 
					 | 
				
			||||||
        assertEquals(0, taskgroupService.getTopTaskgroupsByUser("Rotzbakke").size());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void deleteTaskgroupByUser() {
 | 
					 | 
				
			||||||
        User referenceUser1 = entityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        User referenceUser2 = entityManager.find(User.class, 2L);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        taskgroupService.deleteTaskgroupByUser(referenceUser2);
 | 
					 | 
				
			||||||
        for(long i=1; i<=8; i++) {
 | 
					 | 
				
			||||||
            assertThat(entityManager.find(Taskgroup.class, i)).isNotNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        taskgroupService.deleteTaskgroupByUser(referenceUser1);
 | 
					 | 
				
			||||||
        for(long i=1; i<=8; i++) {
 | 
					 | 
				
			||||||
            assertThat(entityManager.find(Taskgroup.class, i)).isNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        for(long i=1; i<=14; i++) {
 | 
					 | 
				
			||||||
            assertThat(entityManager.find(Task.class, i)).isNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,160 +0,0 @@
 | 
				
			|||||||
package core.tasks;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import core.entities.User;
 | 
					 | 
				
			||||||
import core.entities.timemanager.Task;
 | 
					 | 
				
			||||||
import core.entities.timemanager.Taskgroup;
 | 
					 | 
				
			||||||
import core.repositories.timemanager.TaskRepository;
 | 
					 | 
				
			||||||
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 java.time.LocalDate;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 | 
					 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
 | 
					 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@ExtendWith(SpringExtension.class)
 | 
					 | 
				
			||||||
@DataJpaTest
 | 
					 | 
				
			||||||
public class TaskRepositoryTest {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Autowired private TaskRepository taskRepository;
 | 
					 | 
				
			||||||
    @Autowired private TestEntityManager testEntityManager;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void findAllByUser() {
 | 
					 | 
				
			||||||
        User testUser1 = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        User testUser2 = testEntityManager.find(User.class, 2L);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 1: Non existent user
 | 
					 | 
				
			||||||
        assertEquals(0, taskRepository.findAllByUser("Rotzbakke", true).size());
 | 
					 | 
				
			||||||
        assertEquals(0, taskRepository.findAllByUser("Rotzbakke", false).size());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: User with no tasks at all
 | 
					 | 
				
			||||||
        assertEquals(0, taskRepository.findAllByUser(testUser2.getUsername(), false).size());
 | 
					 | 
				
			||||||
        assertEquals(0, taskRepository.findAllByUser(testUser2.getUsername(), true).size());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: User with finished and unfinished tasks
 | 
					 | 
				
			||||||
        List<Task> tasks_user1_false = taskRepository.findAllByUser(testUser1.getUsername(), false);
 | 
					 | 
				
			||||||
        List<Task> tasks_user1_true = taskRepository.findAllByUser(testUser1.getUsername(), true);
 | 
					 | 
				
			||||||
        assertEquals(7, tasks_user1_true.size());
 | 
					 | 
				
			||||||
        assertEquals(8, tasks_user1_false.size());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 1L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 3L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 5L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 7L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 9L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 11L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_false.contains(testEntityManager.find(Task.class, 12L)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 2L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 4L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 6L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 8L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 10L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 13L)));
 | 
					 | 
				
			||||||
        assertTrue(tasks_user1_true.contains(testEntityManager.find(Task.class, 14L)));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void deleteAllByTaskgroup() {
 | 
					 | 
				
			||||||
        Taskgroup taskgroup_no_tasks = testEntityManager.find(Taskgroup.class, 1L);
 | 
					 | 
				
			||||||
        taskRepository.deleteAllByTaskgroup(taskgroup_no_tasks);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for(long i=1; i<=14; i++) {
 | 
					 | 
				
			||||||
            assertThat(testEntityManager.find(Task.class, i)).isNotNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Taskgroup taskgroup_with_task = testEntityManager.find(Taskgroup.class, 2L);
 | 
					 | 
				
			||||||
        taskRepository.deleteAllByTaskgroup(taskgroup_with_task);
 | 
					 | 
				
			||||||
        for(long i=1; i<=14; i++) {
 | 
					 | 
				
			||||||
            Task task  = testEntityManager.find(Task.class, i);
 | 
					 | 
				
			||||||
            assertThat(task).isNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void deleteByTaskID() {
 | 
					 | 
				
			||||||
      taskRepository.deleteByTaskID(-1);
 | 
					 | 
				
			||||||
      for(long i=1; i<=14; i++) {
 | 
					 | 
				
			||||||
          assertThat(testEntityManager.find(Task.class, i)).isNotNull();
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      taskRepository.deleteByTaskID(1);
 | 
					 | 
				
			||||||
      assertThat(testEntityManager.find(Task.class, 1L)).isNull();
 | 
					 | 
				
			||||||
      for(long i=2; i<=14; i++) {
 | 
					 | 
				
			||||||
          assertThat(testEntityManager.find(Task.class, i)).isNotNull();
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void findAllOverdue() {
 | 
					 | 
				
			||||||
        User testuser1 = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        LocalDate referenceDate = LocalDate.of(2023, 10, 11);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        List<Task> overdue = taskRepository.findAllOverdue(testuser1.getUsername(), referenceDate);
 | 
					 | 
				
			||||||
        assertEquals(2, overdue.size());
 | 
					 | 
				
			||||||
        assertTrue(overdue.contains(testEntityManager.find(Task.class, 3L)));
 | 
					 | 
				
			||||||
        assertTrue(overdue.contains(testEntityManager.find(Task.class, 5L)));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void findAllUpcoming() {
 | 
					 | 
				
			||||||
        User testuser1 = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        LocalDate referenceDate = LocalDate.of(2023, 10, 11);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        List<Task> upcoming = taskRepository.findAllUpcoming(testuser1.getUsername(), referenceDate);
 | 
					 | 
				
			||||||
        assertEquals(2, upcoming.size());
 | 
					 | 
				
			||||||
        assertTrue(upcoming.contains(testEntityManager.find(Task.class, 7L)));
 | 
					 | 
				
			||||||
        assertTrue(upcoming.contains(testEntityManager.find(Task.class, 9L)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void findAllActive() {
 | 
					 | 
				
			||||||
        User testuser1 = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        LocalDate referenceDate = LocalDate.of(2023, 10, 11);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        List<Task> active = taskRepository.findAllActive(testuser1.getUsername(), referenceDate);
 | 
					 | 
				
			||||||
        //1,3,5,11,12
 | 
					 | 
				
			||||||
        assertEquals(6, active.size());
 | 
					 | 
				
			||||||
        assertTrue(active.contains(testEntityManager.find(Task.class, 1L)));
 | 
					 | 
				
			||||||
        assertTrue(active.contains(testEntityManager.find(Task.class, 3L)));
 | 
					 | 
				
			||||||
        assertTrue(active.contains(testEntityManager.find(Task.class, 5L)));
 | 
					 | 
				
			||||||
        assertTrue(active.contains(testEntityManager.find(Task.class, 11L)));
 | 
					 | 
				
			||||||
        assertTrue(active.contains(testEntityManager.find(Task.class, 12L)));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,287 +0,0 @@
 | 
				
			|||||||
package core.tasks;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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.TaskRepository;
 | 
					 | 
				
			||||||
import core.repositories.timemanager.TaskgroupRepository;
 | 
					 | 
				
			||||||
import core.services.*;
 | 
					 | 
				
			||||||
import org.junit.jupiter.api.Test;
 | 
					 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					 | 
				
			||||||
import org.springframework.boot.test.context.SpringBootTest;
 | 
					 | 
				
			||||||
import org.springframework.test.annotation.Rollback;
 | 
					 | 
				
			||||||
import org.springframework.test.context.jdbc.Sql;
 | 
					 | 
				
			||||||
import org.springframework.test.context.jdbc.SqlGroup;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import javax.persistence.EntityManager;
 | 
					 | 
				
			||||||
import javax.transaction.Transactional;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.time.LocalDate;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 | 
					 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.*;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@SpringBootTest
 | 
					 | 
				
			||||||
@Transactional
 | 
					 | 
				
			||||||
public class TaskServiceTest {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private TaskService taskService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private EntityManager entityManager;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static final String username = "Testuser1";
 | 
					 | 
				
			||||||
    private static final String username2 = "Testuser2";
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private TaskRepository taskRepository;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private TaskgroupRepository taskgroupRepository;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void createTask() {
 | 
					 | 
				
			||||||
        //Situation 1: Task with that name already exists in a taskgroup
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_1 = new TaskFieldInfo(entityManager.find(Task.class, 1L).getTaskName(), 0, null, null);
 | 
					 | 
				
			||||||
        ServiceResult<Task> situation_1 = taskService.createTask(entityManager.find(Taskgroup.class, 2L), taskFieldInfo_1);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.ENTITY_ALREADY_EXIST, situation_1.getExitCode());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: Task with that name exists in another taskgroup
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_2 = new TaskFieldInfo(entityManager.find(Task.class, 1L).getTaskName(), 0, null, null);
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_2 = taskService.createTask(entityManager.find(Taskgroup.class, 1L), taskFieldInfo_2);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_2.getExitCode());
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(Task.class, result_2.getResult().getTaskID())).isNotNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: Normal, everything fine
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_3 = new TaskFieldInfo("Situation 3", 0, null, null);
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_3 = taskService.createTask(entityManager.find(Taskgroup.class, 1L), taskFieldInfo_3);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_3.getExitCode());
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(Task.class, result_3.getResult().getTaskID())).isNotNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Robustness - Test for invalid dates
 | 
					 | 
				
			||||||
        //Situation 4: Deadline, no start
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_4 = new TaskFieldInfo("Situation 4", 0, null, LocalDate.now());
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_4 = taskService.createTask(entityManager.find(Taskgroup.class, 1L), taskFieldInfo_4);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_4.getExitCode());
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(Task.class, result_4.getResult().getTaskID())).isNotNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 5: Start but no deadline
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_5 = new TaskFieldInfo("Situation 5", 0, LocalDate.now(),null);
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_5 = taskService.createTask(entityManager.find(Taskgroup.class, 1L), taskFieldInfo_5);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_5.getExitCode());
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(Task.class, result_5.getResult().getTaskID())).isNotNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 6: Deadline before start (invalid)
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_6 = new TaskFieldInfo("Situation 6", 0, LocalDate.now(),LocalDate.of(2010, 3, 20));
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_6= taskService.createTask(entityManager.find(Taskgroup.class, 1L), taskFieldInfo_6);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_PARAMETER, result_6.getExitCode());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void getTaskPermissions() {
 | 
					 | 
				
			||||||
        //Situation 1: correct task and username
 | 
					 | 
				
			||||||
        PermissionResult<Task> permissionResult_1 = taskService.getTaskPermissions(1L, username);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, permissionResult_1.getExitCode());
 | 
					 | 
				
			||||||
        assertTrue(permissionResult_1.isHasPermissions());
 | 
					 | 
				
			||||||
        assertEquals(entityManager.find(Task.class, 1L), permissionResult_1.getResult());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: invalid taskgroup
 | 
					 | 
				
			||||||
        PermissionResult<Task> permissionResult_2 = taskService.getTaskPermissions(200L, username);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.MISSING_ENTITY, permissionResult_2.getExitCode());
 | 
					 | 
				
			||||||
        assertFalse(permissionResult_2.isHasPermissions());
 | 
					 | 
				
			||||||
        assertThat(permissionResult_2.getResult()).isNull();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: invalid user
 | 
					 | 
				
			||||||
        PermissionResult<Task> permissionResult_3 = taskService.getTaskPermissions(1L, username2);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, permissionResult_3.getExitCode());
 | 
					 | 
				
			||||||
        assertFalse(permissionResult_2.isHasPermissions());
 | 
					 | 
				
			||||||
        assertEquals(entityManager.find(Task.class, 1L), permissionResult_3.getResult());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void editTask() {
 | 
					 | 
				
			||||||
        //Situation 1: Nothing is updated
 | 
					 | 
				
			||||||
        Task task_1 = entityManager.find(Task.class, 1L);
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_1 = new TaskFieldInfo(entityManager.find(Task.class, 1L).getTaskName(), 0, null, null);
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_1 = taskService.editTask(entityManager.find(Task.class, 1L), taskFieldInfo_1);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_1.getExitCode());
 | 
					 | 
				
			||||||
        assertEquals(task_1, result_1.getResult());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: Name is updated to name that already exists within the taskgroup
 | 
					 | 
				
			||||||
        Task task_2 = entityManager.find(Task.class, 1L);
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_2 = new TaskFieldInfo(entityManager.find(Task.class, 2L).getTaskName(), 0, null, null);
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_2 = taskService.editTask(entityManager.find(Task.class, 1L), taskFieldInfo_2);
 | 
					 | 
				
			||||||
        task_2.setTaskName(entityManager.find(Task.class, 2L).getTaskName());
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.ENTITY_ALREADY_EXIST, result_2.getExitCode());
 | 
					 | 
				
			||||||
        assertNotEquals(task_2, result_2.getResult());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: Name is updated to nonexistend Name
 | 
					 | 
				
			||||||
        Task task_3 = entityManager.find(Task.class, 1L);
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_3 = new TaskFieldInfo("Situation 3", 0, null, null);
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_3 = taskService.editTask(entityManager.find(Task.class, 1L), taskFieldInfo_3);
 | 
					 | 
				
			||||||
        task_3.setTaskName("Situation 3");
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_3.getExitCode());
 | 
					 | 
				
			||||||
        assertEquals(task_3, result_3.getResult());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 4: eta is updated
 | 
					 | 
				
			||||||
        Task task_4 = entityManager.find(Task.class, 1L);
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_4 = new TaskFieldInfo(task_4.getTaskName(), 90, null, null);
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_4 = taskService.editTask(entityManager.find(Task.class, 1L), taskFieldInfo_4);
 | 
					 | 
				
			||||||
        task_4.setEta(90);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_4.getExitCode());
 | 
					 | 
				
			||||||
        assertEquals(task_4, result_4.getResult());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 5: deadline and start is updated in a valid way
 | 
					 | 
				
			||||||
        Task task_5 = entityManager.find(Task.class, 1L);
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_5 = new TaskFieldInfo(task_5.getTaskName(), task_5.getEta(), LocalDate.of(2023, 4, 9), LocalDate.of(2023,5,9));
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_5 = taskService.editTask(entityManager.find(Task.class, 1L), taskFieldInfo_5);
 | 
					 | 
				
			||||||
        task_5.setStartDate(LocalDate.of(2023,4,9));
 | 
					 | 
				
			||||||
        task_5.setDeadline(LocalDate.of(2023,5,9));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_5.getExitCode());
 | 
					 | 
				
			||||||
        assertEquals(task_5, result_5.getResult());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 6: Deadline and start are updated in a not valid way
 | 
					 | 
				
			||||||
        Task task_6 = entityManager.find(Task.class, 1L);
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_6 = new TaskFieldInfo(task_5.getTaskName(), task_5.getEta(), LocalDate.of(2023, 5, 9), LocalDate.of(2023,4,9));
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_6 = taskService.editTask(entityManager.find(Task.class, 1L), taskFieldInfo_6);
 | 
					 | 
				
			||||||
        task_6.setStartDate(LocalDate.of(2023,5,9));
 | 
					 | 
				
			||||||
        task_6.setDeadline(LocalDate.of(2023,4,9));
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.INVALID_PARAMETER, result_6.getExitCode());
 | 
					 | 
				
			||||||
        assertNotEquals(task_6, result_6.getResult());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 10 Startdate = null;
 | 
					 | 
				
			||||||
        Task task_10 = entityManager.find(Task.class, 5L);
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_10 = new TaskFieldInfo(task_10.getTaskName(), task_10.getEta(),null, task_10.getDeadline());
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_10 = taskService.editTask(entityManager.find(Task.class, 5L), taskFieldInfo_10);
 | 
					 | 
				
			||||||
        task_10.setStartDate(null);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_10.getExitCode());
 | 
					 | 
				
			||||||
        assertEquals(task_10, result_10.getResult());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 11 Deadline = null
 | 
					 | 
				
			||||||
        Task task_11 = entityManager.find(Task.class, 5L);
 | 
					 | 
				
			||||||
        TaskFieldInfo taskFieldInfo_11 = new TaskFieldInfo(task_11.getTaskName(), task_11.getEta(),task_11.getStartDate(), null);
 | 
					 | 
				
			||||||
        ServiceResult<Task> result_11 = taskService.editTask(entityManager.find(Task.class, 5L), taskFieldInfo_11);
 | 
					 | 
				
			||||||
        task_11.setDeadline(null);
 | 
					 | 
				
			||||||
        assertEquals(ServiceExitCode.OK, result_11.getExitCode());
 | 
					 | 
				
			||||||
        assertEquals(task_11, result_11.getResult());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void deleteTask() {
 | 
					 | 
				
			||||||
        for(long i=1; i<=15; i++) {
 | 
					 | 
				
			||||||
            taskService.deleteTask(entityManager.find(Task.class, i));
 | 
					 | 
				
			||||||
            assertThat(entityManager.find(Task.class, i)).isNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void clearTasks() {
 | 
					 | 
				
			||||||
        //Situation 1: Delete from taskgroup with no tasks
 | 
					 | 
				
			||||||
        taskService.clearTasks(entityManager.find(Taskgroup.class, 1L));
 | 
					 | 
				
			||||||
        for(long i=1; i<=15; i++) {
 | 
					 | 
				
			||||||
            assertThat(entityManager.find(Task.class, i)).isNotNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        //Situation 2: Delete from taskgroup with tasks
 | 
					 | 
				
			||||||
        taskService.clearTasks(entityManager.find(Taskgroup.class, 2L));
 | 
					 | 
				
			||||||
        for(long i=1; i<=15; i++) {
 | 
					 | 
				
			||||||
            assertThat(entityManager.find(Task.class, i)).isNull();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void finishTask() {
 | 
					 | 
				
			||||||
        taskService.finishTask(entityManager.find(Task.class, 1L));
 | 
					 | 
				
			||||||
        assertTrue(entityManager.find(Task.class, 1L).isFinished());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        taskService.finishTask(entityManager.find(Task.class, 2L));
 | 
					 | 
				
			||||||
        assertTrue(entityManager.find(Task.class, 1L).isFinished());
 | 
					 | 
				
			||||||
        assertThat(entityManager.find(BasicTaskSchedule.class, 2L)).isNull();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @SqlGroup({
 | 
					 | 
				
			||||||
            @Sql("classpath:taskgroupRepositoryTestEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:taskRepositoryEntries.sql"),
 | 
					 | 
				
			||||||
            @Sql("classpath:basicScheduleEntries.sql")
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    void loadAllTasks() {
 | 
					 | 
				
			||||||
        //Situation 1: No tasks existing
 | 
					 | 
				
			||||||
        List<Task> result_1 = taskService.loadAllTasks(username2, TaskScope.UNFINISHED);
 | 
					 | 
				
			||||||
        assertEquals(0, result_1.size());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: Tasks existing, Unfinished#
 | 
					 | 
				
			||||||
        List<Task> result_2 = taskService.loadAllTasks(username, TaskScope.UNFINISHED);
 | 
					 | 
				
			||||||
        assertEquals(8, result_2.size());
 | 
					 | 
				
			||||||
        assertTrue(result_2.contains(entityManager.find(Task.class, 1L)));
 | 
					 | 
				
			||||||
        assertTrue(result_2.contains(entityManager.find(Task.class, 3L)));
 | 
					 | 
				
			||||||
        assertTrue(result_2.contains(entityManager.find(Task.class, 5L)));
 | 
					 | 
				
			||||||
        assertTrue(result_2.contains(entityManager.find(Task.class, 7L)));
 | 
					 | 
				
			||||||
        assertTrue(result_2.contains(entityManager.find(Task.class, 9L)));
 | 
					 | 
				
			||||||
        assertTrue(result_2.contains(entityManager.find(Task.class, 11L)));
 | 
					 | 
				
			||||||
        assertTrue(result_2.contains(entityManager.find(Task.class, 12L)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: Finished tasks
 | 
					 | 
				
			||||||
        List<Task> result_3 = taskService.loadAllTasks(username, TaskScope.FINISHED);
 | 
					 | 
				
			||||||
        assertEquals(7, result_3.size());
 | 
					 | 
				
			||||||
        assertTrue(result_3.contains(entityManager.find(Task.class, 2L)));
 | 
					 | 
				
			||||||
        assertTrue(result_3.contains(entityManager.find(Task.class, 4L)));
 | 
					 | 
				
			||||||
        assertTrue(result_3.contains(entityManager.find(Task.class, 6L)));
 | 
					 | 
				
			||||||
        assertTrue(result_3.contains(entityManager.find(Task.class, 8L)));
 | 
					 | 
				
			||||||
        assertTrue(result_3.contains(entityManager.find(Task.class, 10L)));
 | 
					 | 
				
			||||||
        assertTrue(result_3.contains(entityManager.find(Task.class, 13L)));
 | 
					 | 
				
			||||||
        assertTrue(result_3.contains(entityManager.find(Task.class, 14L)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //overdue
 | 
					 | 
				
			||||||
        List<Task> result_4 = taskService.loadAllTasks(username, TaskScope.OVERDUE);
 | 
					 | 
				
			||||||
        assertEquals(2, result_4.size());
 | 
					 | 
				
			||||||
        assertTrue(result_4.contains(entityManager.find(Task.class, 3L)));
 | 
					 | 
				
			||||||
        assertTrue(result_4.contains(entityManager.find(Task.class, 5L)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //upcoming
 | 
					 | 
				
			||||||
        List<Task> result_5 = taskService.loadAllTasks(username, TaskScope.UPCOMING);
 | 
					 | 
				
			||||||
        assertEquals(2, result_5.size());
 | 
					 | 
				
			||||||
        assertTrue(result_5.contains(entityManager.find(Task.class, 7L)));
 | 
					 | 
				
			||||||
        assertTrue(result_5.contains(entityManager.find(Task.class, 9L)));
 | 
					 | 
				
			||||||
        //Active
 | 
					 | 
				
			||||||
        List<Task> result_6 = taskService.loadAllTasks(username, TaskScope.ACTIVE);
 | 
					 | 
				
			||||||
        assertEquals(6, result_6.size());
 | 
					 | 
				
			||||||
        assertTrue(result_6.contains(entityManager.find(Task.class, 1L)));
 | 
					 | 
				
			||||||
        assertTrue(result_6.contains(entityManager.find(Task.class, 3L)));
 | 
					 | 
				
			||||||
        assertTrue(result_6.contains(entityManager.find(Task.class, 5L)));
 | 
					 | 
				
			||||||
        assertTrue(result_6.contains(entityManager.find(Task.class, 11L)));
 | 
					 | 
				
			||||||
        assertTrue(result_6.contains(entityManager.find(Task.class, 12L)));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,87 +0,0 @@
 | 
				
			|||||||
package core.users;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import core.entities.User;
 | 
					 | 
				
			||||||
import core.repositories.UserRepository;
 | 
					 | 
				
			||||||
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.annotation.DirtiesContext;
 | 
					 | 
				
			||||||
import org.springframework.test.context.jdbc.Sql;
 | 
					 | 
				
			||||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.Optional;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 | 
					 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.*;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@DataJpaTest
 | 
					 | 
				
			||||||
@ExtendWith(SpringExtension.class)
 | 
					 | 
				
			||||||
public class UserRepositoryTests {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private UserRepository userRepository;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private TestEntityManager testEntityManager;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @Sql("classpath:userRepisotoryTestEntries.sql")
 | 
					 | 
				
			||||||
    void test_findByUsername() {
 | 
					 | 
				
			||||||
        //Situation 1: User with name "FawKes100" is present
 | 
					 | 
				
			||||||
        User referenceUser = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        Optional<User> findResult = userRepository.findByUsername(referenceUser.getUsername());
 | 
					 | 
				
			||||||
        assertTrue(findResult.isPresent());
 | 
					 | 
				
			||||||
        assertEquals(referenceUser,findResult.get());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: No user with the required name is present
 | 
					 | 
				
			||||||
        findResult = userRepository.findByUsername("fawkes1001");
 | 
					 | 
				
			||||||
        assertFalse(findResult.isPresent());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @Sql("classpath:userRepisotoryTestEntries.sql")
 | 
					 | 
				
			||||||
    void test_existsByMail() {
 | 
					 | 
				
			||||||
        User referenceUser = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        //Situation 1: invalid email format should not matter
 | 
					 | 
				
			||||||
        assertFalse(userRepository.existsByEmail("FawKes100"));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 2: No user exists with such a mail
 | 
					 | 
				
			||||||
        assertFalse(userRepository.existsByEmail("mail@fawkes100.de"));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: User with this mail exists
 | 
					 | 
				
			||||||
        assertTrue(userRepository.existsByEmail(referenceUser.getEmail()));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @Sql("classpath:userRepisotoryTestEntries.sql")
 | 
					 | 
				
			||||||
    void test_existsByUsername() {
 | 
					 | 
				
			||||||
        User referenceUser = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        //Situation 1: No such user
 | 
					 | 
				
			||||||
        assertFalse(userRepository.existsByUsername("FawKes100"));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //Situation 3: User with this name exists
 | 
					 | 
				
			||||||
        assertTrue(userRepository.existsByUsername(referenceUser.getUsername()));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @Sql("classpath:userRepisotoryTestEntries.sql")
 | 
					 | 
				
			||||||
    void test_deleteUserByName() {
 | 
					 | 
				
			||||||
        User referenceUser1 = testEntityManager.find(User.class, 1L);
 | 
					 | 
				
			||||||
        User referenceUser2 = testEntityManager.find(User.class, 2L);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        userRepository.deleteByUsername(referenceUser2.getUsername());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        assertThat(testEntityManager.find(User.class, referenceUser2.getId())).isNull();
 | 
					 | 
				
			||||||
        assertThat(testEntityManager.find(User.class, referenceUser1.getId())).isNotNull();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Test
 | 
					 | 
				
			||||||
    @Sql("classpath:userRepisotoryTestEntries.sql")
 | 
					 | 
				
			||||||
    void test_countUsers() {
 | 
					 | 
				
			||||||
        assertEquals(2, userRepository.countUsers());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -5,6 +5,7 @@ api/account.service.ts
 | 
				
			|||||||
api/api.ts
 | 
					api/api.ts
 | 
				
			||||||
api/history.service.ts
 | 
					api/history.service.ts
 | 
				
			||||||
api/login.service.ts
 | 
					api/login.service.ts
 | 
				
			||||||
 | 
					api/ntfy.service.ts
 | 
				
			||||||
api/properties.service.ts
 | 
					api/properties.service.ts
 | 
				
			||||||
api/schedule.service.ts
 | 
					api/schedule.service.ts
 | 
				
			||||||
api/task.service.ts
 | 
					api/task.service.ts
 | 
				
			||||||
@ -32,6 +33,7 @@ model/loginRequest.ts
 | 
				
			|||||||
model/loginResponse.ts
 | 
					model/loginResponse.ts
 | 
				
			||||||
model/manualScheduleStopInfo.ts
 | 
					model/manualScheduleStopInfo.ts
 | 
				
			||||||
model/models.ts
 | 
					model/models.ts
 | 
				
			||||||
 | 
					model/ntfyInformation.ts
 | 
				
			||||||
model/passwordChangeRequest.ts
 | 
					model/passwordChangeRequest.ts
 | 
				
			||||||
model/propertiesInfo.ts
 | 
					model/propertiesInfo.ts
 | 
				
			||||||
model/propertyInfo.ts
 | 
					model/propertyInfo.ts
 | 
				
			||||||
 | 
				
			|||||||
@ -5,6 +5,7 @@ import { HttpClient } from '@angular/common/http';
 | 
				
			|||||||
import { AccountService } from './api/account.service';
 | 
					import { AccountService } from './api/account.service';
 | 
				
			||||||
import { HistoryService } from './api/history.service';
 | 
					import { HistoryService } from './api/history.service';
 | 
				
			||||||
import { LoginService } from './api/login.service';
 | 
					import { LoginService } from './api/login.service';
 | 
				
			||||||
 | 
					import { NtfyService } from './api/ntfy.service';
 | 
				
			||||||
import { PropertiesService } from './api/properties.service';
 | 
					import { PropertiesService } from './api/properties.service';
 | 
				
			||||||
import { ScheduleService } from './api/schedule.service';
 | 
					import { ScheduleService } from './api/schedule.service';
 | 
				
			||||||
import { TaskService } from './api/task.service';
 | 
					import { TaskService } from './api/task.service';
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,8 @@ export * from './history.service';
 | 
				
			|||||||
import { HistoryService } from './history.service';
 | 
					import { HistoryService } from './history.service';
 | 
				
			||||||
export * from './login.service';
 | 
					export * from './login.service';
 | 
				
			||||||
import { LoginService } from './login.service';
 | 
					import { LoginService } from './login.service';
 | 
				
			||||||
 | 
					export * from './ntfy.service';
 | 
				
			||||||
 | 
					import { NtfyService } from './ntfy.service';
 | 
				
			||||||
export * from './properties.service';
 | 
					export * from './properties.service';
 | 
				
			||||||
import { PropertiesService } from './properties.service';
 | 
					import { PropertiesService } from './properties.service';
 | 
				
			||||||
export * from './schedule.service';
 | 
					export * from './schedule.service';
 | 
				
			||||||
@ -14,4 +16,4 @@ export * from './taskgroup.service';
 | 
				
			|||||||
import { TaskgroupService } from './taskgroup.service';
 | 
					import { TaskgroupService } from './taskgroup.service';
 | 
				
			||||||
export * from './users.service';
 | 
					export * from './users.service';
 | 
				
			||||||
import { UsersService } from './users.service';
 | 
					import { UsersService } from './users.service';
 | 
				
			||||||
export const APIS = [AccountService, HistoryService, LoginService, PropertiesService, ScheduleService, TaskService, TaskgroupService, UsersService];
 | 
					export const APIS = [AccountService, HistoryService, LoginService, NtfyService, PropertiesService, ScheduleService, TaskService, TaskgroupService, UsersService];
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										210
									
								
								frontend/src/api/api/ntfy.service.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								frontend/src/api/api/ntfy.service.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,210 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * API Title
 | 
				
			||||||
 | 
					 * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The version of the OpenAPI document: 1.0
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 | 
				
			||||||
 | 
					 * https://openapi-generator.tech
 | 
				
			||||||
 | 
					 * Do not edit the class manually.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					/* tslint:disable:no-unused-variable member-ordering */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { Inject, Injectable, Optional }                      from '@angular/core';
 | 
				
			||||||
 | 
					import { HttpClient, HttpHeaders, HttpParams,
 | 
				
			||||||
 | 
					         HttpResponse, HttpEvent, HttpParameterCodec, HttpContext 
 | 
				
			||||||
 | 
					        }       from '@angular/common/http';
 | 
				
			||||||
 | 
					import { CustomHttpParameterCodec }                          from '../encoder';
 | 
				
			||||||
 | 
					import { Observable }                                        from 'rxjs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { NtfyInformation } from '../model/models';
 | 
				
			||||||
 | 
					import { SimpleStatusResponse } from '../model/models';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { BASE_PATH, COLLECTION_FORMATS }                     from '../variables';
 | 
				
			||||||
 | 
					import { Configuration }                                     from '../configuration';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root'
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class NtfyService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected basePath = 'http://127.0.0.1:8080/api';
 | 
				
			||||||
 | 
					    public defaultHeaders = new HttpHeaders();
 | 
				
			||||||
 | 
					    public configuration = new Configuration();
 | 
				
			||||||
 | 
					    public encoder: HttpParameterCodec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
 | 
				
			||||||
 | 
					        if (configuration) {
 | 
				
			||||||
 | 
					            this.configuration = configuration;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (typeof this.configuration.basePath !== 'string') {
 | 
				
			||||||
 | 
					            if (typeof basePath !== 'string') {
 | 
				
			||||||
 | 
					                basePath = this.basePath;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            this.configuration.basePath = basePath;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private addToHttpParams(httpParams: HttpParams, value: any, key?: string): HttpParams {
 | 
				
			||||||
 | 
					        if (typeof value === "object" && value instanceof Date === false) {
 | 
				
			||||||
 | 
					            httpParams = this.addToHttpParamsRecursive(httpParams, value);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            httpParams = this.addToHttpParamsRecursive(httpParams, value, key);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return httpParams;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private addToHttpParamsRecursive(httpParams: HttpParams, value?: any, key?: string): HttpParams {
 | 
				
			||||||
 | 
					        if (value == null) {
 | 
				
			||||||
 | 
					            return httpParams;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (typeof value === "object") {
 | 
				
			||||||
 | 
					            if (Array.isArray(value)) {
 | 
				
			||||||
 | 
					                (value as any[]).forEach( elem => httpParams = this.addToHttpParamsRecursive(httpParams, elem, key));
 | 
				
			||||||
 | 
					            } else if (value instanceof Date) {
 | 
				
			||||||
 | 
					                if (key != null) {
 | 
				
			||||||
 | 
					                    httpParams = httpParams.append(key,
 | 
				
			||||||
 | 
					                        (value as Date).toISOString().substr(0, 10));
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                   throw Error("key may not be null if value is Date");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                Object.keys(value).forEach( k => httpParams = this.addToHttpParamsRecursive(
 | 
				
			||||||
 | 
					                    httpParams, value[k], key != null ? `${key}.${k}` : k));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (key != null) {
 | 
				
			||||||
 | 
					            httpParams = httpParams.append(key, value);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            throw Error("key may not be null if value is not object or array");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return httpParams;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get ntfy information
 | 
				
			||||||
 | 
					     * Get ntfy information
 | 
				
			||||||
 | 
					     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
 | 
				
			||||||
 | 
					     * @param reportProgress flag to report request and response progress.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public ntfyGet(observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<NtfyInformation>;
 | 
				
			||||||
 | 
					    public ntfyGet(observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<HttpResponse<NtfyInformation>>;
 | 
				
			||||||
 | 
					    public ntfyGet(observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<HttpEvent<NtfyInformation>>;
 | 
				
			||||||
 | 
					    public ntfyGet(observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<any> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let localVarHeaders = this.defaultHeaders;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let localVarCredential: string | undefined;
 | 
				
			||||||
 | 
					        // authentication (API_TOKEN) required
 | 
				
			||||||
 | 
					        localVarCredential = this.configuration.lookupCredential('API_TOKEN');
 | 
				
			||||||
 | 
					        if (localVarCredential) {
 | 
				
			||||||
 | 
					            localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
 | 
				
			||||||
 | 
					        if (localVarHttpHeaderAcceptSelected === undefined) {
 | 
				
			||||||
 | 
					            // to determine the Accept header
 | 
				
			||||||
 | 
					            const httpHeaderAccepts: string[] = [
 | 
				
			||||||
 | 
					                'application/json'
 | 
				
			||||||
 | 
					            ];
 | 
				
			||||||
 | 
					            localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (localVarHttpHeaderAcceptSelected !== undefined) {
 | 
				
			||||||
 | 
					            localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let localVarHttpContext: HttpContext | undefined = options && options.context;
 | 
				
			||||||
 | 
					        if (localVarHttpContext === undefined) {
 | 
				
			||||||
 | 
					            localVarHttpContext = new HttpContext();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let responseType_: 'text' | 'json' = 'json';
 | 
				
			||||||
 | 
					        if(localVarHttpHeaderAcceptSelected && localVarHttpHeaderAcceptSelected.startsWith('text')) {
 | 
				
			||||||
 | 
					            responseType_ = 'text';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return this.httpClient.get<NtfyInformation>(`${this.configuration.basePath}/ntfy`,
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                context: localVarHttpContext,
 | 
				
			||||||
 | 
					                responseType: <any>responseType_,
 | 
				
			||||||
 | 
					                withCredentials: this.configuration.withCredentials,
 | 
				
			||||||
 | 
					                headers: localVarHeaders,
 | 
				
			||||||
 | 
					                observe: observe,
 | 
				
			||||||
 | 
					                reportProgress: reportProgress
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Edit ntfy information
 | 
				
			||||||
 | 
					     * Edit ntfy information
 | 
				
			||||||
 | 
					     * @param ntfyInformation 
 | 
				
			||||||
 | 
					     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
 | 
				
			||||||
 | 
					     * @param reportProgress flag to report request and response progress.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public ntfyPost(ntfyInformation?: NtfyInformation, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<SimpleStatusResponse>;
 | 
				
			||||||
 | 
					    public ntfyPost(ntfyInformation?: NtfyInformation, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<HttpResponse<SimpleStatusResponse>>;
 | 
				
			||||||
 | 
					    public ntfyPost(ntfyInformation?: NtfyInformation, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<HttpEvent<SimpleStatusResponse>>;
 | 
				
			||||||
 | 
					    public ntfyPost(ntfyInformation?: NtfyInformation, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<any> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let localVarHeaders = this.defaultHeaders;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let localVarCredential: string | undefined;
 | 
				
			||||||
 | 
					        // authentication (API_TOKEN) required
 | 
				
			||||||
 | 
					        localVarCredential = this.configuration.lookupCredential('API_TOKEN');
 | 
				
			||||||
 | 
					        if (localVarCredential) {
 | 
				
			||||||
 | 
					            localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept;
 | 
				
			||||||
 | 
					        if (localVarHttpHeaderAcceptSelected === undefined) {
 | 
				
			||||||
 | 
					            // to determine the Accept header
 | 
				
			||||||
 | 
					            const httpHeaderAccepts: string[] = [
 | 
				
			||||||
 | 
					                'application/json'
 | 
				
			||||||
 | 
					            ];
 | 
				
			||||||
 | 
					            localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (localVarHttpHeaderAcceptSelected !== undefined) {
 | 
				
			||||||
 | 
					            localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let localVarHttpContext: HttpContext | undefined = options && options.context;
 | 
				
			||||||
 | 
					        if (localVarHttpContext === undefined) {
 | 
				
			||||||
 | 
					            localVarHttpContext = new HttpContext();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // to determine the Content-Type header
 | 
				
			||||||
 | 
					        const consumes: string[] = [
 | 
				
			||||||
 | 
					            'application/json'
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
 | 
				
			||||||
 | 
					        if (httpContentTypeSelected !== undefined) {
 | 
				
			||||||
 | 
					            localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let responseType_: 'text' | 'json' = 'json';
 | 
				
			||||||
 | 
					        if(localVarHttpHeaderAcceptSelected && localVarHttpHeaderAcceptSelected.startsWith('text')) {
 | 
				
			||||||
 | 
					            responseType_ = 'text';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return this.httpClient.post<SimpleStatusResponse>(`${this.configuration.basePath}/ntfy`,
 | 
				
			||||||
 | 
					            ntfyInformation,
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                context: localVarHttpContext,
 | 
				
			||||||
 | 
					                responseType: <any>responseType_,
 | 
				
			||||||
 | 
					                withCredentials: this.configuration.withCredentials,
 | 
				
			||||||
 | 
					                headers: localVarHeaders,
 | 
				
			||||||
 | 
					                observe: observe,
 | 
				
			||||||
 | 
					                reportProgress: reportProgress
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -15,6 +15,7 @@ export * from './inlineResponse409';
 | 
				
			|||||||
export * from './loginRequest';
 | 
					export * from './loginRequest';
 | 
				
			||||||
export * from './loginResponse';
 | 
					export * from './loginResponse';
 | 
				
			||||||
export * from './manualScheduleStopInfo';
 | 
					export * from './manualScheduleStopInfo';
 | 
				
			||||||
 | 
					export * from './ntfyInformation';
 | 
				
			||||||
export * from './passwordChangeRequest';
 | 
					export * from './passwordChangeRequest';
 | 
				
			||||||
export * from './propertiesInfo';
 | 
					export * from './propertiesInfo';
 | 
				
			||||||
export * from './propertyInfo';
 | 
					export * from './propertyInfo';
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										32
									
								
								frontend/src/api/model/ntfyInformation.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								frontend/src/api/model/ntfyInformation.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * API Title
 | 
				
			||||||
 | 
					 * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The version of the OpenAPI document: 1.0
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 | 
				
			||||||
 | 
					 * https://openapi-generator.tech
 | 
				
			||||||
 | 
					 * Do not edit the class manually.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface NtfyInformation { 
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * host of ntfy service
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    ntfy_host: string;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * topic of ntfy service
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    ntfy_topic: string;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * username of ntfy account for publishing news
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    ntfy_user: string;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * token to ntfy useraccount
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    ntfy_token?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -89,6 +89,8 @@ import { ScheduleHistoryComponent } from './statistics/schedule-history/schedule
 | 
				
			|||||||
import {MatButtonToggleModule} from "@angular/material/button-toggle";
 | 
					import {MatButtonToggleModule} from "@angular/material/button-toggle";
 | 
				
			||||||
import {MatGridListModule} from "@angular/material/grid-list";
 | 
					import {MatGridListModule} from "@angular/material/grid-list";
 | 
				
			||||||
import { StopScheduleManuallyComponent } from './dashboard/active-schedule/stop-schedule-manually/stop-schedule-manually.component';
 | 
					import { StopScheduleManuallyComponent } from './dashboard/active-schedule/stop-schedule-manually/stop-schedule-manually.component';
 | 
				
			||||||
 | 
					import { ConnectionSettingsComponent } from './user-settings/connection-settings/connection-settings.component';
 | 
				
			||||||
 | 
					import { NtfySettingsComponent } from './user-settings/connection-settings/ntfy-settings/ntfy-settings.component';
 | 
				
			||||||
@NgModule({
 | 
					@NgModule({
 | 
				
			||||||
  declarations: [
 | 
					  declarations: [
 | 
				
			||||||
    AppComponent,
 | 
					    AppComponent,
 | 
				
			||||||
@ -134,6 +136,8 @@ import { StopScheduleManuallyComponent } from './dashboard/active-schedule/stop-
 | 
				
			|||||||
    HeatmapActivityComponent,
 | 
					    HeatmapActivityComponent,
 | 
				
			||||||
    ScheduleHistoryComponent,
 | 
					    ScheduleHistoryComponent,
 | 
				
			||||||
    StopScheduleManuallyComponent,
 | 
					    StopScheduleManuallyComponent,
 | 
				
			||||||
 | 
					    ConnectionSettingsComponent,
 | 
				
			||||||
 | 
					    NtfySettingsComponent,
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  imports: [
 | 
					  imports: [
 | 
				
			||||||
    BrowserModule,
 | 
					    BrowserModule,
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					<app-ntfy-settings></app-ntfy-settings>
 | 
				
			||||||
@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					import { ComponentFixture, TestBed } from '@angular/core/testing';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { ConnectionSettingsComponent } from './connection-settings.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('ConnectionSettingsComponent', () => {
 | 
				
			||||||
 | 
					  let component: ConnectionSettingsComponent;
 | 
				
			||||||
 | 
					  let fixture: ComponentFixture<ConnectionSettingsComponent>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  beforeEach(() => {
 | 
				
			||||||
 | 
					    TestBed.configureTestingModule({
 | 
				
			||||||
 | 
					      declarations: [ConnectionSettingsComponent]
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    fixture = TestBed.createComponent(ConnectionSettingsComponent);
 | 
				
			||||||
 | 
					    component = fixture.componentInstance;
 | 
				
			||||||
 | 
					    fixture.detectChanges();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should create', () => {
 | 
				
			||||||
 | 
					    expect(component).toBeTruthy();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					import { Component } from '@angular/core';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component({
 | 
				
			||||||
 | 
					  selector: 'app-connection-settings',
 | 
				
			||||||
 | 
					  templateUrl: './connection-settings.component.html',
 | 
				
			||||||
 | 
					  styleUrls: ['./connection-settings.component.css']
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class ConnectionSettingsComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					<mat-form-field appearance="outline" class="long-form">
 | 
				
			||||||
 | 
					  <mat-label>Hostname</mat-label>
 | 
				
			||||||
 | 
					  <input matInput [formControl]="host_formCtrl" placeholder="https://ntfy.sh">
 | 
				
			||||||
 | 
					</mat-form-field>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<mat-form-field appearance="outline" class="long-form">
 | 
				
			||||||
 | 
					  <mat-label>Topic</mat-label>
 | 
				
			||||||
 | 
					  <input matInput [formControl]="topic_formCtrl" placeholder="Topic">
 | 
				
			||||||
 | 
					</mat-form-field>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<mat-form-field appearance="outline" class="long-form">
 | 
				
			||||||
 | 
					  <mat-label>Username</mat-label>
 | 
				
			||||||
 | 
					  <input matInput [formControl]="user_formCtrl" placeholder="username">
 | 
				
			||||||
 | 
					</mat-form-field>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<mat-form-field appearance="outline" class="long-form">
 | 
				
			||||||
 | 
					  <mat-label>Token</mat-label>
 | 
				
			||||||
 | 
					  <input matInput [formControl]="token_formCtrl" placeholder="Token" type="password">
 | 
				
			||||||
 | 
					</mat-form-field>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div style="float: right">
 | 
				
			||||||
 | 
					  <button mat-raised-button color="primary" (click)="save()">Save</button>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					import { ComponentFixture, TestBed } from '@angular/core/testing';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { NtfySettingsComponent } from './ntfy-settings.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('NtfySettingsComponent', () => {
 | 
				
			||||||
 | 
					  let component: NtfySettingsComponent;
 | 
				
			||||||
 | 
					  let fixture: ComponentFixture<NtfySettingsComponent>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  beforeEach(() => {
 | 
				
			||||||
 | 
					    TestBed.configureTestingModule({
 | 
				
			||||||
 | 
					      declarations: [NtfySettingsComponent]
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    fixture = TestBed.createComponent(NtfySettingsComponent);
 | 
				
			||||||
 | 
					    component = fixture.componentInstance;
 | 
				
			||||||
 | 
					    fixture.detectChanges();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should create', () => {
 | 
				
			||||||
 | 
					    expect(component).toBeTruthy();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -0,0 +1,49 @@
 | 
				
			|||||||
 | 
					import { Component } from '@angular/core';
 | 
				
			||||||
 | 
					import {NtfyService} from "../../../../api";
 | 
				
			||||||
 | 
					import {Form, FormBuilder, FormControl, FormGroup, Validators} from "@angular/forms";
 | 
				
			||||||
 | 
					import {MatSnackBar} from "@angular/material/snack-bar";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component({
 | 
				
			||||||
 | 
					  selector: 'app-ntfy-settings',
 | 
				
			||||||
 | 
					  templateUrl: './ntfy-settings.component.html',
 | 
				
			||||||
 | 
					  styleUrls: ['./ntfy-settings.component.css']
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class NtfySettingsComponent {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  host_formCtrl = new FormControl('', [Validators.required])
 | 
				
			||||||
 | 
					  topic_formCtrl = new FormControl('', [Validators.required])
 | 
				
			||||||
 | 
					  user_formCtrl = new FormControl('', [Validators.required])
 | 
				
			||||||
 | 
					  token_formCtrl = new FormControl('', [Validators.required])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor(private ntfyService: NtfyService,
 | 
				
			||||||
 | 
					              private snackbar: MatSnackBar) {
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ngOnInit() {
 | 
				
			||||||
 | 
					    this.ntfyService.ntfyGet().subscribe({
 | 
				
			||||||
 | 
					      next: resp => {
 | 
				
			||||||
 | 
					        this.host_formCtrl.setValue(resp.ntfy_host);
 | 
				
			||||||
 | 
					        this.topic_formCtrl.setValue(resp.ntfy_topic);
 | 
				
			||||||
 | 
					        this.user_formCtrl.setValue(resp.ntfy_user);
 | 
				
			||||||
 | 
					        this.token_formCtrl.setValue(resp.ntfy_token!);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  save() {
 | 
				
			||||||
 | 
					    const token = this.token_formCtrl.value === "****" ? "" : this.token_formCtrl.value!
 | 
				
			||||||
 | 
					    const user = this.user_formCtrl.value === "****" ? "" : this.user_formCtrl.value!
 | 
				
			||||||
 | 
					    this.ntfyService.ntfyPost({
 | 
				
			||||||
 | 
					      ntfy_host: this.host_formCtrl.value!,
 | 
				
			||||||
 | 
					      ntfy_topic: this.topic_formCtrl.value!,
 | 
				
			||||||
 | 
					      ntfy_token: token,
 | 
				
			||||||
 | 
					      ntfy_user: user
 | 
				
			||||||
 | 
					    }).subscribe({
 | 
				
			||||||
 | 
					      next: resp => {
 | 
				
			||||||
 | 
					        this.snackbar.open("Ntfy-Configuration updated", "", {duration: 2000})
 | 
				
			||||||
 | 
					        this.user_formCtrl.setValue("****");
 | 
				
			||||||
 | 
					        this.token_formCtrl.setValue("****");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -4,4 +4,10 @@
 | 
				
			|||||||
      <app-account-settings></app-account-settings>
 | 
					      <app-account-settings></app-account-settings>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </mat-tab>
 | 
					  </mat-tab>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <mat-tab label="Connections">
 | 
				
			||||||
 | 
					    <div class="container">
 | 
				
			||||||
 | 
					      <app-connection-settings></app-connection-settings>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </mat-tab>
 | 
				
			||||||
</mat-tab-group>
 | 
					</mat-tab-group>
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										67
									
								
								openapi.yaml
									
									
									
									
									
								
							
							
						
						
									
										67
									
								
								openapi.yaml
									
									
									
									
									
								
							@ -2027,6 +2027,52 @@ paths:
 | 
				
			|||||||
                type: array
 | 
					                type: array
 | 
				
			||||||
                items:
 | 
					                items:
 | 
				
			||||||
                  $ref: '#/components/schemas/ScheduleInfo'
 | 
					                  $ref: '#/components/schemas/ScheduleInfo'
 | 
				
			||||||
 | 
					  /ntfy:
 | 
				
			||||||
 | 
					    get:
 | 
				
			||||||
 | 
					      security:
 | 
				
			||||||
 | 
					        - API_TOKEN: []
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - ntfy
 | 
				
			||||||
 | 
					      description: Get ntfy information
 | 
				
			||||||
 | 
					      summary: Get ntfy information
 | 
				
			||||||
 | 
					      responses:
 | 
				
			||||||
 | 
					        200:
 | 
				
			||||||
 | 
					          description: Operation successfull
 | 
				
			||||||
 | 
					          content:
 | 
				
			||||||
 | 
					            application/json:
 | 
				
			||||||
 | 
					              schema:
 | 
				
			||||||
 | 
					                $ref: '#/components/schemas/NtfyInformation'
 | 
				
			||||||
 | 
					        404:
 | 
				
			||||||
 | 
					          description: Not found
 | 
				
			||||||
 | 
					          content:
 | 
				
			||||||
 | 
					            application/json:
 | 
				
			||||||
 | 
					              schema:
 | 
				
			||||||
 | 
					                $ref: '#/components/schemas/SimpleStatusResponse'
 | 
				
			||||||
 | 
					    post:
 | 
				
			||||||
 | 
					      security:
 | 
				
			||||||
 | 
					        - API_TOKEN: []
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - ntfy
 | 
				
			||||||
 | 
					      description: Edit ntfy information
 | 
				
			||||||
 | 
					      summary: Edit ntfy information
 | 
				
			||||||
 | 
					      requestBody:
 | 
				
			||||||
 | 
					        content:
 | 
				
			||||||
 | 
					          application/json:
 | 
				
			||||||
 | 
					            schema:
 | 
				
			||||||
 | 
					              $ref: '#/components/schemas/NtfyInformation'
 | 
				
			||||||
 | 
					      responses:
 | 
				
			||||||
 | 
					        200:
 | 
				
			||||||
 | 
					          description: Operation successfull
 | 
				
			||||||
 | 
					          content:
 | 
				
			||||||
 | 
					            application/json:
 | 
				
			||||||
 | 
					              schema:
 | 
				
			||||||
 | 
					                $ref: '#/components/schemas/SimpleStatusResponse'
 | 
				
			||||||
 | 
					        404:
 | 
				
			||||||
 | 
					          description: Operation successfull
 | 
				
			||||||
 | 
					          content:
 | 
				
			||||||
 | 
					            application/json:
 | 
				
			||||||
 | 
					              schema:
 | 
				
			||||||
 | 
					                $ref: '#/components/schemas/SimpleStatusResponse'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
components:
 | 
					components:
 | 
				
			||||||
@ -2713,3 +2759,24 @@ components:
 | 
				
			|||||||
          type: number
 | 
					          type: number
 | 
				
			||||||
          description: duration in minutes
 | 
					          description: duration in minutes
 | 
				
			||||||
          example: 10
 | 
					          example: 10
 | 
				
			||||||
 | 
					    NtfyInformation:
 | 
				
			||||||
 | 
					      required:
 | 
				
			||||||
 | 
					        - ntfy_host
 | 
				
			||||||
 | 
					        - ntfy_topic
 | 
				
			||||||
 | 
					      additionalProperties: false
 | 
				
			||||||
 | 
					      properties:
 | 
				
			||||||
 | 
					        ntfy_host:
 | 
				
			||||||
 | 
					          type: string
 | 
				
			||||||
 | 
					          description: host of ntfy service
 | 
				
			||||||
 | 
					          example: https://ntfy.fawkes100.de
 | 
				
			||||||
 | 
					        ntfy_topic:
 | 
				
			||||||
 | 
					          type: string
 | 
				
			||||||
 | 
					          description: topic of ntfy service
 | 
				
			||||||
 | 
					          example: Topicname
 | 
				
			||||||
 | 
					        ntfy_user:
 | 
				
			||||||
 | 
					          type: string
 | 
				
			||||||
 | 
					          description: username of ntfy account for publishing news
 | 
				
			||||||
 | 
					          example: password
 | 
				
			||||||
 | 
					        ntfy_token:
 | 
				
			||||||
 | 
					          type: string
 | 
				
			||||||
 | 
					          description: token to ntfy useraccount
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user