REST API para controle financeiro pessoal. Permite gerenciar contas e transações financeiras com autenticação JWT, associando todos os recursos ao usuário autenticado e com atualização automática de saldo a cada movimentação registrada.
- Java 17
- Spring Boot 3
- Spring Security + JWT (JJWT)
- PostgreSQL
- H2 (banco em memória para testes)
- JUnit 5 + MockMvc (testes de integração)
- Java 17+
- PostgreSQL rodando localmente na porta
5432
1. Clone o repositório
git clone https://github.com/guimarobo/fintrack-api.git
cd fintrack-api2. Crie o banco de dados
CREATE DATABASE fintrack;3. Configure as credenciais
Edite o arquivo src/main/resources/application.properties:
spring.datasource.url=jdbc:postgresql://localhost:5432/fintrack
spring.datasource.username=seu_usuario
spring.datasource.password=sua_senha4. Configure o JWT secret
Por padrão, a aplicação já possui um secret para desenvolvimento. Para produção, defina a variável de ambiente:
export JWT_SECRET=suaChaveBase64ComPeloMenos32Bytes5. Execute a aplicação
mvn spring-boot:runA API estará disponível em http://localhost:8080.
As tabelas são criadas automaticamente pelo Hibernate na primeira execução.
A API utiliza Bearer Token (JWT) para autenticação stateless.
- Usuário faz registro via
POST /auth/register - Usuário faz login via
POST /auth/logine recebe um token JWT - Nas próximas requisições, o token deve ser enviado no header:
Authorization: Bearer {token} - O token é válido por 24 horas
- Rotas
/auth/**são públicas (registro e login) - Todas as demais rotas exigem token válido
- Requisições sem token ou com token inválido retornam
401 Unauthorized - Senhas são armazenadas com BCrypt
- O campo
passwordnunca é exposto nas respostas JSON
| Método | Rota | Descrição |
|---|---|---|
| POST | /auth/register |
Registra um novo usuário |
| POST | /auth/login |
Autentica e retorna o token JWT |
Registro - Body:
{
"name": "João",
"email": "joao@email.com",
"password": "senha123"
}Login - Body:
{
"email": "joao@email.com",
"password": "senha123"
}Login - Resposta:
{
"token": "eyJhbGciOiJIUzI1NiJ9..."
}| Método | Rota | Descrição |
|---|---|---|
| GET | /users/me |
Retorna dados do usuário autenticado |
| PUT | /users/me |
Atualiza dados do usuário autenticado |
| PATCH | /users/me |
Atualiza campos específicos (name, email, password) |
| DELETE | /users/me |
Remove a conta do usuário autenticado |
O usuário só tem acesso aos seus próprios dados. Não é possível visualizar ou modificar outros usuários.
| Método | Rota | Descrição |
|---|---|---|
| GET | /accounts |
Lista as contas do usuário autenticado |
| GET | /accounts/{id} |
Busca conta por ID (somente do próprio usuário) |
| POST | /accounts |
Cria uma conta vinculada ao usuário autenticado |
| PUT | /accounts/{id} |
Atualiza uma conta |
| PATCH | /accounts/{id} |
Atualiza campos específicos |
| DELETE | /accounts/{id} |
Remove uma conta |
| Método | Rota | Descrição |
|---|---|---|
| GET | /transactions |
Lista as transações do usuário autenticado |
| GET | /transactions/{id} |
Busca transação por ID (somente do próprio usuário) |
| POST | /transactions |
Registra uma transação |
| PUT | /transactions/{id} |
Atualiza uma transação |
| PATCH | /transactions/{id} |
Atualiza campos específicos |
| DELETE | /transactions/{id} |
Remove uma transação |
O saldo da conta é atualizado automaticamente ao criar, atualizar ou remover uma transação. Tipos de transação:
ENTRADA(soma ao saldo) eDESPESA(subtrai do saldo).
A API possui testes de integração automatizados cobrindo os cenários de autenticação.
Executar os testes:
mvn test| Teste | O que valida |
|---|---|
| Registro com sucesso | Retorna 201 |
| Registro com e-mail duplicado | Retorna 409 |
| Registro sem campos obrigatórios | Retorna 400 |
| Login com sucesso | Retorna 200 + token JWT |
| Login com senha errada | Retorna 401 |
| Login com e-mail inexistente | Retorna 401 |
| Acesso a rota protegida sem token | Retorna 401 |
| Acesso a rota protegida com token inválido | Retorna 401 |
| Acesso a rota protegida com token válido | Retorna 200 |
| Senha oculta na resposta JSON | Campo password ausente |
| Alteração de senha via PATCH | Nova senha funciona, antiga não |