Criando tarefa com projeto
This commit is contained in:
parent
23b2fa4e1a
commit
e78c15898f
9 changed files with 58 additions and 17 deletions
|
|
@ -41,4 +41,13 @@ public class Project {
|
|||
public void setUsers(List<User> users) {
|
||||
this.users = users;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Project{" +
|
||||
"id=" + id +
|
||||
", name='" + name + '\'' +
|
||||
", organization=" + (organization != null ? organization.getName() : "null") +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ public class LoginUseCase {
|
|||
}
|
||||
|
||||
public LoginOutput execute(LoginInput input) {
|
||||
System.out.println(input.email() + " " + input.password());
|
||||
Optional<User> userOptional = userRepository.findByEmail(input.email());
|
||||
|
||||
if (userOptional.isEmpty()) {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<CreateTaskPayload, 'projectId'> & { 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<string | null>(null);
|
||||
const [createdTask, setCreatedTask] = useState<TaskResponse | null>(null);
|
||||
const [projects, setProjects] = useState<Project[]>([]);
|
||||
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() {
|
|||
<Layout size={16} />
|
||||
Projeto
|
||||
</div>
|
||||
<input
|
||||
name="project"
|
||||
value={form.project}
|
||||
<select
|
||||
name="projectId"
|
||||
value={form.projectId || ""}
|
||||
onChange={updateField}
|
||||
placeholder="Ex.: Backend API"
|
||||
className="h-12 w-full 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"
|
||||
/>
|
||||
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"
|
||||
>
|
||||
<option value="">Sem Projeto (Geral)</option>
|
||||
{projects.map((project) => (
|
||||
<option key={project.id} value={project.id}>
|
||||
{project.name}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<label className="group block">
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ export const taskService = {
|
|||
return apiFetch<TaskResponse[]>('/tasks')
|
||||
},
|
||||
|
||||
async createTask(task: { title: string; description?: string; project?: string }): Promise<TaskResponse> {
|
||||
async createTask(task: { title: string; description?: string; projectId?: number | null; status?: TaskStatus }): Promise<TaskResponse> {
|
||||
return apiFetch<TaskResponse>('/tasks', {
|
||||
method: 'POST',
|
||||
body: task,
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ export type CreateTaskPayload = {
|
|||
title: string
|
||||
description: string
|
||||
status: TaskStatus
|
||||
project: string
|
||||
projectId: number | null
|
||||
}
|
||||
|
||||
export type TaskHistoryItem = {
|
||||
|
|
@ -32,5 +32,6 @@ export type TaskResponse = {
|
|||
description: string
|
||||
status: TaskStatus
|
||||
project: string
|
||||
projectId?: number
|
||||
history?: TaskHistoryItem[]
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue