listagem apenas das minhas tasks

This commit is contained in:
Gabriel Santana de Menezes 2026-05-07 09:01:11 -04:00
parent b7803fef05
commit 6800688284
8 changed files with 51 additions and 4 deletions

View file

@ -7,6 +7,7 @@ import net.beetechgroup.beetask.usecase.repository.TaskRepository;
import net.beetechgroup.beetask.usecase.repository.UserRepository; import net.beetechgroup.beetask.usecase.repository.UserRepository;
import net.beetechgroup.beetask.usecase.task.create.CreateTaskUseCase; import net.beetechgroup.beetask.usecase.task.create.CreateTaskUseCase;
import net.beetechgroup.beetask.usecase.task.listall.ListAllTasksUseCase; 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.start.StartTaskUseCase;
import net.beetechgroup.beetask.usecase.task.stop.StopTaskUseCase; import net.beetechgroup.beetask.usecase.task.stop.StopTaskUseCase;
import net.beetechgroup.beetask.usecase.task.update.UpdateTaskStatusUseCase; import net.beetechgroup.beetask.usecase.task.update.UpdateTaskStatusUseCase;
@ -36,6 +37,11 @@ public class TaskUseCaseConfig {
return new ListAllTasksUseCase(taskRepository); return new ListAllTasksUseCase(taskRepository);
} }
@Produces
public ListMyTasksUseCase listMyTasksUseCase(TaskRepository taskRepository) {
return new ListMyTasksUseCase(taskRepository);
}
@Produces @Produces
public UpdateTaskStatusUseCase updateTaskStatusUseCase(TaskRepository taskRepository) { public UpdateTaskStatusUseCase updateTaskStatusUseCase(TaskRepository taskRepository) {
return new UpdateTaskStatusUseCase(taskRepository); return new UpdateTaskStatusUseCase(taskRepository);

View file

@ -53,4 +53,9 @@ public class TaskRepositoryImpl implements TaskRepository, PanacheRepository<Tas
"and t.finishedAt >= ?2 and t.finishedAt <= ?3", "and t.finishedAt >= ?2 and t.finishedAt <= ?3",
email, start, end).list().stream().map(TaskEntityMapper::toDomain).toList(); email, start, end).list().stream().map(TaskEntityMapper::toDomain).toList();
} }
@Override
public List<Task> findTasksByUser(String email) {
return find("user.email = ?1", email).list().stream().map(TaskEntityMapper::toDomain).toList();
}
} }

View file

@ -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.CreateTaskOutput;
import net.beetechgroup.beetask.usecase.task.create.CreateTaskUseCase; import net.beetechgroup.beetask.usecase.task.create.CreateTaskUseCase;
import net.beetechgroup.beetask.usecase.task.listall.ListAllTasksUseCase; 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.start.StartTaskUseCase;
import net.beetechgroup.beetask.usecase.task.stop.StopTaskUseCase; import net.beetechgroup.beetask.usecase.task.stop.StopTaskUseCase;
import net.beetechgroup.beetask.usecase.task.update.UpdateTaskStatusUseCase; import net.beetechgroup.beetask.usecase.task.update.UpdateTaskStatusUseCase;
@ -48,6 +49,9 @@ public class TaskController {
@Inject @Inject
ListAllTasksUseCase listAllTasksUseCase; ListAllTasksUseCase listAllTasksUseCase;
@Inject
ListMyTasksUseCase listMyTasksUseCase;
@Inject @Inject
UpdateTaskStatusUseCase updateTaskStatusUseCase; UpdateTaskStatusUseCase updateTaskStatusUseCase;
@ -123,4 +127,13 @@ public class TaskController {
return listAllTasksUseCase.execute().stream().map(TaskControllerMapper::toCreateTaskResponse).toList(); 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<CreateTaskResponse> listMyTasks() {
String email = securityIdentity.getPrincipal().getName();
return listMyTasksUseCase.execute(email).stream().map(TaskControllerMapper::toCreateTaskResponse).toList();
}
} }

View file

@ -11,4 +11,5 @@ public interface TaskRepository {
List<Task> findAllTasks(); List<Task> findAllTasks();
List<Task> findTasksWorkedByUserInPeriod(String email, LocalDateTime start, LocalDateTime end); List<Task> findTasksWorkedByUserInPeriod(String email, LocalDateTime start, LocalDateTime end);
List<Task> findTasksFinishedByUserInPeriod(String email, LocalDateTime start, LocalDateTime end); List<Task> findTasksFinishedByUserInPeriod(String email, LocalDateTime start, LocalDateTime end);
List<Task> findTasksByUser(String email);
} }

View file

@ -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<CreateTaskOutput> execute(String email) {
return taskRepository.findTasksByUser(email).stream().map(CreateTaskMapper::toCreateTaskOutput).toList();
}
}

View file

@ -1,6 +1,5 @@
import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd' import { DragDropContext, Draggable, Droppable } from '@hello-pangea/dnd'
import type { DropResult } from '@hello-pangea/dnd' import type { DropResult } from '@hello-pangea/dnd'
import { motion } from 'framer-motion'
import { import {
AlertCircle, AlertCircle,
CheckCircle2, CheckCircle2,
@ -55,7 +54,7 @@ export function TaskBoardPage() {
const loadTasks = async (silent = false) => { const loadTasks = async (silent = false) => {
if (!silent) setIsLoading(true) if (!silent) setIsLoading(true)
try { try {
const response = await taskService.getTasks() const response = await taskService.getMyTasks()
setTasks(response) setTasks(response)
} catch (error) { } catch (error) {
console.error('Failed to load tasks', error) console.error('Failed to load tasks', error)

View file

@ -5,7 +5,6 @@ import {
CheckCircle2, CheckCircle2,
Clock, Clock,
Filter, Filter,
Layers,
Plus, Plus,
RefreshCw, RefreshCw,
Search, Search,
@ -64,7 +63,7 @@ export function TaskListPage() {
setErrorMessage(null) setErrorMessage(null)
try { try {
const response = await taskService.getTasks() const response = await taskService.getMyTasks()
setTasks(response) setTasks(response)
} catch (error) { } catch (error) {
setErrorMessage( setErrorMessage(

View file

@ -5,6 +5,10 @@ export const taskService = {
async getTasks(): Promise<TaskResponse[]> { async getTasks(): Promise<TaskResponse[]> {
return apiFetch<TaskResponse[]>('/tasks') return apiFetch<TaskResponse[]>('/tasks')
}, },
async getMyTasks(): Promise<TaskResponse[]> {
return apiFetch<TaskResponse[]>('/tasks/mine')
},
async createTask(task: { title: string; description?: string; projectId?: number | null; status?: TaskStatus }): Promise<TaskResponse> { async createTask(task: { title: string; description?: string; projectId?: number | null; status?: TaskStatus }): Promise<TaskResponse> {
return apiFetch<TaskResponse>('/tasks', { return apiFetch<TaskResponse>('/tasks', {