API de pagamento implementada em Go seguindo Clean Architecture, com suporte a idempotência usando Redis e logs estruturados com Zap.
Autor: Eduardo Rodrigo dos Santos
- ✅ Clean Architecture - Separação clara de responsabilidades
- ✅ Idempotência - Prevenção de pagamentos duplicados usando Redis
- ✅ Thread-Safe - Repositório em memória com RWMutex
- ✅ Logs Estruturados - Zap logger da Uber
- ✅ Validações Robustas - Moedas ISO 4217, UUID, etc.
- ✅ Erros Customizados - Erros tipados do domínio
- ✅ Testes Unitários - Cobertura de 83%+ no usecase
- ✅ Graceful Shutdown - Encerramento seguro da aplicação
payment-api-go/
├── cmd/
│ └── server/ # Ponto de entrada
├── internal/
│ ├── domain/ # Entidades e interfaces
│ ├── application/ # Camada de aplicação
│ │ └── usecase/ # Casos de uso (Execute pattern)
│ ├── infrastructure/ # Redis, Logger
│ └── handler/ # Handlers HTTP
└── exemplos/ # Scripts de exemplo
- Go 1.21+
- Redis (Docker recomendado)
# Clone o repositório
git clone <seu-repo>
cd payment-api-go
# Instale dependências
go mod download
# Inicie o Redis
docker-compose up -d
# Execute a aplicação
go run cmd/server/main.goA API estará disponível em http://localhost:8080
POST /api/v1/payments
Content-Type: application/json
X-Idempotency-Key: <chave-única>
{
"amount": 100.50,
"currency": "BRL",
"description": "Pagamento de teste"
}GET /api/v1/payments/{id}GET /healthA idempotência garante que requisições duplicadas retornem o mesmo resultado:
# Primeira requisição
curl -X POST http://localhost:8080/api/v1/payments \
-H "X-Idempotency-Key: minha-chave-123" \
-H "Content-Type: application/json" \
-d '{"amount": 100, "currency": "BRL", "description": "Teste"}'
# Segunda requisição (idêntica) - retorna o mesmo pagamento
curl -X POST http://localhost:8080/api/v1/payments \
-H "X-Idempotency-Key: minha-chave-123" \
-H "Content-Type: application/json" \
-d '{"amount": 100, "currency": "BRL", "description": "Teste"}'# Executar todos os testes
go test ./...
# Com coverage
go test ./... -cover
# Ver coverage detalhado
go test ./... -coverprofile=coverage.out
go tool cover -html=coverage.out- Go 1.21+ - Linguagem
- Chi Router - HTTP router
- Redis - Idempotência
- Zap - Logging estruturado
- Entidades:
Payment,PaymentRequest - Interfaces:
PaymentRepository,IdempotencyRepository - Erros customizados do domínio
PaymentUseCase- Lógica de negócio- Validações
- Gerenciamento de idempotência
- Redis para idempotência
- Logger estruturado
- Repositório em memória (thread-safe)
- Handlers HTTP
- Middlewares
- Tratamento de erros
- ✅ Clean Architecture
- ✅ Injeção de dependências
- ✅ Thread-safety com RWMutex
- ✅ Validação de entrada
- ✅ Erros tipados
- ✅ Logs estruturados
- ✅ Testes unitários
// Criar pagamento com idempotência
payment, err := useCase.CreatePayment(ctx, request, "idempotency-key-123")
if err != nil {
log.Error("Erro ao criar pagamento", zap.Error(err))
return
}
// Buscar pagamento
payment, err := useCase.GetPayment(ctx, paymentID)Eduardo Rodrigo dos Santos
Desenvolvido como projeto de estudo em Go, demonstrando:
- Clean Architecture
- Idempotência
- Thread-safety
- Boas práticas de desenvolvimento
💼 LinkedIn: Eduardo Rodrigo dos Santos