API REST para registrar transações financeiras (entradas/saídas), listar por período e gerar resumo mensal.
- Go 1.22 ou superior instalado (Download)
- Docker (opcional, apenas se quiser usar PostgreSQL)
# Clone ou navegue até o diretório do projeto
cd finance-tracker
# Baixe as dependências
go mod download
# Ou organize as dependências automaticamente
go mod tidy# Rodar todos os testes
go test ./... -v
# Rodar testes sem verbose
go test ./...Linux/Mac:
STORAGE=memory HTTP_ADDR=:8080 go run ./cmd/apiWindows (PowerShell):
$env:STORAGE="memory"; $env:HTTP_ADDR=":8080"; go run ./cmd/apiOu usando Makefile:
make run1. Subir o PostgreSQL com Docker:
docker run --name finance-pg \
-e POSTGRES_USER=user \
-e POSTGRES_PASSWORD=pass \
-e POSTGRES_DB=financedb \
-p 5432:5432 \
-d postgres:152. Executar as migrations:
# Linux/Mac
docker exec -i finance-pg psql -U user -d financedb < migrations/001_init.sql
# Windows (PowerShell)
Get-Content migrations/001_init.sql | docker exec -i finance-pg psql -U user -d financedb3. Executar a aplicação:
Linux/Mac:
STORAGE=postgres \
DATABASE_URL="postgres://user:pass@localhost:5432/financedb?sslmode=disable" \
HTTP_ADDR=:8080 \
go run ./cmd/apiWindows (PowerShell):
$env:STORAGE="postgres"; $env:DATABASE_URL="postgres://user:pass@localhost:5432/financedb?sslmode=disable"; $env:HTTP_ADDR=":8080"; go run ./cmd/apiOu usando Makefile:
make run-pg# Health check
curl http://localhost:8080/health
# Deve retornar: {"status":"ok"}# Build da imagem
docker build -t finance-tracker:latest .
# ou
make docker-build
# Executar o container
docker run --rm -p 8080:8080 -e STORAGE=memory finance-tracker:latest
# ou
make docker-run| Variável | Descrição | Padrão | Obrigatório |
|---|---|---|---|
STORAGE |
Tipo de armazenamento: memory ou postgres |
memory |
Não |
HTTP_ADDR |
Endereço do servidor HTTP | :8080 |
Não |
DATABASE_URL |
Connection string do PostgreSQL | - | Sim (se STORAGE=postgres) |
make fmt # Formatar código
make vet # Análise estática
make tidy # Organizar dependências
make test # Rodar testes
make build # Compilar binário
make run # Executar em modo memory
make run-pg # Executar com PostgreSQLGET /healthPOST /transactionsGET /transactions?from=YYYY-MM-DD&to=YYYY-MM-DDDELETE /transactions/{id}GET /summary/monthly?year=YYYY&month=MM
# Health
curl -s localhost:8080/health
# Criar transação (income)
curl -s -X POST localhost:8080/transactions \
-H 'Content-Type: application/json' \
-d '{"type":"income","category":"salary","amount_cents":500000,"description":"Salário de outubro"}'
# Criar transação (expense)
curl -s -X POST localhost:8080/transactions \
-H 'Content-Type: application/json' \
-d '{"type":"expense","category":"rent","amount_cents":150000,"description":"Aluguel"}'
# Listar período
curl -s "localhost:8080/transactions?from=2025-10-01&to=2025-10-31"
# Resumo do mês
curl -s "localhost:8080/summary/monthly?year=2025&month=10"- Método: GET
- URL:
http://localhost:8080/health
- Método: POST
- URL:
http://localhost:8080/transactions - Headers:
Content-Type: application/json - Body:
{
"type": "income",
"category": "salary",
"amount_cents": 500000,
"description": "Salário de Outubro"
}- Método: POST
- URL:
http://localhost:8080/transactions - Headers:
Content-Type: application/json - Body:
{
"type": "expense",
"category": "rent",
"amount_cents": 150000,
"description": "Aluguel"
}- Método: GET
- URL:
http://localhost:8080/transactions?from=2025-10-01&to=2025-10-31
- Método: GET
- URL:
http://localhost:8080/summary/monthly?year=2025&month=10
- Método: DELETE
- URL:
http://localhost:8080/transactions/{id} - Substitua
{id}pelo UUID da transação
- Valores monetários: Sempre em centavos (ex:
500000= R$ 5.000,00) - Data da transação: Automaticamente definida como data/hora atual no servidor
- Storage Memory: Dados são perdidos ao reiniciar a aplicação
- Storage PostgreSQL: Dados são persistidos no banco de dados
finance-tracker/
├── cmd/
│ └── api/
│ └── main.go # Entry point da aplicação
├── internal/
│ ├── finance/
│ │ ├── model.go # Modelos de domínio
│ │ ├── service.go # Lógica de negócio
│ │ ├── repo_memory.go # Repositório em memória
│ │ ├── repo_postgres.go # Repositório PostgreSQL
│ │ └── repo_memory_test.go
│ └── http/
│ ├── handlers.go # HTTP handlers
│ └── handlers_test.go
├── migrations/
│ └── 001_init.sql # Schema do banco de dados
├── Dockerfile
├── Makefile
├── go.mod
└── README.md