Skip to content

eduardoSantosbh/payment-api-go-clean

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

💳 Payment API - Go

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

🎯 Características Principais

  • 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

🏗️ Arquitetura

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

🚀 Quick Start

Pré-requisitos

  • Go 1.21+
  • Redis (Docker recomendado)

Instalação

# 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.go

A API estará disponível em http://localhost:8080

📡 Endpoints

Criar Pagamento

POST /api/v1/payments
Content-Type: application/json
X-Idempotency-Key: <chave-única>

{
  "amount": 100.50,
  "currency": "BRL",
  "description": "Pagamento de teste"
}

Buscar Pagamento

GET /api/v1/payments/{id}

Health Check

GET /health

🔑 Idempotência

A 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"}'

🧪 Testes

# 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

🛠️ Tecnologias

  • Go 1.21+ - Linguagem
  • Chi Router - HTTP router
  • Redis - Idempotência
  • Zap - Logging estruturado

📊 Estrutura do Código

Domain Layer

  • Entidades: Payment, PaymentRequest
  • Interfaces: PaymentRepository, IdempotencyRepository
  • Erros customizados do domínio

Application Layer

  • PaymentUseCase - Lógica de negócio
  • Validações
  • Gerenciamento de idempotência

Infrastructure Layer

  • Redis para idempotência
  • Logger estruturado
  • Repositório em memória (thread-safe)

Handler Layer

  • Handlers HTTP
  • Middlewares
  • Tratamento de erros

🔒 Boas Práticas

  • ✅ Clean Architecture
  • ✅ Injeção de dependências
  • ✅ Thread-safety com RWMutex
  • ✅ Validação de entrada
  • ✅ Erros tipados
  • ✅ Logs estruturados
  • ✅ Testes unitários

📝 Exemplo de Uso

// 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)

👨‍💻 Autor

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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published