Sistema de gestão financeira pessoal (SaaS) que permite aos usuários gerenciar transações (receitas e despesas), configurar orçamentos por categoria, visualizar relatórios de gastos e classificar transações por categorias.
- Java 17+
- Spring Boot 3.5.4
- Spring Data JPA
- Spring Security com JWT
- H2 Database (desenvolvimento) ou PostgreSQL (produção)
- Lombok
- MapStruct (DTOs)
- Spring Doc OpenAPI (Swagger/OpenAPI 3.0)
- Java 17+ instalado
- Maven 3.8+
- PostgreSQL 12+ (opcional, para produção)
cd financaaas-backend./mvnw clean compile./mvnw spring-boot:runOu executar diretamente:
./mvnw clean build
java -jar target/api-0.0.1-SNAPSHOT.jarA aplicação estará disponível em: http://localhost:8080
Após iniciar a aplicação, acesse a documentação interativa da API em:
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/v3/api-docs
- H2 Console (dev): http://localhost:8080/h2-console
src/main/java/br/com/financas/api/
├── config/ # Configurações (Security, WebConfig, OpenAPI)
├── controller/ # Controllers (REST endpoints)
├── dto/ # Data Transfer Objects
├── exception/ # Exceções customizadas e handlers
├── model/ # Entidades JPA
├── repository/ # Interfaces de repositório JPA
├── security/ # Componentes de segurança (JWT)
└── service/ # Lógica de negócio
A API utiliza JWT (JSON Web Tokens) para autenticação.
- Registrar usuário:
POST /api/auth/register - Fazer login:
POST /api/auth/login - Receber tokens: Access Token + Refresh Token
- Usar Access Token: Incluir no header
Authorization: Bearer <token> - Renovar token:
POST /api/auth/refresh
# Registrar
curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@example.com",
"password": "senha123456",
"name": "Nome Usuario"
}'
# Login
curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@example.com",
"password": "senha123456"
}'
# Usar o token
curl -X GET http://localhost:8080/api/transactions \
-H "Authorization: Bearer <seu_access_token>"| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/auth/register |
Registrar novo usuário |
| POST | /api/auth/login |
Login com email/password |
| POST | /api/auth/refresh |
Renovar access token |
| POST | /api/auth/logout |
Logout (remover token no cliente) |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/transactions |
Listar transações (paginado, com filtros) |
| GET | /api/transactions/{id} |
Obter transação específica |
| POST | /api/transactions |
Criar nova transação |
| PUT | /api/transactions/{id} |
Atualizar transação |
| DELETE | /api/transactions/{id} |
Deletar transação |
| GET | /api/transactions/stats/monthly |
Estatísticas do mês |
Filtros disponíveis:
type(INCOME/EXPENSE)category(nome da categoria)startDate(data inicial)endDate(data final)minAmount(valor mínimo)maxAmount(valor máximo)page(página, padrão 0)size(itens por página, padrão 10)sort(ordenação, padrão "date,desc")
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/budgets |
Listar orçamentos do usuário |
| GET | /api/budgets/{id} |
Obter orçamento específico |
| POST | /api/budgets |
Criar novo orçamento |
| PUT | /api/budgets/{id} |
Atualizar orçamento |
| DELETE | /api/budgets/{id} |
Deletar orçamento |
| GET | /api/budgets/status/{category} |
Status do orçamento |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/categories |
Listar categorias |
| GET | /api/categories/{id} |
Obter categoria específica |
| POST | /api/categories |
Criar categoria personalizada |
| PUT | /api/categories/{id} |
Atualizar categoria |
| DELETE | /api/categories/{id} |
Deletar categoria |
Filtro: type (INCOME/EXPENSE)
{
"id": "uuid",
"email": "user@example.com",
"password": "hashed_password",
"name": "Nome do Usuário",
"createdAt": "2026-02-20T10:30:00",
"updatedAt": "2026-02-20T10:30:00"
}{
"id": "uuid",
"description": "Descrição da transação",
"amount": 123.45,
"type": "INCOME",
"category": "Salário",
"date": "2026-02-20T10:30:00",
"recurring": false,
"createdAt": "2026-02-20T10:30:00",
"updatedAt": "2026-02-20T10:30:00"
}{
"id": "uuid",
"category": "Alimentação",
"limit": 1000.00,
"spent": 450.50,
"percentageUsed": 45.05,
"status": "WITHIN_BUDGET",
"createdAt": "2026-02-20T10:30:00"
}{
"id": "uuid",
"name": "Alimentação",
"type": "EXPENSE",
"color": "#FF5733",
"createdAt": "2026-02-20T10:30:00"
}- Banco: H2 em memória
- URL:
jdbc:h2:mem:testdb - Console H2: http://localhost:8080/h2-console
Criar arquivo application-prod.properties:
# Database
spring.datasource.url=jdbc:postgresql://localhost:5432/financaaas
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.username=financaaas_user
spring.datasource.password=seu_password_seguro
# JPA
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
# JWT
api.security.token.secret=sua_chave_secreta_super_segura_minimo_32_caracteres
api.security.token.expiration=86400000
api.security.token.refresh-expiration=604800000
# Logging
logging.level.root=WARN
logging.level.br.com.financas.api=INFOExecutar em produção:
./mvnw spring-boot:run -Dspring-boot.run.arguments="--spring.profiles.active=prod"- ✅ Hash de senha com BCrypt
- ✅ JWT com expiração configurável
- ✅ CORS habilitado para múltiplas origens
- ✅ Validação de entrada com Bean Validation
- ✅ Tratamento de exceções centralizado
- ✅ Autorização por usuário (acesso aos dados próprios)
- ✅ Spring Security configurado
- HTTPS: Use certificados SSL/TLS
- CORS: Restrinja aos domínios conhecidos
- Rate Limiting: Implemente limite de requisições
- Logging de segurança: Registre acessos não autorizados
- CSRF Protection: Para endpoints que usam formulários
- SQL Injection: Use sempre prepared statements (JPA faz isso por padrão)
- Variáveis de ambiente: Nunca commit secrets no código
- ✅ Amount >= 0
- ✅ Description não vazio
- ✅ Type deve ser INCOME ou EXPENSE
- ✅ Date não pode ser no futuro
- ✅ Email formato válido
- ✅ Senha mínimo 8 caracteres
- ✅ Usuário só acessa seus próprios dados
- ✅ Categoria única por usuário
- ✅ Orçamento único por usuário e categoria
Automaticamente criados nas entidades:
CREATE INDEX idx_user_id ON transactions(user_id);
CREATE INDEX idx_date ON transactions(date);
CREATE INDEX idx_category ON transactions(category);
CREATE INDEX idx_budget_user_id ON budgets(user_id);
CREATE INDEX idx_budget_category ON budgets(category);
CREATE INDEX idx_category_user_id ON categories(user_id);
CREATE UNIQUE INDEX idx_category_name_user ON categories(user_id, name);# 1. Registrar usuário
curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "joao@example.com",
"password": "senha123456",
"name": "João Silva"
}'
# Response: { "accessToken": "...", "refreshToken": "...", ... }
# 2. Copiar accessToken e usar nas próximas requisições
TOKEN="seu_token_aqui"
# 3. Criar categoria
curl -X POST http://localhost:8080/api/categories \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"name": "Alimentação",
"type": "EXPENSE",
"color": "#FF5733"
}'
# 4. Criar transação
curl -X POST http://localhost:8080/api/transactions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"description": "Compra no supermercado",
"amount": 250.50,
"type": "EXPENSE",
"category": "Alimentação",
"date": "2026-02-20T15:30:00",
"recurring": false
}'
# 5. Criar orçamento
curl -X POST http://localhost:8080/api/budgets \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{
"category": "Alimentação",
"limit": 1000.00
}'
# 6. Listar transações
curl -X GET 'http://localhost:8080/api/transactions' \
-H "Authorization: Bearer $TOKEN"
# 7. Obter estatísticas do mês
curl -X GET 'http://localhost:8080/api/transactions/stats/monthly?month=2026-02' \
-H "Authorization: Bearer $TOKEN"# Windows
set JAVA_HOME=C:\Program Files\Java\jdk-17
# Linux/Mac
export JAVA_HOME=/usr/libexec/java_home -v 17./mvnw spring-boot:run -Dspring-boot.run.arguments="--server.port=9090"Verifique se:
- O token está no formato correto:
Bearer <token> - O token não expirou
- A secret key está correta
- Implementar refresh token rotation
- Adicionar two-factor authentication (2FA)
- Implementar webhooks para eventos
- Adicionar suporte a múltiplas moedas
- Implementar análise preditiva de gastos
- Adicionar suporte a importação de extratos bancários
- Criar cache de categorias (Redis)
- Implementar soft deletes nas entidades
- Adicionar testes unitários e de integração
- Implementar documentação OpenAPI com exemplos
- Adicionar metrics com Micrometer/Prometheus
Para dúvidas ou problemas, consulte a documentação do Spring Boot ou crie uma issue no repositório.
Apache License 2.0
Desenvolvido com ❤️ usando Spring Boot