Desafio de Projeto — Bootcamp Santander | DIO
API REST para gerenciamento de tarefas, desenvolvida com foco em Design Patterns e Clean Architecture.
Este projeto foi construído como entrega do desafio de Design Patterns do Bootcamp Santander na DIO. A proposta foi reproduzir e evoluir o projeto apresentado em aula, aplicando boas práticas de arquitetura e padrões de projeto em uma API REST completa.
A API permite criar, listar, buscar, atualizar e deletar tarefas (CRUD), com validação de dados, tratamento de exceções e documentação automática.
O projeto segue os princípios da Clean Architecture, separando o código em três camadas independentes:
┌──────────────────────────────────────┐
│ Infrastructure │ ← Controllers, Repository, DTOs HTTP
│ ┌──────────────────────────────┐ │
│ │ Application │ │ ← Use Cases, DTOs de entrada/saída
│ │ ┌──────────────────────┐ │ │
│ │ │ Domain │ │ │ ← Entidades, Value Objects, Interfaces
│ │ └──────────────────────┘ │ │
│ └──────────────────────────────┘ │
└──────────────────────────────────────┘
| Camada | Responsabilidade |
|---|---|
| Domain | Regras de negócio puras: Task, TaskId, TaskStatus, TaskRepository |
| Application | Casos de uso independentes (um por operação CRUD) |
| Infrastructure | Adaptadores: REST Controller, repositório in-memory, DTOs HTTP |
O domínio não depende de nenhum framework — pode ser reutilizado em qualquer contexto.
| Padrão | Onde foi aplicado |
|---|---|
| Repository | TaskRepository (interface) + InMemoryTaskRepository (implementação) |
| Use Case / Command | Cada operação CRUD é uma classe isolada (CreateTaskUseCase, etc.) |
| DTO (Data Transfer Object) | CreateTaskInput, TaskOutput, CreateTaskRequest, TaskResponse |
| Value Object | TaskId — encapsula o UUID com validação e igualdade por valor |
| Factory Method | TaskOutput.from(Task), TaskResponse.from(TaskOutput) |
| Tecnologia | Versão |
|---|---|
| Java | 25 |
| Spring Boot | 4.0.6 |
| Gradle | 9.5 |
| JUnit 5 | ✔ |
| Mockito | ✔ |
| Spring REST Docs | ✔ |
| Bean Validation (Jakarta) | ✔ |
| Método | Endpoint | Descrição |
|---|---|---|
POST |
/tasks |
Criar uma nova task |
GET |
/tasks |
Listar todas as tasks |
GET |
/tasks/{id} |
Buscar task por ID |
PATCH |
/tasks/{id} |
Atualizar task (parcial) |
DELETE |
/tasks/{id} |
Deletar task |
Criar task:
POST /tasks
{
"title": "Estudar Java",
"description": "Revisar Design Patterns"
}Resposta (201 Created):
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"title": "Estudar Java",
"description": "Revisar Design Patterns",
"status": "PENDING"
}Atualizar status:
PATCH /tasks/{id}
{
"status": "COMPLETED"
}src/main/java/com/murilocdias/taskmanager/
├── domain/
│ ├── Task.java # Entidade principal
│ ├── TaskId.java # Value Object (UUID)
│ ├── TaskStatus.java # Enum: PENDING, IN_PROGRESS, COMPLETED
│ ├── TaskRepository.java # Interface do repositório
│ └── TaskNotFoundException.java
├── application/
│ ├── CreateTaskUseCase.java
│ ├── GetTaskUseCase.java
│ ├── GetByIdTaskUseCase.java
│ ├── UpdateTaskUseCase.java
│ ├── DeleteTaskUseCase.java
│ ├── input/ # DTOs de entrada
│ └── output/ # DTOs de saída
└── infrastructure/
├── http/
│ ├── TaskController.java
│ ├── GlobalExceptionHandler.java
│ ├── request/ # DTOs de request HTTP
│ └── response/ # DTOs de response HTTP
└── repository/
└── InMemoryTaskRepository.java
O projeto possui 31 testes cobrindo todas as camadas:
| Arquivo | Tipo | Testes |
|---|---|---|
TaskControllerTest |
Integração (MockMvc + REST Docs) | 13 |
InMemoryTaskRepositoryTest |
Unitário | 7 |
CreateTaskUseCaseTest |
Unitário (Mockito) | 2 |
GetTaskUseCaseTest |
Unitário (Mockito) | 2 |
GetByIdTaskUseCaseTest |
Unitário (Mockito) | 2 |
UpdateTaskUseCaseTest |
Unitário (Mockito) | 2 |
DeleteTaskUseCaseTest |
Unitário (Mockito) | 2 |
TaskManagerApplicationTests |
Smoke test | 1 |
# Rodar testes
./gradlew testPré-requisitos: Java 25+
# Clonar o repositório
git clone https://github.com/MuriloDias03/design-patterns-java-dio.git
# Entrar no diretório
cd design-patterns-java-dio
# Rodar a aplicação
./gradlew bootRun
# A API estará disponível em http://localhost:8080./gradlew asciidoctor
# HTML gerado em: build/docs/asciidoc/index.htmlFeito com ☕ por Murilo C. Dias — Bootcamp Santander 2026 | DIO