diff --git a/backend/src/main/java/net/beetechgroup/beetask/frameworks/config/TaskUseCaseConfig.java b/backend/src/main/java/net/beetechgroup/beetask/frameworks/config/TaskUseCaseConfig.java index 6d80111..ed271fa 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/frameworks/config/TaskUseCaseConfig.java +++ b/backend/src/main/java/net/beetechgroup/beetask/frameworks/config/TaskUseCaseConfig.java @@ -7,6 +7,7 @@ import net.beetechgroup.beetask.usecase.repository.TaskRepository; import net.beetechgroup.beetask.usecase.repository.UserRepository; import net.beetechgroup.beetask.usecase.task.create.CreateTaskUseCase; import net.beetechgroup.beetask.usecase.task.listall.ListAllTasksUseCase; +import net.beetechgroup.beetask.usecase.task.listall.ListMyTasksUseCase; import net.beetechgroup.beetask.usecase.task.start.StartTaskUseCase; import net.beetechgroup.beetask.usecase.task.stop.StopTaskUseCase; import net.beetechgroup.beetask.usecase.task.update.UpdateTaskStatusUseCase; @@ -36,6 +37,11 @@ public class TaskUseCaseConfig { return new ListAllTasksUseCase(taskRepository); } + @Produces + public ListMyTasksUseCase listMyTasksUseCase(TaskRepository taskRepository) { + return new ListMyTasksUseCase(taskRepository); + } + @Produces public UpdateTaskStatusUseCase updateTaskStatusUseCase(TaskRepository taskRepository) { return new UpdateTaskStatusUseCase(taskRepository); diff --git a/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/repository/TaskRepositoryImpl.java b/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/repository/TaskRepositoryImpl.java index 51d42a7..20257fd 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/repository/TaskRepositoryImpl.java +++ b/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/repository/TaskRepositoryImpl.java @@ -53,4 +53,9 @@ public class TaskRepositoryImpl implements TaskRepository, PanacheRepository= ?2 and t.finishedAt <= ?3", email, start, end).list().stream().map(TaskEntityMapper::toDomain).toList(); } + + @Override + public List findTasksByUser(String email) { + return find("user.email = ?1", email).list().stream().map(TaskEntityMapper::toDomain).toList(); + } } \ No newline at end of file diff --git a/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/task/TaskController.java b/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/task/TaskController.java index 94160bc..1e95788 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/task/TaskController.java +++ b/backend/src/main/java/net/beetechgroup/beetask/interfaceadapters/controllers/task/TaskController.java @@ -24,6 +24,7 @@ import net.beetechgroup.beetask.usecase.task.create.CreateTaskInput; import net.beetechgroup.beetask.usecase.task.create.CreateTaskOutput; import net.beetechgroup.beetask.usecase.task.create.CreateTaskUseCase; import net.beetechgroup.beetask.usecase.task.listall.ListAllTasksUseCase; +import net.beetechgroup.beetask.usecase.task.listall.ListMyTasksUseCase; import net.beetechgroup.beetask.usecase.task.start.StartTaskUseCase; import net.beetechgroup.beetask.usecase.task.stop.StopTaskUseCase; import net.beetechgroup.beetask.usecase.task.update.UpdateTaskStatusUseCase; @@ -48,6 +49,9 @@ public class TaskController { @Inject ListAllTasksUseCase listAllTasksUseCase; + @Inject + ListMyTasksUseCase listMyTasksUseCase; + @Inject UpdateTaskStatusUseCase updateTaskStatusUseCase; @@ -123,4 +127,13 @@ public class TaskController { return listAllTasksUseCase.execute().stream().map(TaskControllerMapper::toCreateTaskResponse).toList(); } + @GET + @Path("/mine") + @Operation(summary = "List my tasks", description = "Lists all tasks belonging to the authenticated user") + @APIResponse(responseCode = "200", description = "Tasks listed successfully") + public List listMyTasks() { + String email = securityIdentity.getPrincipal().getName(); + return listMyTasksUseCase.execute(email).stream().map(TaskControllerMapper::toCreateTaskResponse).toList(); + } + } diff --git a/backend/src/main/java/net/beetechgroup/beetask/usecase/repository/TaskRepository.java b/backend/src/main/java/net/beetechgroup/beetask/usecase/repository/TaskRepository.java index 5d10f72..55f0299 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/usecase/repository/TaskRepository.java +++ b/backend/src/main/java/net/beetechgroup/beetask/usecase/repository/TaskRepository.java @@ -11,4 +11,5 @@ public interface TaskRepository { List findAllTasks(); List findTasksWorkedByUserInPeriod(String email, LocalDateTime start, LocalDateTime end); List findTasksFinishedByUserInPeriod(String email, LocalDateTime start, LocalDateTime end); + List findTasksByUser(String email); } \ No newline at end of file diff --git a/backend/src/main/java/net/beetechgroup/beetask/usecase/task/listall/ListMyTasksUseCase.java b/backend/src/main/java/net/beetechgroup/beetask/usecase/task/listall/ListMyTasksUseCase.java new file mode 100644 index 0000000..120a9e0 --- /dev/null +++ b/backend/src/main/java/net/beetechgroup/beetask/usecase/task/listall/ListMyTasksUseCase.java @@ -0,0 +1,20 @@ +package net.beetechgroup.beetask.usecase.task.listall; + +import net.beetechgroup.beetask.usecase.repository.TaskRepository; +import net.beetechgroup.beetask.usecase.task.create.CreateTaskMapper; +import net.beetechgroup.beetask.usecase.task.create.CreateTaskOutput; + +import java.util.List; + +public class ListMyTasksUseCase { + + private final TaskRepository taskRepository; + + public ListMyTasksUseCase(TaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + public List execute(String email) { + return taskRepository.findTasksByUser(email).stream().map(CreateTaskMapper::toCreateTaskOutput).toList(); + } +} diff --git a/frontend/src/pages/TaskBoardPage.tsx b/frontend/src/pages/TaskBoardPage.tsx index eafbf64..d39aa26 100644 --- a/frontend/src/pages/TaskBoardPage.tsx +++ b/frontend/src/pages/TaskBoardPage.tsx @@ -1,6 +1,5 @@ import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd' import type { DropResult } from '@hello-pangea/dnd' -import { motion } from 'framer-motion' import { AlertCircle, CheckCircle2, @@ -55,7 +54,7 @@ export function TaskBoardPage() { const loadTasks = async (silent = false) => { if (!silent) setIsLoading(true) try { - const response = await taskService.getTasks() + const response = await taskService.getMyTasks() setTasks(response) } catch (error) { console.error('Failed to load tasks', error) diff --git a/frontend/src/pages/TaskListPage.tsx b/frontend/src/pages/TaskListPage.tsx index 3fe0672..5d444e7 100644 --- a/frontend/src/pages/TaskListPage.tsx +++ b/frontend/src/pages/TaskListPage.tsx @@ -5,7 +5,6 @@ import { CheckCircle2, Clock, Filter, - Layers, Plus, RefreshCw, Search, @@ -64,7 +63,7 @@ export function TaskListPage() { setErrorMessage(null) try { - const response = await taskService.getTasks() + const response = await taskService.getMyTasks() setTasks(response) } catch (error) { setErrorMessage( diff --git a/frontend/src/services/taskService.ts b/frontend/src/services/taskService.ts index 4ef8e6d..f6ac60d 100644 --- a/frontend/src/services/taskService.ts +++ b/frontend/src/services/taskService.ts @@ -5,6 +5,10 @@ export const taskService = { async getTasks(): Promise { return apiFetch('/tasks') }, + + async getMyTasks(): Promise { + return apiFetch('/tasks/mine') + }, async createTask(task: { title: string; description?: string; projectId?: number | null; status?: TaskStatus }): Promise { return apiFetch('/tasks', {