Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package backend.challenge.modules.task.infra.http.controllers;

import backend.challenge.modules.task.dtos.TaskDTO;
import backend.challenge.modules.task.infra.http.views.TaskView;
import backend.challenge.modules.task.models.Task;
import backend.challenge.modules.task.services.*;
Expand All @@ -22,54 +23,53 @@ public class TaskController {
public TaskController(
final ICreateTaskService createTaskService,
final IDeleteTaskService deleteTaskService,
final IRetrieveAllTasksService retrieveAllTasksService
final IRetrieveAllTasksService retrieveAllTasksService,
final IRetrieveTaskByIdService retrieveTaskByIdService,
final IUpdateTaskService updateTaskService
) {
this.createTaskService = createTaskService;
this.deleteTaskService = deleteTaskService;
this.retrieveAllTasksService = retrieveAllTasksService;
this.retrieveTaskByIdService = null;
this.updateTaskService = null;
this.retrieveTaskByIdService = retrieveTaskByIdService;
this.updateTaskService = updateTaskService;
}

@GET
public Response show() {
// TODO: Rota que lista todas as tarefas

return DefaultResponse.ok().entity("Hello world");
return DefaultResponse.ok(retrieveAllTasksService.execute());
}

@GET
@Path("single/{taskId}")
public Response index(@PathParam("taskId") Long taskId) {
// TODO: A rota deve retornar somente a tarefa a qual o id corresponder

return DefaultResponse.ok().entity("Hello world");
return DefaultResponse.ok().entity(retrieveTaskByIdService.execute(taskId));
}

@POST
public Response create(TaskView task) {
// TODO: A rota deve receber title e description, sendo o `title` o título da tarefa e `description` uma descrição da tarefa.

return DefaultResponse.ok().entity("Hello world");
return DefaultResponse.ok().entity(createTaskService.execute(TaskDTO.create()
.setTitle(task.getTitle())
.setDescription(task.getDescription())));
}

@PUT
@Path("single/{taskId}")
public Response update(@PathParam("taskId") Long taskId, Task task) {
/*
TODO: A rota deve alterar apenas o title e description da tarefa
que possua o id igual ao id correspondente nos parâmetros da rota.
*/

return DefaultResponse.ok().entity("Hello world");
Task updatedTask = this.retrieveTaskByIdService.execute(taskId);
if(updatedTask != null) {
updatedTask.setTitle(task.getTitle());
updatedTask.setDescription(task.getDescription());
return DefaultResponse.ok().entity(this.updateTaskService.execute(updatedTask));
} else {
return DefaultResponse.notFound().statusCode(400);
}
}

@DELETE
@Path("single/{taskId}")
public Response delete(@PathParam("taskId") Long taskId) {
// TODO: A rota deve deletar a tarefa com o id correspondente nos parâmetros da rota

return DefaultResponse.ok().entity("Hello world");
this.deleteTaskService.execute(taskId);
return DefaultResponse.ok().entity("Deleted");
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package backend.challenge.modules.task.infra.http.controllers;

import backend.challenge.modules.task.dtos.TaskProgressDTO;
import backend.challenge.modules.task.infra.http.views.TaskProgressView;
import backend.challenge.modules.task.models.Task;
import backend.challenge.modules.task.services.*;
Expand All @@ -22,14 +23,7 @@ public TaskProgressController(final IUpdateTaskProgressService updateTaskProgres
@PUT
@Path("single/{taskId}")
public Response updateProgress(@PathParam("taskId") Long taskId, TaskProgressView taskProgressView) {
/*
TODO: A rota deve alterar apenas o progresso da tarefa que possua o id igual ao id correspondente
nos parâmetros da rota.
O `progress` pode ter o valor máximo de 100, e quando ele atingi o máximo,
o `status` deve ser alterado para `COMPLETE`
*/

return DefaultResponse.ok().entity("Hello world");
return DefaultResponse.ok().entity(updateTaskProgressService.execute(TaskProgressDTO.create().setId(taskId).setProgress(taskProgressView.getProgress())));
}

}
Original file line number Diff line number Diff line change
@@ -1,46 +1,59 @@
package backend.challenge.modules.task.repositories;

import backend.challenge.modules.task.dtos.TaskDTO;
import backend.challenge.modules.task.enums.TaskStatus;
import backend.challenge.modules.task.models.Task;

import javax.inject.Singleton;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.time.Instant;
import java.util.Date;

@Singleton
public class TaskRepository implements ITaskRepository {

private Map<Long, Task> tasks;
private Long currentId;

public TaskRepository() {
this.tasks = new HashMap<Long, Task>();
this.currentId = 1L;
}

@Override
public Task index(final Long taskId) {
// TODO: Criar método responsável por retornar tarefa por id

return null;
return this.tasks.get(taskId);
}

@Override
public List<Task> show() {
// TODO: Criar método responsável por retornar todas as tarefas

return null;
return this.tasks.values().stream().toList();
}

@Override
public Task create(final TaskDTO taskDTO) {
// TODO: Criar método responsável por criar uma tarefa

return null;
Task newTask = new Task();
newTask.setId(this.currentId);
newTask.setTitle(taskDTO.getTitle());
newTask.setDescription(taskDTO.getDescription());
newTask.setProgress(0);
newTask.setStatus(TaskStatus.PROGRESS);
newTask.setCreatedAt(Date.from(Instant.now()));
this.tasks.put(this.currentId, newTask);
this.currentId++;
return newTask;
}

@Override
public Task update(final Task task) {
// TODO: Criar método responsável por atualizar uma tarefa

return null;
public Task update(final Task task) {;
return this.tasks.replace(task.getId(), task);
}

@Override
public void delete(final Long taskId) {
// TODO: Criar método responsável por deletar tarefa por id

Task task = this.index(taskId);
this.tasks.remove(taskId, task);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@ public CreateTaskService(final ITaskRepository taskRepository) {

@Override
public Task execute(TaskDTO taskDTO) {
// TODO: Criar serviço responsável por criar uma tarefa

return null;
return this.taskRepository.create(taskDTO);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public DeleteTaskService(final ITaskRepository taskRepository) {

@Override
public void execute(Long taskId) {
// TODO: Criar serviço responsável por deletar a tarefa
this.taskRepository.delete(taskId);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@ public RetrieveAllTasksService(final ITaskRepository taskRepository) {

@Override
public List<Task> execute() {
// TODO: Criar serviço responsável por recuperar todas as tarefas

return null;
return this.taskRepository.show();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package backend.challenge.modules.task.services;

import backend.challenge.modules.task.models.Task;
import backend.challenge.modules.task.repositories.ITaskRepository;

import javax.inject.Inject;
import javax.inject.Singleton;


//There was no service applied for that METHOD
@Singleton
public class RetrieveTaskByIdService implements IRetrieveTaskByIdService {

private final ITaskRepository taskRepository;

@Inject
public RetrieveTaskByIdService(final ITaskRepository taskRepository) {
this.taskRepository = taskRepository;
}

@Override
public Task execute(Long taskId) {
return this.taskRepository.index(taskId);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package backend.challenge.modules.task.services;

import javax.inject.Inject;

import backend.challenge.modules.task.dtos.TaskProgressDTO;
import backend.challenge.modules.task.enums.TaskStatus;
import backend.challenge.modules.task.models.Task;
import backend.challenge.modules.task.repositories.ITaskRepository;

public class UpdateTaskProgressService implements IUpdateTaskProgressService{

private final ITaskRepository taskRepository;
private final IRetrieveTaskByIdService retrieveTaskByIdService;

@Inject
public UpdateTaskProgressService(final ITaskRepository taskRepository) {
this.taskRepository = taskRepository;
this.retrieveTaskByIdService = new RetrieveTaskByIdService(taskRepository);
}

@Override
public Task execute(TaskProgressDTO taskProgressDTO) {
Task task = retrieveTaskByIdService.execute(taskProgressDTO.getId());
task.setProgress(taskProgressDTO.getProgress() > 100 ? 100 : taskProgressDTO.getProgress());
if(task.getProgress() >= 100) {
task.setStatus(TaskStatus.COMPLETE);
}
return taskRepository.update(task);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package backend.challenge.modules.task.services;

import javax.inject.Inject;

import backend.challenge.modules.task.models.Task;
import backend.challenge.modules.task.repositories.ITaskRepository;

public class UpdateTaskService implements IUpdateTaskService {

private final ITaskRepository taskRepository;

@Inject
public UpdateTaskService(final ITaskRepository taskRepository){
this.taskRepository = taskRepository;
}

@Override
public Task execute(Task task) {
return this.taskRepository.update(task);
}

}
2 changes: 0 additions & 2 deletions tests/Runner.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
package backend.challenge;

import kikaha.core.test.KikahaServerRunner;
import org.junit.Ignore;
import org.junit.Test;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package backend.challenge.modules.task.services;

import backend.challenge.modules.task.models.Task;
import backend.challenge.modules.task.dtos.TaskDTO;
import backend.challenge.modules.task.repositories.ITaskRepository;
import backend.challenge.modules.task.repositories.TaskRepository;
import kikaha.core.test.KikahaRunner;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith( KikahaRunner.class )
@RunWith(KikahaRunner.class)
public class CreateTaskServiceTest {

private ICreateTaskService createTaskService;
Expand All @@ -22,11 +24,10 @@ public void init() {

@Test
public void shouldBeAbleToCreateANewTask() {
// TODO: Para que esse teste passe, sua aplicação deve permitir que
// uma tarefa seja criado, e retorne um json com a tarefa criada.
TaskDTO taskDTO = TaskDTO.create().setTitle("TEST").setDescription("TEST DESC");
final Task task = createTaskService.execute(taskDTO);
Assert.assertEquals(taskDTO.getTitle(), task.getTitle());
Assert.assertEquals(taskDTO.getDescription(), task.getDescription());
}




}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package backend.challenge.modules.task.services;

import backend.challenge.modules.task.models.Task;
import backend.challenge.modules.task.dtos.TaskDTO;
import backend.challenge.modules.task.repositories.ITaskRepository;
import backend.challenge.modules.task.repositories.TaskRepository;
import kikaha.core.test.KikahaRunner;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
Expand All @@ -12,17 +16,24 @@
public class DeleteTaskServiceTest {

private IDeleteTaskService deleteTaskService;
private ICreateTaskService createTaskService;
private IRetrieveTaskByIdService retrieveTaskByIdService;

@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() {
// TODO: Para que esse teste passe, sua aplicação deve permitir que tarefas sejam deletadas por id.
TaskDTO taskDTO = TaskDTO.create().setTitle("TEST").setDescription("TEST");
Task task = createTaskService.execute(taskDTO);
Assert.assertNotNull(retrieveTaskByIdService.execute(task.getId()));
deleteTaskService.execute(task.getId());
Assert.assertNull(retrieveTaskByIdService.execute(task.getId()));
}


Expand Down
Loading