Aplicação de controle de orçamento pessoal, permitindo o registro de receitas e despesas mensais, além de fornecer um balanço financeiro do usuário.
- Java 17
- Spring Boot
- Maven
- Postgres
- Docker
- JUnit (testes)
- Swagger/OpenAPI
Esse projeto foi projetado usando a arquitetura Hexagonal (Ports & Adapters), visando facilitar a extensão e manutenção do projeto a longo prazo. O domínio é isolado de frameworks e detalhes técnicos, promovendo testabilidade e evolução.
- Cadastro, atualização e remoção de receitas e despesas
- Consulta de lançamentos por mês e descrição
- Resumo mensal (balanço de receitas, despesas e saldo)
- Autenticação de usuários
- API documentada via Swagger
- Crie um arquivo
.env
na raiz do projeto com as variáveis de ambiente necessárias:ADMIN_DEFAULT_PASSWORD= ADMIN_DEFAULT_EMAIL= JWT_SECRET= POSTGRES_DB= POSTGRES_PASSWORD= POSTGRES_USER= SPRING_DATASOURCE_URL= SPRING_DATASOURCE_USERNAME= SPRING_DATASOURCE_PASSWORD=
Dica: Se estiver usando o IntelliJ, utilize o plugin EnvFile para carregar automaticamente as variáveis do arquivo
.env
ao rodar a aplicação. - Suba o banco de dados com Docker Compose:
docker-compose up -d
- Rode a aplicação pela IDE executando a classe
BudgetApplication.java
ou via terminal:./mvnw spring-boot:run
- As configurações de banco, JWT e outros parâmetros estão em
src/main/resources/application.yml
. - Para ambiente local, use o perfil padrão.
- Para produção, configure as variáveis de ambiente conforme necessário.
- Testes unitários e integrados estão em
src/test/java/
. - Para rodar todos os testes:
./mvnw test
- A documentação interativa da API está disponível em API Budget
src/
main/
java/
br/com/janadev/budget/
domain/ # Entidades, regras de negócio, ports
inbound/ # Controllers, DTOs
outbound/ # Adapters, repositórios, configs
test/
java/
br/com/janadev/budget/
unit/ # Testes unitários
integrated/ # Testes integrados
sequenceDiagram
participant User as Usuário
participant Controller as ExpenseController
participant UseCase as RegisterExpenseUseCase
participant Domain as Expense
participant Port as ExpenseDatabasePort
participant Adapter as ExpenseMySQLAdapter
User->>Controller: POST /expenses (dados)
Controller->>UseCase: register(expenseDTO)
UseCase->>Domain: valida/cria Expense
UseCase->>Port: register(expense)
Port->>Adapter: persiste no banco
Adapter-->>Port: retorna Expense salva
Port-->>UseCase: retorna Expense salva
UseCase-->>Controller: retorna ExpenseResponseDTO
Controller-->>User: 201 Created + dados
sequenceDiagram
participant User as Usuário
participant Controller as IncomeController
participant UseCase as RegisterIncomeUseCase
participant Domain as Income
participant Port as IncomeDatabasePort
participant Adapter as IncomeMySQLAdapter
User->>Controller: POST /incomes (dados)
Controller->>UseCase: register(incomeDTO)
UseCase->>Domain: valida/cria Income
UseCase->>Port: save(income)
Port->>Adapter: persiste no banco
Adapter-->>Port: retorna Income salva
Port-->>UseCase: retorna Income salva
UseCase-->>Controller: retorna IncomeResponseDTO
Controller-->>User: 201 Created + dados
sequenceDiagram
participant User as Usuário
participant Controller as SummaryController
participant UseCase as GetMonthlySummaryUseCase
participant ExpensePort as ExpenseDatabasePort
participant IncomePort as IncomeDatabasePort
participant Domain as Summary
User->>Controller: GET /summary?month=...&year=...
Controller->>UseCase: getMonthlySummary(userId, year, month)
UseCase->>IncomePort: sumTotalAmountByMonth(userId, year, month)
IncomePort-->>UseCase: totalIncomes
UseCase->>ExpensePort: sumTotalAmountByMonth(userId, year, month)
ExpensePort-->>UseCase: totalExpenses
UseCase->>ExpensePort: findExpensesByCategoryByMonth(userId, year, month)
ExpensePort-->>UseCase: despesas por categoria
UseCase->>Domain: monta Summary
UseCase-->>Controller: retorna SummaryDTO
Controller-->>User: 200 OK + resumo mensal
sequenceDiagram
participant User as Usuário
participant Controller as LoginController
participant UseCase as LoginUseCase
participant UserPort as UserOutboundPort
participant UserAdapter as UserAuthMySQLAdapter
participant TokenService as TokenService
User->>Controller: POST /login (credenciais)
Controller->>UseCase: login(email, senha)
UseCase->>UserPort: buscar usuário por email
UserPort->>UserAdapter: consulta no banco
UserAdapter-->>UserPort: retorna usuário
UserPort-->>UseCase: retorna usuário
UseCase->>UseCase: valida senha
alt Credenciais válidas
UseCase->>TokenService: gera JWT
TokenService-->>UseCase: retorna token
UseCase-->>Controller: retorna LoginResponseDTO (token)
Controller-->>User: 200 OK + token
else Credenciais inválidas
UseCase-->>Controller: lança exceção
Controller-->>User: 401 Unauthorized
end
- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b minha-feature
) - Commit suas alterações (
git commit -m 'feat: minha nova feature'
) - Faça push para a branch (
git push origin minha-feature
) - Abra um Pull Request
Siga o padrão de commits Conventional Commits.
Este projeto está licenciado sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.