API REST completa para uma plataforma de carteira digital, construída em Go seguindo os princípios da Clean Architecture.
- Cadastro com validação de CPF, e-mail e telefone
- Autenticação JWT com refresh tokens
- Bloqueio/desbloqueio de conta
- Consulta de saldo
- Crédito
- Débito
- Transferência entre usuários
- Histórico paginado
- Status (pending, confirmed, cancelled)
- Geração de boleto
- Pagamento via PIX
- QR Code
- Notificações de transação (console-based, pronto para integração com e-mail/SMS)
- Linguagem: Go 1.27.2
- Framework HTTP: Gin
- Banco de dados: PostgreSQL 15
- ORM: GORM
- Autenticação: JWT com refresh tokens
- Hash de senhas: bcrypt
- Documentação: Swagger/OpenAPI
- Containerização: Docker & Docker Compose
- Hot reload (dev): Air
- Migrations: compatível com golang-migrate
Wallet/
├── cmd/
│ └── api/
│ └── main.go # Entry point
├── internal/
│ ├── config/ # Configuração
│ ├── domain/ # Entidades de domínio
│ ├── handler/ # Handlers HTTP
│ ├── service/ # Regras de negócio
│ ├── repository/ # Camada de acesso a dados
│ ├── middleware/ # Auth, logging
│ └── utils/ # Helpers
├── pkg/
│ ├── jwt/ # Utilitários JWT
│ └── validator/ # Validadores (CPF, e-mail, telefone)
├── migrations/ # Migrations SQL
├── docs/ # Documentação Swagger (gerada)
├── scripts/ # Scripts utilitários, smoke tests, demo e Postman collection
├── test/ # Testes de integração
├── docker-compose.yml
├── docker-compose.dev.yml # Stack com hot reload
├── Dockerfile
├── Dockerfile.dev
├── Makefile
├── go.mod
├── .env.example
└── README.md
- Go 1.27.2 ou superior
- Docker e Docker Compose
- PostgreSQL 15 (se rodar localmente sem Docker)
- golang-migrate (opcional, para migrations manuais)
git clone <repository-url>
cd Walletcp .env.example .envEdite o .env conforme necessário.
docker compose up -dIsso vai subir:
- PostgreSQL na porta
5432 - API na porta
8080
- Base URL:
http://localhost:8080 - Swagger:
http://localhost:8080/swagger/index.html - Health check:
http://localhost:8080/health
go mod downloaddocker run --name wallet_postgres \
-e POSTGRES_USER=wallet_user \
-e POSTGRES_PASSWORD=wallet_pass \
-e POSTGRES_DB=wallet_db \
-p 5432:5432 \
-d postgres:15-alpinemake run
# ou
go run cmd/api/main.gomake docker-devmake swaggermake test # todos os testes
make coverage # gera coverage.html
make coverage-func # mostra coverage no terminalEstão em scripts/ (entre por lá pra ver detalhes). Resumo:
| Arquivo | Plataforma | O que faz |
|---|---|---|
setup.bat / setup.sh |
Windows / Linux+Mac | Checa Go, baixa deps, valida Docker |
test_api.ps1 / test_api.sh |
Windows / Linux+Mac | Smoke test end-to-end da API (register → login → balance → credit) |
reset-demo.ps1 |
Windows | Reseta banco, cria Alice e Bob, semeia chave PIX (TCC) |
postman_collection.json |
Postman / Insomnia / Bruno | Coleção completa dos endpoints — File → Import no Postman |
Endpoints protegidos exigem o header:
Authorization: Bearer <access_token>
POST /api/v1/auth/register— cadastra novo usuárioPOST /api/v1/auth/login— autenticaPOST /api/v1/auth/refresh— renova o access tokenGET /api/v1/auth/me— perfil do usuário (protected)
GET /api/v1/wallet/balance— consulta saldo (protected)POST /api/v1/wallet/credit— credita (protected)POST /api/v1/wallet/debit— debita (protected)
POST /api/v1/transactions/transfer— transferência (protected)GET /api/v1/transactions— histórico paginado (protected) — query params:limit,offset
POST /api/v1/boleto— gera boleto (protected) — body:{ "amount": 500.00 }POST /api/v1/pix— paga via PIX (protected) — body:{ "pix_key": "...", "amount": 100.00 }. Nota: requer que a chave PIX do destinatário já exista na tabelapix_keys; o CRUD de chaves PIX via API é trabalho futuro.
curl -X POST http://localhost:8080/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"name": "John Doe",
"cpf": "12345678909",
"email": "john@example.com",
"phone": "11987654321",
"password": "password123"
}'curl -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "john@example.com",
"password": "password123"
}'curl -X GET http://localhost:8080/api/v1/wallet/balance \
-H "Authorization: Bearer <access_token>"curl -X POST http://localhost:8080/api/v1/transactions/transfer \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"to_user_id": "uuid-here",
"amount": 100.50,
"description": "Payment for services"
}'make docker-up # sobe API + Postgres
make docker-down # derruba
make docker-logs # logs da API
make docker-rebuild # rebuild + restart
make docker-dev # stack com hot reload| Variável | Descrição | Default |
|---|---|---|
APP_ENV |
Ambiente | development |
APP_PORT |
Porta do servidor | 8080 |
DB_HOST |
Host do banco | localhost |
DB_PORT |
Porta do banco | 5432 |
DB_USER |
Usuário do banco | wallet_user |
DB_PASSWORD |
Senha do banco | wallet_pass |
DB_NAME |
Nome do banco | wallet_db |
DB_SSLMODE |
SSL mode | disable |
JWT_SECRET |
Segredo do JWT | your-secret-key |
JWT_ACCESS_EXPIRY |
Expiração do access token | 15m |
JWT_REFRESH_EXPIRY |
Expiração do refresh token | 7d |
BCRYPT_COST |
Custo do bcrypt | 10 |
Projeto segue Clean Architecture:
- Domain Layer — entidades e regras de negócio centrais
- Repository Layer — abstração de acesso a dados
- Service Layer — implementação das regras de negócio
- Handler Layer — recepção/resposta HTTP
- Middleware — autenticação, logging e demais cross-cutting concerns
- Repository Pattern
- Dependency Injection
- Programação por interfaces
- Separação de responsabilidades
- Hash de senha com bcrypt
- Autenticação JWT
- Rotação de refresh token
- Validação de CPF, e-mail e telefone
- Mecanismo de bloqueio de conta
- Prevenção de SQL injection (GORM)
- Integração com e-mail/SMS para notificações
- Rate limiting
- API key para webhooks
- Mecanismo de rollback de transações
- Audit logging
- Multi-currency
- Integração com KYC
- 2FA
MIT License
- Fork
- Crie sua branch (
git checkout -b feature/amazing-feature) - Commit (
git commit -m 'feat: amazing feature') - Push (
git push origin feature/amazing-feature) - Abra um Pull Request
Construído com Go e Clean Architecture.