diff --git a/backend/src/main/java/net/beetechgroup/beetask/entities/Project.java b/backend/src/main/java/net/beetechgroup/beetask/entities/Project.java index f418fa9..13e4349 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/entities/Project.java +++ b/backend/src/main/java/net/beetechgroup/beetask/entities/Project.java @@ -41,4 +41,13 @@ public class Project { public void setUsers(List users) { this.users = users; } + + @Override + public String toString() { + return "Project{" + + "id=" + id + + ", name='" + name + '\'' + + ", organization=" + (organization != null ? organization.getName() : "null") + + '}'; + } } 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 8cfa55b..0678b59 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 @@ -2,6 +2,7 @@ package net.beetechgroup.beetask.frameworks.config; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; +import net.beetechgroup.beetask.usecase.repository.ProjectRepository; import net.beetechgroup.beetask.usecase.repository.TaskRepository; import net.beetechgroup.beetask.usecase.task.create.CreateTaskUseCase; import net.beetechgroup.beetask.usecase.task.listall.ListAllTasksUseCase; @@ -13,8 +14,8 @@ import net.beetechgroup.beetask.usecase.task.update.UpdateTaskStatusUseCase; public class TaskUseCaseConfig { @Produces - public CreateTaskUseCase createTaskUseCase(TaskRepository taskRepository) { - return new CreateTaskUseCase(taskRepository); + public CreateTaskUseCase createTaskUseCase(TaskRepository taskRepository, ProjectRepository projectRepository) { + return new CreateTaskUseCase(taskRepository, projectRepository); } @Produces diff --git a/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/entities/TaskEntity.java b/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/entities/TaskEntity.java index 186ab55..af0e664 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/entities/TaskEntity.java +++ b/backend/src/main/java/net/beetechgroup/beetask/frameworks/persistence/entities/TaskEntity.java @@ -11,7 +11,6 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; -import net.beetechgroup.beetask.entities.Project; import net.beetechgroup.beetask.entities.task.TaskStatus; @Entity diff --git a/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/login/LoginUseCase.java b/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/login/LoginUseCase.java index 21b7604..1282740 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/login/LoginUseCase.java +++ b/backend/src/main/java/net/beetechgroup/beetask/usecase/auth/login/LoginUseCase.java @@ -23,6 +23,7 @@ public class LoginUseCase { } public LoginOutput execute(LoginInput input) { + System.out.println(input.email() + " " + input.password()); Optional userOptional = userRepository.findByEmail(input.email()); if (userOptional.isEmpty()) { diff --git a/backend/src/main/java/net/beetechgroup/beetask/usecase/task/create/CreateTaskUseCase.java b/backend/src/main/java/net/beetechgroup/beetask/usecase/task/create/CreateTaskUseCase.java index e3023b1..853bd1d 100644 --- a/backend/src/main/java/net/beetechgroup/beetask/usecase/task/create/CreateTaskUseCase.java +++ b/backend/src/main/java/net/beetechgroup/beetask/usecase/task/create/CreateTaskUseCase.java @@ -2,13 +2,16 @@ package net.beetechgroup.beetask.usecase.task.create; import net.beetechgroup.beetask.entities.Project; import net.beetechgroup.beetask.entities.task.Task; +import net.beetechgroup.beetask.usecase.repository.ProjectRepository; import net.beetechgroup.beetask.usecase.repository.TaskRepository; public class CreateTaskUseCase { private final TaskRepository taskRepository; + private final ProjectRepository projectRepository; - public CreateTaskUseCase(TaskRepository taskRepository) { + public CreateTaskUseCase(TaskRepository taskRepository, ProjectRepository projectRepository) { this.taskRepository = taskRepository; + this.projectRepository = projectRepository; } public CreateTaskOutput execute(CreateTaskInput input) { @@ -16,11 +19,13 @@ public class CreateTaskUseCase { task.setTitle(input.title()); task.setDescription(input.description()); task.setStatus(input.status()); + if (input.projectId() != null) { - Project project = new Project(); - project.setId(input.projectId()); + Project project = projectRepository.findProjectById(input.projectId()) + .orElseThrow(() -> new IllegalArgumentException("Projeto não encontrado com ID: " + input.projectId())); task.setProject(project); } + return CreateTaskMapper.toCreateTaskOutput(taskRepository.saveTask(task)); } } diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 3114440..d2d6ea4 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -9,6 +9,7 @@ quarkus.datasource.jdbc.url=${DB_URL:jdbc:postgresql://localhost:5432/timetrack} %dev.quarkus.datasource.db-kind=h2 %dev.quarkus.datasource.jdbc.url=jdbc:h2:file:./data/beetask;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE +%dev.quarkus.h2.console=true %dev.quarkus.hibernate-orm.database.generation=update quarkus.flyway.migrate-at-start=false diff --git a/frontend/src/pages/CreateTaskPage.tsx b/frontend/src/pages/CreateTaskPage.tsx index 8a733b4..37b2e33 100644 --- a/frontend/src/pages/CreateTaskPage.tsx +++ b/frontend/src/pages/CreateTaskPage.tsx @@ -15,14 +15,17 @@ import { taskService } from "../services/taskService"; import { cn } from "../lib/utils"; import { TASK_STATUS_LABELS, TASK_STATUS_OPTIONS } from "../types/task"; import type { CreateTaskPayload, TaskResponse } from "../types/task"; +import { useAuth } from "../contexts/AuthContext"; +import { useEffect } from "react"; +import { projectService, type Project } from "../services/projectService"; -type FormState = CreateTaskPayload; +type FormState = Omit & { projectId: string }; const initialFormState: FormState = { title: "", description: "", status: "NOT_STARTED", - project: "", + projectId: "", }; export function CreateTaskPage() { @@ -30,6 +33,21 @@ export function CreateTaskPage() { const [isSubmitting, setIsSubmitting] = useState(false); const [errorMessage, setErrorMessage] = useState(null); const [createdTask, setCreatedTask] = useState(null); + const [projects, setProjects] = useState([]); + const { activeOrg } = useAuth(); + + useEffect(() => { + async function loadProjects() { + if (!activeOrg) return; + try { + const data = await projectService.listByOrganization(activeOrg.id); + setProjects(data); + } catch (error) { + console.error("Erro ao carregar projetos:", error); + } + } + loadProjects(); + }, [activeOrg]); function updateField( event: ChangeEvent< @@ -53,7 +71,7 @@ export function CreateTaskPage() { title: form.title.trim(), description: form.description.trim(), status: form.status, - project: form.project.trim(), + projectId: form.projectId ? Number(form.projectId) : null, }; const response = await taskService.createTask(payload); @@ -186,13 +204,19 @@ export function CreateTaskPage() { Projeto - + className="h-12 w-full appearance-none rounded-xl border border-border-soft bg-app-bg px-4 text-sm font-medium outline-none transition-all focus:border-brand focus:ring-4 focus:ring-brand/10" + > + + {projects.map((project) => ( + + ))} +