diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml
index e461dea..ef82d37 100644
--- a/backend/.idea/workspace.xml
+++ b/backend/.idea/workspace.xml
@@ -5,7 +5,12 @@
-
+
+
+
+
+
+
@@ -16,8 +21,8 @@
@@ -41,33 +46,34 @@
- {
- "keyToString": {
- "RequestMappingsPanelOrder0": "0",
- "RequestMappingsPanelOrder1": "1",
- "RequestMappingsPanelWidth0": "75",
- "RequestMappingsPanelWidth1": "75",
- "RunOnceActivity.OpenProjectViewOnStart": "true",
- "RunOnceActivity.ShowReadmeOnStart": "true",
- "WebServerToolWindowFactoryState": "false",
- "git-widget-placeholder": "issue-11-angular-update",
- "last_directory_selection": "D:/Programmierprojekte/TimeManager/backend/src/main/java/core/api/models/timemanager",
- "last_opened_file_path": "D:/Programmierprojekte/Dicewars/client",
- "node.js.detected.package.eslint": "true",
- "node.js.detected.package.tslint": "true",
- "node.js.selected.package.eslint": "(autodetect)",
- "node.js.selected.package.tslint": "(autodetect)",
- "nodejs_package_manager_path": "npm",
- "settings.editor.selected.configurable": "swagger",
- "ts.external.directory.path": "/snap/intellij-idea-ultimate/459/plugins/javascript-impl/jsLanguageServicesImpl/external",
- "vue.rearranger.settings.migration": "true"
+
+}]]>
diff --git a/backend/src/main/java/core/api/controller/TaskController.java b/backend/src/main/java/core/api/controller/TaskController.java
index 5be2520..ef989d1 100644
--- a/backend/src/main/java/core/api/controller/TaskController.java
+++ b/backend/src/main/java/core/api/controller/TaskController.java
@@ -4,6 +4,7 @@ import core.api.models.auth.SimpleStatusResponse;
import core.api.models.timemanager.taskSchedule.ScheduleInfo;
import core.api.models.timemanager.tasks.TaskEntityInfo;
import core.api.models.timemanager.tasks.TaskFieldInfo;
+import core.api.models.timemanager.tasks.TaskScope;
import core.api.models.timemanager.tasks.TaskShortInfo;
import core.entities.timemanager.Task;
import core.entities.timemanager.Taskgroup;
@@ -31,22 +32,37 @@ public class TaskController {
this.taskgroupService = taskgroupService;
}
- @GetMapping("/tasks/all/{finished}")
- public ResponseEntity> loadAllTasks(@PathVariable boolean finished) {
- List taskList = taskService.loadAllTasks(SecurityContextHolder.getContext().getAuthentication().getName(), finished);
+ @GetMapping("/tasks/all/{scope}/{detailed}")
+ public ResponseEntity> loadAllTasksShort(@PathVariable TaskScope scope, @PathVariable boolean detailed) {
+ List taskList = taskService.loadAllTasks(SecurityContextHolder.getContext().getAuthentication().getName(), scope);
List taskShortInfos = new ArrayList<>();
+ List taskInfos = new ArrayList<>();
for(Task task : taskList) {
- List ancestors = Taskgroup.getAncestorList(task.getTaskgroup());
- ancestors.add(task.getTaskgroup());
- StringBuilder builder = new StringBuilder();
- for(Taskgroup taskgroup : ancestors) {
- builder.append(taskgroup.getTaskgroupName()).append("/");
+ StringBuilder builder = loadTaskgroupPath(task);
+ if(!detailed) {
+ taskShortInfos.add(new TaskShortInfo(task.getTaskID(), builder.toString()));
+ } else {
+ taskInfos.add(new TaskEntityInfo(task));
}
- builder.append(task.getTaskName());
- taskShortInfos.add(new TaskShortInfo(task.getTaskID(), builder.toString()));
}
- return ResponseEntity.ok(taskShortInfos);
+
+ if(detailed) {
+ return ResponseEntity.ok(taskInfos);
+ } else {
+ return ResponseEntity.ok(taskShortInfos);
+ }
+ }
+
+ private StringBuilder loadTaskgroupPath(Task task) {
+ List ancestors = Taskgroup.getAncestorList(task.getTaskgroup());
+ ancestors.add(task.getTaskgroup());
+ StringBuilder builder = new StringBuilder();
+ for(Taskgroup taskgroup : ancestors) {
+ builder.append(taskgroup.getTaskgroupName()).append("/");
+ }
+ builder.append(task.getTaskName());
+ return builder;
}
@GetMapping("/tasks/{taskgroupID}/{status}")
diff --git a/backend/src/main/java/core/api/models/timemanager/tasks/TaskScope.java b/backend/src/main/java/core/api/models/timemanager/tasks/TaskScope.java
new file mode 100644
index 0000000..8a5dd02
--- /dev/null
+++ b/backend/src/main/java/core/api/models/timemanager/tasks/TaskScope.java
@@ -0,0 +1,8 @@
+package core.api.models.timemanager.tasks;
+
+public enum TaskScope {
+
+ FINISHED,
+ UNFINISHED,
+ OVERDUE;
+}
diff --git a/backend/src/main/java/core/repositories/timemanager/TaskRepository.java b/backend/src/main/java/core/repositories/timemanager/TaskRepository.java
index 59f3fe4..dd93eb6 100644
--- a/backend/src/main/java/core/repositories/timemanager/TaskRepository.java
+++ b/backend/src/main/java/core/repositories/timemanager/TaskRepository.java
@@ -8,6 +8,7 @@ import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import javax.transaction.Transactional;
+import java.time.LocalDate;
import java.util.List;
@Repository
@@ -25,4 +26,7 @@ public interface TaskRepository extends CrudRepository {
@Modifying
@Query(value = "DELETE FROM Task t WHERE t.taskID = ?1")
void deleteByTaskID(long taskID);
+
+ @Query(value = "SELECT t FROM Task t WHERE t.taskgroup.user.username = ?1 AND t is NOT NULL AND t.deadline > ?2")
+ List findAllOverdue(String username, LocalDate now);
}
diff --git a/backend/src/main/java/core/services/TaskService.java b/backend/src/main/java/core/services/TaskService.java
index 7a300fa..d55a9e4 100644
--- a/backend/src/main/java/core/services/TaskService.java
+++ b/backend/src/main/java/core/services/TaskService.java
@@ -1,6 +1,7 @@
package core.services;
import core.api.models.timemanager.tasks.TaskFieldInfo;
+import core.api.models.timemanager.tasks.TaskScope;
import core.entities.timemanager.BasicTaskSchedule;
import core.entities.timemanager.Task;
import core.entities.timemanager.Taskgroup;
@@ -10,6 +11,7 @@ import core.repositories.timemanager.TaskgroupRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
@@ -99,7 +101,18 @@ public class TaskService {
}
}
- public List loadAllTasks(String username, boolean finished) {
- return taskRepository.findAllByUser(username, finished);
+ public List loadAllTasks(String username, TaskScope scope) {
+ switch (scope) {
+ case UNFINISHED, FINISHED -> {
+ return taskRepository.findAllByUser(username, scope.equals(TaskScope.FINISHED));
+ }
+ case OVERDUE -> {
+ return taskRepository.findAllOverdue(username, LocalDate.now());
+ }
+ default -> {
+ return new ArrayList<>();
+ }
+ }
+
}
}
diff --git a/frontend/src/api/api/task.service.ts b/frontend/src/api/api/task.service.ts
index 549949d..7032140 100644
--- a/frontend/src/api/api/task.service.ts
+++ b/frontend/src/api/api/task.service.ts
@@ -92,16 +92,20 @@ export class TaskService {
/**
* edits an existing task
* edits an existing task
- * @param finished fetches either finished or unfinished tasks
+ * @param scope defines scope of fetched tasks
+ * @param detailed determines whether an detailed response is required or not
* @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 tasksAllFinishedGet(finished: boolean, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>;
- public tasksAllFinishedGet(finished: boolean, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>>;
- public tasksAllFinishedGet(finished: boolean, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>>;
- public tasksAllFinishedGet(finished: boolean, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable {
- if (finished === null || finished === undefined) {
- throw new Error('Required parameter finished was null or undefined when calling tasksAllFinishedGet.');
+ public tasksAllScopeDetailedGet(scope: 'FINISHED' | 'UNFINISHED' | 'OVERDUE', detailed: boolean, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable | Array>;
+ public tasksAllScopeDetailedGet(scope: 'FINISHED' | 'UNFINISHED' | 'OVERDUE', detailed: boolean, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable | Array>>;
+ public tasksAllScopeDetailedGet(scope: 'FINISHED' | 'UNFINISHED' | 'OVERDUE', detailed: boolean, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable | Array>>;
+ public tasksAllScopeDetailedGet(scope: 'FINISHED' | 'UNFINISHED' | 'OVERDUE', detailed: boolean, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable {
+ if (scope === null || scope === undefined) {
+ throw new Error('Required parameter scope was null or undefined when calling tasksAllScopeDetailedGet.');
+ }
+ if (detailed === null || detailed === undefined) {
+ throw new Error('Required parameter detailed was null or undefined when calling tasksAllScopeDetailedGet.');
}
let localVarHeaders = this.defaultHeaders;
@@ -136,7 +140,7 @@ export class TaskService {
responseType_ = 'text';
}
- return this.httpClient.get>(`${this.configuration.basePath}/tasks/all/${encodeURIComponent(String(finished))}`,
+ return this.httpClient.get | Array>(`${this.configuration.basePath}/tasks/all/${encodeURIComponent(String(scope))}/${encodeURIComponent(String(detailed))}`,
{
context: localVarHttpContext,
responseType: responseType_,
diff --git a/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.ts b/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.ts
index 5cc7abf..81d8078 100644
--- a/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.ts
+++ b/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.ts
@@ -30,7 +30,7 @@ export class ForgottenTaskStartDialogComponent implements OnInit{
}
ngOnInit() {
- this.taskService.tasksAllFinishedGet(false).subscribe({
+ this.taskService.tasksAllScopeDetailedGet("UNFINISHED", false).subscribe({
next: resp => {
this.tasks = resp;
this.filteredOptions = this.myControl.valueChanges.pipe(
diff --git a/openapi.yaml b/openapi.yaml
index 0f59d2e..279fc80 100644
--- a/openapi.yaml
+++ b/openapi.yaml
@@ -883,7 +883,7 @@ paths:
schema:
type: object
$ref: "#/components/schemas/SimpleStatusResponse"
- /tasks/all/{finished}:
+ /tasks/all/{scope}/{detailed}:
get:
security:
- API_TOKEN: []
@@ -892,11 +892,21 @@ paths:
summary: edits an existing task
description: edits an existing task
parameters:
- - name: finished
+ - name: scope
in: path
- description: fetches either finished or unfinished tasks
+ description: defines scope of fetched tasks
required: true
schema:
+ type: string
+ enum:
+ - FINISHED
+ - UNFINISHED
+ - OVERDUE
+ - name: detailed
+ in: path
+ description: determines whether an detailed response is required or not
+ required: true
+ schema:
type: boolean
example: true
responses:
@@ -905,9 +915,14 @@ paths:
content:
application/json:
schema:
- type: array
- items:
- $ref: '#/components/schemas/TaskShortInfo'
+ oneOf:
+ - type: array
+ items:
+ $ref: '#/components/schemas/TaskShortInfo'
+ - type: array
+ items:
+ $ref: '#/components/schemas/TaskEntityInfo'
+
/tasks/{taskgroupID}/{status}:
get: