API RESTful completa para gerenciamento de tarefas (To-Do List), desenvolvida com Java e Spring Boot. A aplicação é multiusuário, segura e utiliza autenticação baseada em tokens JWT (JSON Web Token).
- Sobre o Projeto
- Funcionalidades
- Arquitetura e UML
- Tecnologias
- API Endpoints
- Pré-requisitos
- Configuração do Ambiente
- Executando com Docker (Recomendado)
- Executando Localmente
- Executando os Testes
- Roadmap do Projeto
- Licença
Este projeto é uma API RESTful robusta que fornece um backend completo para uma aplicação de lista de tarefas. O sistema foi projetado para ser seguro e escalável, permitindo que múltiplos usuários se cadastrem, façam login e gerenciem suas próprias listas de tarefas de forma isolada.
- Status: 🚀 Aplicação Finalizada e Funcional
- Objetivo Principal: Criar uma API segura, seguindo as melhores práticas de desenvolvimento com Spring Boot, incluindo autenticação, autorização e persistência de dados.
- ✅ Autenticação de Usuários: Sistema completo de registro e login com senhas criptografadas (BCrypt).
- 🔐 Segurança com JWT: Acesso aos endpoints protegido por JSON Web Tokens, garantindo que apenas usuários autenticados possam acessar seus dados.
- 🧍 Isolamento de Dados: Cada usuário tem acesso apenas às suas próprias tarefas. A API garante que um usuário não possa ver, alterar ou deletar as tarefas de outro.
- 📝 CRUD Completo de Tarefas: Operações de Criar, Ler, Atualizar e Deletar tarefas para cada usuário.
- 🐳 Containerização: Configuração completa com
DockerfileeDocker-compose.ymlpara facilitar a execução do ambiente (API + Banco de Dados) com um único comando. - ⚙️ Validação de Dados: Validação de entrada nos DTOs para garantir a integridade dos dados recebidos pela API.
A arquitetura segue o padrão de camadas comum em aplicações Spring Boot, promovendo a separação de responsabilidades e facilitando a manutenção.
classDiagram
direction LR
class UserController {
-UserService userService
-TokenService tokenService
-AuthenticationManager authenticationManager
+registerUser(CreateUserDTO): ResponseEntity
+loginUser(LoginUserDTO): ResponseEntity
}
class TaskController {
-TaskRepository taskRepository;
-UserRepository userRepository;
+getAllTasks(): ResponseEntity
+getTaskById(id): ResponseEntity
+createTask(CreateTaskDTO): ResponseEntity
+updateTask(id, UpdateTaskDTO): ResponseEntity
+deleteTask(id): ResponseEntity
}
class UserService {
-UserRepository userRepository;
-PasswordEncoder passwordEncoder;
+createUser(CreateUserDTO): User
}
class TaskService {
+getAllTasks(): List<TaskDTO>
+createTask(CreateTaskDTO): Task
+updateTask(id, UpdateTaskDTO): Task
+deleteTask(id): Boolean
}
class UserRepository {
<<Repository>>
}
class TaskRepository {
<<Repository>>
}
class SecurityFilter {
-TokenService tokenService;
-UserRepository userRepository;
+doFilterInternal(...)
-recoverToken(HttpServletRequest): String
}
class TokenService {
-String secret
+generateToken(User): String
+validateToken(String): String
}
UserController --> UserService
TaskController --> TaskService
UserService --> UserRepository
TaskService --> TaskRepository
TaskService --> UserRepository
SecurityFilter --> TokenService : "valida token"
SecurityFilter --> UserRepository : "busca usuário"
UserController --> TokenService : "gera token no login"
Fluxo de uma Requisição Segura:
- O cliente envia uma requisição para um endpoint protegido (ex:
/tasks) com um token JWT no cabeçalhoAuthorization. - O
SecurityFilterintercepta a requisição. - O
TokenServicevalida o token. - O
SecurityFilterbusca os dados do usuário noUserRepositorye o define noSecurityContextHolder. - A requisição chega ao
TaskController, que agora tem acesso ao usuário autenticado. - O
TaskServiceutiliza a identidade do usuário para executar a lógica de negócio (ex: buscar apenas as tarefas daquele usuário).
- Backend:
- Java 25
- Spring Boot 3
- Spring Security (para autenticação e autorização)
- Spring Data JPA (para persistência de dados)
- Banco de Dados:
- Autenticação:
- Build e Dependências:
- Containerização:
| Método | Endpoint | Protegido? | Descrição |
|---|---|---|---|
POST |
/users/register |
❌ | Registra um novo usuário. |
POST |
/users/login |
❌ | Autentica um usuário e retorna um token JWT. |
GET |
/tasks |
✅ | Lista todas as tarefas do usuário autenticado. |
GET |
/tasks/{id} |
✅ | Busca uma tarefa específica do usuário pelo ID. |
POST |
/tasks |
✅ | Cria uma nova tarefa para o usuário autenticado. |
PUT |
/tasks/{id} |
✅ | Atualiza uma tarefa existente do usuá rio. |
- Java (JDK) 25
- Docker e Docker Compose
- Maven (opcional, pois o projeto usa o Maven Wrapper)
- Git
O projeto utiliza um arquivo .env na raiz para configurar as variáveis de ambiente, incluindo as credenciais do banco
de dados e o segredo do JWT.
-
Clone o repositório:
git clone https://github.com/WillianSilva51/todo-list-api.git cd todo-list-api -
Crie o arquivo
.env: Na raiz do projeto, crie um arquivo chamado.enve adicione o seguinte conteúdo.POSTGRES_URL="jdbc:postgresql://localhost:5432/postgres" POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres123 POSTGRES_DB=postgres # Gere um segredo forte e aleatório para o token JWT # Exemplo de comando para gerar: openssl rand -base64 64 TOKEN=seu-segredo-super-secreto-aqui
A forma mais simples de rodar a aplicação e o banco de dados é com o Docker Compose.
1. Inicie os contêineres: Na raiz do projeto, execute o comando:
docker compose up --buildEste comando irá construir a imagem da API, baixar a imagem do PostgreSQL e iniciar ambos os serviços. A API estará
disponível em http://localhost:8080.
2. Para parar os contêineres:
Pressione CTRL + C no terminal onde o compose está rodando, ou execute em outro terminal:
docker compose downSe preferir rodar a aplicação diretamente na sua máquina (sem Docker), siga os passos:
-
Inicie um banco de dados PostgreSQL: Garanta que você tenha uma instância do PostgreSQL rodando em
localhost:5432e que as credenciais correspondam às do seu arquivo.env. -
Execute a aplicação com o Maven Wrapper: Na raiz do projeto, execute:
./mvnw spring-boot:run
A API estará disponível em
http://localhost:8080.
Para rodar os testes de integração e garantir que tudo está funcionando como esperado, use o comando:
./mvnw test- Estrutura inicial do projeto com Spring Boot.
- Definição das entidades
UsereTask. - Implementação do CRUD completo para tarefas.
- Adição do Spring Security e configuração de segurança.
- Implementação de registro de usuário com hashing de senha.
- Implementação de autenticação via JWT (
login). - Conexão das tarefas aos usuários e isolamento de dados.
- Adição de verificação de posse para
updateedelete. - Containerização com Docker e Docker Compose.
- Implementação do
GlobalExceptionHandlerpara tratamento centralizado de erros. - Escrita de testes unitários e de integração.
- Adicionar documentação da API com Swagger/OpenAPI.
Este projeto está licenciado sob a Licença MIT. Veja o arquivo LICENSE para mais detalhes.