From 014059ae9d3c0485a130d4884f60527057f6ff01 Mon Sep 17 00:00:00 2001 From: Jean Souza Date: Tue, 30 Apr 2024 04:17:00 -0300 Subject: [PATCH 1/2] Complete Challenge --- .../task/exceptions/DeleteException.java | 9 ++ .../task/exceptions/UpdateException.java | 8 ++ .../task/factories/TaskDTOFactory.java | 15 +++ .../modules/task/factories/TaskFactory.java | 25 ++++ .../factories/TaskProgressDTOFactory.java | 18 +++ .../http/controllers/TaskController.java | 101 ++++++++++++++++ .../controllers/TaskProgressController.java | 43 +++++++ .../task/interfaces/ITaskDTOFactory.java | 7 ++ .../modules/task/interfaces/ITaskFactory.java | 8 ++ .../interfaces/ITaskProgressDTOFactory.java | 8 ++ .../task/interfaces/ITaskRepository.java | 17 +++ .../task/repositories/TaskRepository.java | 109 ++++++++++++++++++ .../task/services/CreateTaskService.java | 27 +++++ .../task/services/DeleteTaskService.java | 25 ++++ .../task/services/ICreateTaskService.java | 10 ++ .../task/services/IDeleteTaskService.java | 8 ++ .../services/IRetrieveAllTasksService.java | 11 ++ .../services/IRetrieveTaskByIdService.java | 9 ++ .../services/IUpdateTaskProgressService.java | 10 ++ .../task/services/IUpdateTaskService.java | 9 ++ .../services/RetrieveAllTasksService.java | 26 +++++ .../services/RetrieveTaskByIdService.java | 22 ++++ .../services/UpdateTaskProgressService.java | 24 ++++ .../task/services/UpdateTaskService.java | 22 ++++ .../task/services/CreateTaskServiceTest.java | 40 +++++++ .../task/services/DeleteTaskServiceTest.java | 47 ++++++++ .../services/RetrieveAllTasksServiceTest.java | 45 ++++++++ .../services/RetrieveTaskByIdServiceTest.java | 42 +++++++ .../UpdateTaskProgressServiceTest.java | 56 +++++++++ .../task/services/UpdateTaskServiceTest.java | 89 ++++++++++++++ 30 files changed, 890 insertions(+) create mode 100644 backend-challenge/source/backend/challenge/modules/task/exceptions/DeleteException.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/exceptions/UpdateException.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/factories/TaskDTOFactory.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/factories/TaskFactory.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/factories/TaskProgressDTOFactory.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/infra/http/controllers/TaskProgressController.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskDTOFactory.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskFactory.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskProgressDTOFactory.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskRepository.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/repositories/TaskRepository.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/CreateTaskService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/DeleteTaskService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/ICreateTaskService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/IDeleteTaskService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/IRetrieveAllTasksService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/IUpdateTaskService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/RetrieveTaskByIdService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java create mode 100644 backend-challenge/source/backend/challenge/modules/task/services/UpdateTaskService.java create mode 100644 backend-challenge/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java create mode 100644 backend-challenge/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java create mode 100644 backend-challenge/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java create mode 100644 backend-challenge/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java create mode 100644 backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java create mode 100644 backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java diff --git a/backend-challenge/source/backend/challenge/modules/task/exceptions/DeleteException.java b/backend-challenge/source/backend/challenge/modules/task/exceptions/DeleteException.java new file mode 100644 index 0000000..4f24134 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/exceptions/DeleteException.java @@ -0,0 +1,9 @@ +package backend.challenge.modules.task.exceptions; + +public class DeleteException extends RuntimeException { + + public DeleteException(String message) + { + super(message); + } +} diff --git a/backend-challenge/source/backend/challenge/modules/task/exceptions/UpdateException.java b/backend-challenge/source/backend/challenge/modules/task/exceptions/UpdateException.java new file mode 100644 index 0000000..75755cd --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/exceptions/UpdateException.java @@ -0,0 +1,8 @@ +package backend.challenge.modules.task.exceptions; + +public class UpdateException extends RuntimeException{ + public UpdateException(String message) + { + super(message); + } +} diff --git a/backend-challenge/source/backend/challenge/modules/task/factories/TaskDTOFactory.java b/backend-challenge/source/backend/challenge/modules/task/factories/TaskDTOFactory.java new file mode 100644 index 0000000..bbd69fc --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/factories/TaskDTOFactory.java @@ -0,0 +1,15 @@ +package backend.challenge.modules.task.factories; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.interfaces.ITaskDTOFactory; + +public class TaskDTOFactory implements ITaskDTOFactory { + + @Override + public TaskDTO build(String title, String description) { + TaskDTO taskDTO = TaskDTO.create(); + taskDTO.setTitle(title); + taskDTO.setDescription(description); + return taskDTO; + } +} diff --git a/backend-challenge/source/backend/challenge/modules/task/factories/TaskFactory.java b/backend-challenge/source/backend/challenge/modules/task/factories/TaskFactory.java new file mode 100644 index 0000000..383a590 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/factories/TaskFactory.java @@ -0,0 +1,25 @@ +package backend.challenge.modules.task.factories; + +import java.util.Date; +import java.util.UUID; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.enums.TaskStatus; +import backend.challenge.modules.task.interfaces.ITaskFactory; +import backend.challenge.modules.task.models.Task; + +public class TaskFactory implements ITaskFactory { + + @Override + public Task build(TaskDTO taskDTO) { + Task task = new Task(); + task.setId(UUID.randomUUID().getLeastSignificantBits()); + task.setTitle(taskDTO.getTitle()); + task.setDescription(taskDTO.getDescription()); + task.setStatus(TaskStatus.PROGRESS); + task.setProgress(0); + task.setCreatedAt(new Date()); + return task; + } + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/factories/TaskProgressDTOFactory.java b/backend-challenge/source/backend/challenge/modules/task/factories/TaskProgressDTOFactory.java new file mode 100644 index 0000000..c0eacf5 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/factories/TaskProgressDTOFactory.java @@ -0,0 +1,18 @@ +package backend.challenge.modules.task.factories; + +import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.interfaces.ITaskProgressDTOFactory; + +import java.util.UUID; + +public class TaskProgressDTOFactory implements ITaskProgressDTOFactory { + + @Override + public TaskProgressDTO build(Long id, int progress) + { + TaskProgressDTO taskProgressDTO = TaskProgressDTO.create(); + taskProgressDTO.setId(id); + taskProgressDTO.setProgress(progress); + return taskProgressDTO; + } +} diff --git a/backend-challenge/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java b/backend-challenge/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java new file mode 100644 index 0000000..bff7c63 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -0,0 +1,101 @@ +package backend.challenge.modules.task.infra.http.controllers; + +import backend.challenge.modules.task.exceptions.DeleteException; +import backend.challenge.modules.task.exceptions.UpdateException; +import backend.challenge.modules.task.factories.TaskDTOFactory; +import backend.challenge.modules.task.infra.http.views.TaskView; +import backend.challenge.modules.task.interfaces.*; +import backend.challenge.modules.task.models.Task; +import kikaha.urouting.api.*; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +@Path("tasks") +public class TaskController { + + private static final String TASK_SUCCESSFULLY_DELETED = "Task successfully deleted!"; + private static final int ERROR_BAD_REQUEST = 400; + private final ICreateTaskService createTaskService; + private final IDeleteTaskService deleteTaskService; + private final IRetrieveAllTasksService retrieveAllTasksService; + private final IRetrieveTaskByIdService retrieveTaskByIdService; + private final IUpdateTaskService updateTaskService; + + @Inject + public TaskController( + final ICreateTaskService createTaskService, + final IDeleteTaskService deleteTaskService, + final IRetrieveAllTasksService retrieveAllTasksService + ) { + this.createTaskService = createTaskService; + this.deleteTaskService = deleteTaskService; + this.retrieveAllTasksService = retrieveAllTasksService; + this.retrieveTaskByIdService = null; + this.updateTaskService = null; + } + + @GET + public Response show() { + return DefaultResponse.ok().entity(retrieveAllTasksService.execute()); + } + + @GET + @Path("single/{taskId}") + public Response index(@PathParam("taskId") Long taskId) { + try + { + Task task = retrieveTaskByIdService.execute(taskId); + return DefaultResponse.ok().entity(task); + } + catch (Exception exception) + { + exception.printStackTrace(); + return DefaultResponse.notFound().entity(exception.getMessage()); + } + } + + @POST + public Response create(TaskView task) { + return DefaultResponse.ok().entity(new TaskDTOFactory().build(task.getTitle(), task.getDescription())); + } + + @PUT + @Path("single/{taskId}") + public Response update(@PathParam("taskId") Long taskId, Task task) { + if(task.getId().equals(taskId)) + { + try + { + this.updateTaskService.execute(task); + } + catch(UpdateException updateException) + { + updateException.printStackTrace(); + return DefaultResponse.badRequest().statusCode(ERROR_BAD_REQUEST); + } + } + else + { + return DefaultResponse.badRequest().statusCode(ERROR_BAD_REQUEST); + } + return DefaultResponse.ok().entity(task); + } + + @DELETE + @Path("single/{taskId}") + public Response delete(@PathParam("taskId") Long taskId) { + try + { + this.deleteTaskService.execute(taskId); + } + catch(DeleteException deleteException) + { + deleteException.printStackTrace(); + return DefaultResponse.notFound().entity(deleteException.getMessage()); + } + return DefaultResponse.ok().entity(TASK_SUCCESSFULLY_DELETED); + } + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/infra/http/controllers/TaskProgressController.java b/backend-challenge/source/backend/challenge/modules/task/infra/http/controllers/TaskProgressController.java new file mode 100644 index 0000000..16ec726 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/infra/http/controllers/TaskProgressController.java @@ -0,0 +1,43 @@ +package backend.challenge.modules.task.infra.http.controllers; + +import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.exceptions.UpdateException; +import backend.challenge.modules.task.factories.TaskProgressDTOFactory; +import backend.challenge.modules.task.infra.http.views.TaskProgressView; +import backend.challenge.modules.task.interfaces.IUpdateTaskProgressService; +import backend.challenge.modules.task.models.Task; +import kikaha.urouting.api.*; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.UUID; + +@Singleton +@Path("tasks/progress") +public class TaskProgressController { + + private final IUpdateTaskProgressService updateTaskProgressService; + + @Inject + public TaskProgressController(final IUpdateTaskProgressService updateTaskProgressService) { + this.updateTaskProgressService = updateTaskProgressService; + } + + @PUT + @Path("single/{taskId}") + public Response updateProgress(@PathParam("taskId") Long taskId, TaskProgressView taskProgressView) { + TaskProgressDTO taskProgressDTO = new TaskProgressDTOFactory().build(taskId, taskProgressView.getProgress()); + Task task = null; + try + { + task = this.updateTaskProgressService.execute(taskProgressDTO); + } + catch (UpdateException updateException) + { + updateException.printStackTrace(); + return DefaultResponse.notFound().entity(updateException.getMessage()); + } + return DefaultResponse.ok().entity(task); + } + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskDTOFactory.java b/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskDTOFactory.java new file mode 100644 index 0000000..8150a52 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskDTOFactory.java @@ -0,0 +1,7 @@ +package backend.challenge.modules.task.interfaces; + +import backend.challenge.modules.task.dtos.TaskDTO; + +public interface ITaskDTOFactory { + TaskDTO build(String title, String description); +} diff --git a/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskFactory.java b/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskFactory.java new file mode 100644 index 0000000..9d4a264 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskFactory.java @@ -0,0 +1,8 @@ +package backend.challenge.modules.task.interfaces; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.models.Task; + +public interface ITaskFactory { + Task build(TaskDTO taskDTO); +} diff --git a/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskProgressDTOFactory.java b/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskProgressDTOFactory.java new file mode 100644 index 0000000..1725869 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskProgressDTOFactory.java @@ -0,0 +1,8 @@ +package backend.challenge.modules.task.interfaces; + +import backend.challenge.modules.task.dtos.TaskProgressDTO; + +public interface ITaskProgressDTOFactory { + + TaskProgressDTO build(Long id, int progress); +} diff --git a/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskRepository.java b/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskRepository.java new file mode 100644 index 0000000..9a48570 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/interfaces/ITaskRepository.java @@ -0,0 +1,17 @@ +package backend.challenge.modules.task.interfaces; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.models.Task; + +import java.util.List; + +public interface ITaskRepository { + + Task index(Long taskId); + List show(); + Task create(TaskDTO taskDTO); + Task update(Task task); + void delete(Long taskId); + Task updateProgress(TaskProgressDTO taskProgressDTO); +} diff --git a/backend-challenge/source/backend/challenge/modules/task/repositories/TaskRepository.java b/backend-challenge/source/backend/challenge/modules/task/repositories/TaskRepository.java new file mode 100644 index 0000000..41c0888 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -0,0 +1,109 @@ +package backend.challenge.modules.task.repositories; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import javax.inject.Singleton; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.enums.TaskStatus; +import backend.challenge.modules.task.exceptions.DeleteException; +import backend.challenge.modules.task.exceptions.UpdateException; +import backend.challenge.modules.task.factories.TaskFactory; +import backend.challenge.modules.task.interfaces.ITaskRepository; +import backend.challenge.modules.task.models.Task; + +@Singleton +public class TaskRepository implements ITaskRepository { + + private static final String UPDATE_MESSAGE_ERROR = "An error occurred while trying to update this Task. Please contact technical support for more details!"; + private static final String DELETE_MESSAGE_ERROR = "An error occurred while trying to delete this Task. Please contact technical support for more details!"; + private static final int MAX_PROGRESS = 100; + private List tasks = new ArrayList<>(); + @Override + public Task index(final Long taskId) { + List atualTasks = this.tasks.stream().filter(atualTask -> atualTask.getId().equals(taskId)).collect(Collectors.toList()); + return atualTasks != null && !atualTasks.isEmpty() ? atualTasks.get(0) : null; + } + + @Override + public List show() { + return this.tasks != null ? this.tasks : new ArrayList<>(); + } + + @Override + public Task create(final TaskDTO taskDTO) { + Task task = new TaskFactory().build(taskDTO); + this.tasks.add(task); + return task; + } + + @Override + public Task update(final Task task) throws UpdateException { + Task atualTask = this.index(task.getId()); + if(atualTask != null) + { + atualTask.setTitle(task.getTitle()); + atualTask.setDescription(task.getDescription()); + } + else + { + throw new UpdateException(UPDATE_MESSAGE_ERROR); + } + return atualTask; + } + + @Override + public void delete(final Long taskId) { + Task task = this.index(taskId); + if(task != null) + { + this.tasks.remove(task); + } + else + { + throw new DeleteException(DELETE_MESSAGE_ERROR); + } + } + + @Override + public Task updateProgress(TaskProgressDTO taskProgressDTO) { + Task task = this.index(taskProgressDTO.getId()); + if(task != null) + { + if(checkMaxProgress(taskProgressDTO.getProgress())) + { + updateProgress(task, MAX_PROGRESS); + updateStatus(task, TaskStatus.COMPLETE); + } + else + { + updateProgress(task, taskProgressDTO.getProgress()); + updateStatus(task, TaskStatus.PROGRESS); + } + } + else + { + throw new UpdateException(UPDATE_MESSAGE_ERROR); + } + return task; + } + + private boolean checkMaxProgress(int progress) + { + if(progress >= MAX_PROGRESS) return true; + return false; + } + + private void updateProgress(Task task, int progress) + { + task.setProgress(progress); + } + private void updateStatus(Task task, TaskStatus taskStatus) + { + task.setStatus(taskStatus); + } + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/CreateTaskService.java b/backend-challenge/source/backend/challenge/modules/task/services/CreateTaskService.java new file mode 100644 index 0000000..2d6cdde --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/CreateTaskService.java @@ -0,0 +1,27 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.interfaces.ICreateTaskService; +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.interfaces.ITaskRepository; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class CreateTaskService implements ICreateTaskService { + + private final ITaskRepository taskRepository; + + @Inject + public CreateTaskService(final ITaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + @Override + public Task execute(TaskDTO taskDTO) { + Task task = this.taskRepository.create(taskDTO); + return task; + } + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/DeleteTaskService.java b/backend-challenge/source/backend/challenge/modules/task/services/DeleteTaskService.java new file mode 100644 index 0000000..bdb11de --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/DeleteTaskService.java @@ -0,0 +1,25 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.exceptions.DeleteException; +import backend.challenge.modules.task.interfaces.IDeleteTaskService; +import backend.challenge.modules.task.interfaces.ITaskRepository; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class DeleteTaskService implements IDeleteTaskService { + + private final ITaskRepository taskRepository; + + @Inject + public DeleteTaskService(final ITaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + @Override + public void execute(Long taskId) throws DeleteException { + this.taskRepository.delete(taskId); + } + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/ICreateTaskService.java b/backend-challenge/source/backend/challenge/modules/task/services/ICreateTaskService.java new file mode 100644 index 0000000..33b7d7b --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/ICreateTaskService.java @@ -0,0 +1,10 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.models.Task; + +public interface ICreateTaskService { + + Task execute(TaskDTO taskDTO); + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/IDeleteTaskService.java b/backend-challenge/source/backend/challenge/modules/task/services/IDeleteTaskService.java new file mode 100644 index 0000000..6b031ac --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/IDeleteTaskService.java @@ -0,0 +1,8 @@ +package backend.challenge.modules.task.services; + + +public interface IDeleteTaskService { + + void execute(Long taskId); + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/IRetrieveAllTasksService.java b/backend-challenge/source/backend/challenge/modules/task/services/IRetrieveAllTasksService.java new file mode 100644 index 0000000..3e30258 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/IRetrieveAllTasksService.java @@ -0,0 +1,11 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.models.Task; + +import java.util.List; + +public interface IRetrieveAllTasksService { + + List execute(); + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java b/backend-challenge/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java new file mode 100644 index 0000000..192e28c --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java @@ -0,0 +1,9 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.models.Task; + +public interface IRetrieveTaskByIdService { + + Task execute(Long taskId); + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java b/backend-challenge/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java new file mode 100644 index 0000000..133b794 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java @@ -0,0 +1,10 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.models.Task; + +public interface IUpdateTaskProgressService { + + Task execute(TaskProgressDTO taskProgressDTO); + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/IUpdateTaskService.java b/backend-challenge/source/backend/challenge/modules/task/services/IUpdateTaskService.java new file mode 100644 index 0000000..3da8340 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/IUpdateTaskService.java @@ -0,0 +1,9 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.models.Task; + +public interface IUpdateTaskService { + + Task execute(Task task); + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java b/backend-challenge/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java new file mode 100644 index 0000000..43b57bd --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java @@ -0,0 +1,26 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.interfaces.IRetrieveAllTasksService; +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.interfaces.ITaskRepository; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.List; + +@Singleton +public class RetrieveAllTasksService implements IRetrieveAllTasksService { + + private final ITaskRepository taskRepository; + + @Inject + public RetrieveAllTasksService(final ITaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + @Override + public List execute() { + return this.taskRepository.show(); + } + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/RetrieveTaskByIdService.java b/backend-challenge/source/backend/challenge/modules/task/services/RetrieveTaskByIdService.java new file mode 100644 index 0000000..e41a0cc --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/RetrieveTaskByIdService.java @@ -0,0 +1,22 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.interfaces.IRetrieveTaskByIdService; +import backend.challenge.modules.task.interfaces.ITaskRepository; +import backend.challenge.modules.task.models.Task; + +import javax.inject.Inject; + +public class RetrieveTaskByIdService implements IRetrieveTaskByIdService { + + private final ITaskRepository taskRepository; + + @Inject + public RetrieveTaskByIdService(ITaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + @Override + public Task execute(Long taskId) { + return taskRepository.index(taskId); + } +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java b/backend-challenge/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java new file mode 100644 index 0000000..bafd8ea --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java @@ -0,0 +1,24 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.exceptions.UpdateException; +import backend.challenge.modules.task.interfaces.ITaskRepository; +import backend.challenge.modules.task.interfaces.IUpdateTaskProgressService; +import backend.challenge.modules.task.models.Task; + +public class UpdateTaskProgressService implements IUpdateTaskProgressService { + + private final ITaskRepository taskRepository; + + public UpdateTaskProgressService(ITaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + + @Override + public Task execute(TaskProgressDTO taskProgressDTO) throws UpdateException { + return this.taskRepository.updateProgress(taskProgressDTO); + } + + +} diff --git a/backend-challenge/source/backend/challenge/modules/task/services/UpdateTaskService.java b/backend-challenge/source/backend/challenge/modules/task/services/UpdateTaskService.java new file mode 100644 index 0000000..c336727 --- /dev/null +++ b/backend-challenge/source/backend/challenge/modules/task/services/UpdateTaskService.java @@ -0,0 +1,22 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.exceptions.UpdateException; +import backend.challenge.modules.task.interfaces.ITaskRepository; +import backend.challenge.modules.task.interfaces.IUpdateTaskService; +import backend.challenge.modules.task.models.Task; + +import javax.inject.Inject; + +public class UpdateTaskService implements IUpdateTaskService { + private final ITaskRepository taskRepository; + + @Inject + public UpdateTaskService(ITaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + @Override + public Task execute(Task task) throws UpdateException { + return this.taskRepository.update(task); + } +} diff --git a/backend-challenge/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java b/backend-challenge/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java new file mode 100644 index 0000000..408cb2d --- /dev/null +++ b/backend-challenge/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java @@ -0,0 +1,40 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.factories.TaskDTOFactory; +import backend.challenge.modules.task.interfaces.ICreateTaskService; +import backend.challenge.modules.task.interfaces.ITaskRepository; +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.repositories.TaskRepository; +import kikaha.core.test.KikahaRunner; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith( KikahaRunner.class ) +public class CreateTaskServiceTest { + + private static final String TEST_TITLE = "Test Title"; + private static final String TEST_DESCRIPTION = "Test Description"; + private ICreateTaskService createTaskService; + + @Before + public void init() { + final ITaskRepository taskRepository = new TaskRepository(); + + createTaskService = new CreateTaskService(taskRepository); + } + + @Test + public void shouldBeAbleToCreateANewTask() { + TaskDTO taskDTO = new TaskDTOFactory().build(TEST_TITLE, TEST_DESCRIPTION); + Task task = this.createTaskService.execute(taskDTO); + Assert.assertEquals(taskDTO.getTitle(), task.getTitle()); + Assert.assertEquals(taskDTO.getDescription(), task.getDescription()); + } + + + + +} \ No newline at end of file diff --git a/backend-challenge/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java b/backend-challenge/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java new file mode 100644 index 0000000..b21f2de --- /dev/null +++ b/backend-challenge/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java @@ -0,0 +1,47 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.factories.TaskDTOFactory; +import backend.challenge.modules.task.interfaces.ICreateTaskService; +import backend.challenge.modules.task.interfaces.IDeleteTaskService; +import backend.challenge.modules.task.interfaces.IRetrieveTaskByIdService; +import backend.challenge.modules.task.interfaces.ITaskRepository; +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.repositories.TaskRepository; +import kikaha.core.test.KikahaRunner; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith( KikahaRunner.class ) +public class DeleteTaskServiceTest { + + private IDeleteTaskService deleteTaskService; + private ICreateTaskService createTaskService; + private IRetrieveTaskByIdService retrieveTaskByIdService; + private static final String TEST_TITLE = "Test Title"; + private static final String TEST_DESCRIPTION = "Test Description"; + + @Before + public void init() { + final ITaskRepository taskRepository = new TaskRepository(); + + deleteTaskService = new DeleteTaskService(taskRepository); + createTaskService = new CreateTaskService(taskRepository); + retrieveTaskByIdService = new RetrieveTaskByIdService(taskRepository); + } + + @Test + public void shouldBeAbleToDeleteTaskById() { + TaskDTO taskDTO = new TaskDTOFactory().build(TEST_TITLE, TEST_DESCRIPTION); + Task task = this.createTaskService.execute(taskDTO); + this.deleteTaskService.execute(task.getId()); + Task removedTask = this.retrieveTaskByIdService.execute(task.getId()); + Assert.assertNull(null, removedTask); + } + + + + +} \ No newline at end of file diff --git a/backend-challenge/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java b/backend-challenge/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java new file mode 100644 index 0000000..1139f91 --- /dev/null +++ b/backend-challenge/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java @@ -0,0 +1,45 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.factories.TaskDTOFactory; +import backend.challenge.modules.task.interfaces.ICreateTaskService; +import backend.challenge.modules.task.interfaces.IRetrieveAllTasksService; +import backend.challenge.modules.task.interfaces.ITaskRepository; +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.repositories.TaskRepository; +import kikaha.core.test.KikahaRunner; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.ArrayList; +import java.util.List; + +@RunWith( KikahaRunner.class ) +public class RetrieveAllTasksServiceTest { + + private static final String TEST_TITLE = "Test Title"; + private static final String TEST_DESCRIPTION = "Test Description"; + private IRetrieveAllTasksService retrieveAllTasksService; + private ICreateTaskService createTaskService; + + @Before + public void init() { + final ITaskRepository taskRepository = new TaskRepository(); + + retrieveAllTasksService = new RetrieveAllTasksService(taskRepository); + createTaskService = new CreateTaskService(taskRepository); + } + + @Test + public void shouldBeAbleToListTheTasks() { + TaskDTO taskDTO = new TaskDTOFactory().build(TEST_TITLE, TEST_DESCRIPTION); + Task task = this.createTaskService.execute(taskDTO); + List newTasks = new ArrayList<>(); + newTasks.add(task); + List tasks = this.retrieveAllTasksService.execute(); + Assert.assertEquals(tasks, newTasks); + } + +} \ No newline at end of file diff --git a/backend-challenge/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java b/backend-challenge/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java new file mode 100644 index 0000000..7544629 --- /dev/null +++ b/backend-challenge/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java @@ -0,0 +1,42 @@ +package backend.challenge.modules.task.services; + + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.factories.TaskDTOFactory; +import backend.challenge.modules.task.interfaces.ICreateTaskService; +import backend.challenge.modules.task.interfaces.IRetrieveTaskByIdService; +import backend.challenge.modules.task.interfaces.ITaskRepository; +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.repositories.TaskRepository; +import kikaha.core.test.KikahaRunner; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith( KikahaRunner.class ) +public class RetrieveTaskByIdServiceTest { + + private ITaskRepository taskRepository; + private IRetrieveTaskByIdService retrieveTaskByIdService; + private ICreateTaskService createTaskService; + private static final String TEST_TITLE = "Test Title"; + private static final String TEST_DESCRIPTION = "Test Description"; + + @Before + public void init() { + this.taskRepository = new TaskRepository(); + this.createTaskService = new CreateTaskService(taskRepository); + this.retrieveTaskByIdService = new RetrieveTaskByIdService(taskRepository); + } + + @Test + public void shouldBeAbleToListTheTaskById() { + TaskDTO taskDTO = new TaskDTOFactory().build(TEST_TITLE, TEST_DESCRIPTION); + Task task = this.createTaskService.execute(taskDTO); + Task findTask = this.retrieveTaskByIdService.execute(task.getId()); + + Assert.assertEquals(task.getId(), findTask.getId()); + } + +} diff --git a/backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java b/backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java new file mode 100644 index 0000000..1f831ce --- /dev/null +++ b/backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java @@ -0,0 +1,56 @@ +package backend.challenge.modules.task.services; + + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.enums.TaskStatus; +import backend.challenge.modules.task.factories.TaskDTOFactory; +import backend.challenge.modules.task.factories.TaskProgressDTOFactory; +import backend.challenge.modules.task.interfaces.ICreateTaskService; +import backend.challenge.modules.task.interfaces.ITaskRepository; +import backend.challenge.modules.task.interfaces.IUpdateTaskProgressService; +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.repositories.TaskRepository; +import kikaha.core.test.KikahaRunner; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith( KikahaRunner.class ) +public class UpdateTaskProgressServiceTest { + private static final String TEST_TITLE = "Test Title"; + private static final String TEST_DESCRIPTION = "Test Description"; + private static final int TEST_PROGRESS = 50; + private static final int ONE_HUNDRED = 100; + private final ITaskRepository taskRepository = new TaskRepository(); + private final ICreateTaskService createTaskService = new CreateTaskService(taskRepository); + private final IUpdateTaskProgressService updateTaskProgressService = new UpdateTaskProgressService(taskRepository); + + @Test + public void shouldBeAbleToUpdateTaskProgress() { + TaskDTO taskDTO = new TaskDTOFactory().build(TEST_TITLE, TEST_DESCRIPTION); + Task firstTask = this.createTaskService.execute(taskDTO); + + System.out.println(firstTask.getProgress()); + System.out.println(firstTask.getStatus().name()); + System.out.println(firstTask.getId()); + + TaskProgressDTO taskProgressDTO = new TaskProgressDTOFactory().build(firstTask.getId(), TEST_PROGRESS); + System.out.println(taskProgressDTO.getProgress()); + Task task = this.updateTaskProgressService.execute(taskProgressDTO); + Assert.assertEquals(firstTask.getProgress(), task.getProgress()); + } + + @Test + public void shouldBeAbleToUpdateOnlyTaskStatusWhenProgressEqualsOneHundred() { + TaskDTO taskDTO = new TaskDTOFactory().build(TEST_TITLE, TEST_DESCRIPTION); + Task firstTask = this.createTaskService.execute(taskDTO); + Assert.assertEquals(firstTask.getStatus(), TaskStatus.PROGRESS); + + TaskProgressDTO taskProgressDTO = new TaskProgressDTOFactory().build(firstTask.getId(), ONE_HUNDRED); + Task newTask = this.updateTaskProgressService.execute(taskProgressDTO); + + Assert.assertEquals(newTask.getStatus(), TaskStatus.COMPLETE); + } + +} diff --git a/backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java b/backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java new file mode 100644 index 0000000..9c2525a --- /dev/null +++ b/backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java @@ -0,0 +1,89 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.enums.TaskStatus; +import backend.challenge.modules.task.factories.TaskDTOFactory; +import backend.challenge.modules.task.factories.TaskFactory; +import backend.challenge.modules.task.infra.http.controllers.TaskController; +import backend.challenge.modules.task.interfaces.*; +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.repositories.TaskRepository; +import kikaha.core.test.KikahaRunner; +import kikaha.urouting.api.Response; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +@RunWith( KikahaRunner.class ) +public class UpdateTaskServiceTest { + + private static final int STATUS_BAD_REQUEST = 400; + private static final String URL_UPDATE_BAD_REQUEST = "http://localhost:8080/tasks/single/9999"; + private static final String URL_UPDATE = "http://localhost:8080/tasks/single/"; + private static final int TEST_PROGRESS = 50; + private IUpdateTaskService updateTaskService; + private ICreateTaskService createTaskService; + private ITaskRepository taskRepository; + private IDeleteTaskService deleteTaskService; + private IRetrieveAllTasksService retrieveAllTasksService; + private TaskController taskController; + private static final String TEST_TITLE = "Test Title"; + private static final String TEST_DESCRIPTION = "Test Description"; + + @Before + public void init() { + taskRepository = new TaskRepository(); + createTaskService = new CreateTaskService(taskRepository); + updateTaskService = new UpdateTaskService(taskRepository); + deleteTaskService = new DeleteTaskService(taskRepository); + retrieveAllTasksService = new RetrieveAllTasksService(taskRepository); + taskController = new TaskController(createTaskService, deleteTaskService, retrieveAllTasksService); + } + + @Test + public void shouldBeAbleToUpdateTask() { + TaskDTO taskDTO = new TaskDTOFactory().build(TEST_TITLE, TEST_DESCRIPTION); + Task task = this.createTaskService.execute(taskDTO); + Task newTask = this.updateTaskService.execute(task); + + Assert.assertEquals(task.getTitle(), newTask.getTitle()); + Assert.assertEquals(task.getDescription(), newTask.getDescription()); + + } + + @Test + public void shouldNotBeAbleToUpdateATaskThatDoesNotExist() { + TaskDTO taskDTO = new TaskDTOFactory().build(TEST_TITLE, TEST_DESCRIPTION); + Task task = new TaskFactory().build(taskDTO); + Response response = taskController.update(9999L, task); + Assert.assertEquals(response.statusCode(), STATUS_BAD_REQUEST); + + } + + @Test + public void shouldNotBeAbleToUpdateTaskStatusManually() { + /* + TODO: Para que esse teste passe, você não deve permitir que sua rota de update + altere diretamente o `status` dessa tarefa, mantendo o mesmo status que a tarefa + já possuía antes da atualização. Isso porque o único lugar que deve atualizar essa informação + é a rota responsável por alterar o progresso da tarefa. + + */ + TaskDTO taskDTO = new TaskDTOFactory().build(TEST_TITLE, TEST_DESCRIPTION); + Task task = this.createTaskService.execute(taskDTO); + task.setProgress(TEST_PROGRESS); + task.setStatus(TaskStatus.COMPLETE); + Task verifiedTask = this.updateTaskService.execute(task); + Assert.assertEquals(task.getStatus(),verifiedTask.getStatus()); + + } + + +} \ No newline at end of file From 35d578881efaa316ca0f3309e200adf93343e284 Mon Sep 17 00:00:00 2001 From: Jean Souza Date: Tue, 30 Apr 2024 08:20:22 -0300 Subject: [PATCH 2/2] Removido logs --- .../modules/task/services/UpdateTaskProgressServiceTest.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java b/backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java index 1f831ce..c7631ea 100644 --- a/backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java +++ b/backend-challenge/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java @@ -31,12 +31,7 @@ public void shouldBeAbleToUpdateTaskProgress() { TaskDTO taskDTO = new TaskDTOFactory().build(TEST_TITLE, TEST_DESCRIPTION); Task firstTask = this.createTaskService.execute(taskDTO); - System.out.println(firstTask.getProgress()); - System.out.println(firstTask.getStatus().name()); - System.out.println(firstTask.getId()); - TaskProgressDTO taskProgressDTO = new TaskProgressDTOFactory().build(firstTask.getId(), TEST_PROGRESS); - System.out.println(taskProgressDTO.getProgress()); Task task = this.updateTaskProgressService.execute(taskProgressDTO); Assert.assertEquals(firstTask.getProgress(), task.getProgress()); }