API RESTful desenvolvida em .NET para conversão de moedas em tempo real, construída com Clean Architecture e Domain-Driven Design (DDD). Utiliza Use Cases para garantir o isolamento das regras de negócio e o desacoplamento total entre as camadas, facilitando manutenção, testes e escalabilidade.
A API suporta:
- 💱 Conversão de valores entre diferentes moedas usando taxas de câmbio do Banco central brasileiro.
- 📜 Histórico de conversões realizadas para consulta com cachê para performance.
- 🔧 Extensibilidade para futuras integrações com APIs de câmbio de outras instituições, agendamento de conversões e notificações.
Exchange.sln
├── Exchange.API/ # API REST, controllers, middleware e configuração
│ ├── Controllers/
│ ├── Middleware/
│ └── Program.cs
├── Exchange.Application/ # Casos de uso, interfaces e lógica de aplicação
│ ├── Interfaces/
├── Dtos/
│ └── UseCases/
├── Exchange.Domain/ # Entidades do domínio, interfaces e regras de negócio puras
│ ├── Entities/
│ └── Interfaces/
├── Exchange.Infrastructure/ # Implementações dos repositórios, serviços externos e persistência
│ ├── Repositories/
│ └── Services/
└── Exchange.Unit.Test/ # Implementações dos testes unitarios
├── Application/
└── API/
- .NET 8
- Clean Architecture
- Domain-Driven Design (DDD)
- ASP.NET Core Web API
- Memory cachê
- Injeção de Dependência
- Middlewares para tratamento global de erros
- 🔽 Clone o repositório
- 🛠️ Abra a solução
Exchange.slnno Visual Studio ou VS Code - 📦 Restaure as dependências e compile o projeto
▶️ Execute o projetoExchange.APINo VS Code/terminal, você pode iniciar com:dotnet run --project Exchange.API\Exchange.API.csproj --launch-profile Exchange.API- 🌐 Acesse a documentação Swagger em
https://localhost:{porta}/swagger(se configurado) - 💸 Use o endpoint
POST /api/currency/convertpara realizar conversões
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/currency/convert |
Converte um valor de BRL para outra moeda. |
| GET | /api/currency/history |
Retorna o histórico de conversões com filtros e paginação. |
| GET | /api/currency/history/{id} |
Retorna os detalhes de uma conversão específica. |
| GET | /api/currency/rate |
Consulta cotação de compra/venda por moeda e data. |
| GET | /api/currency/supported |
Lista as moedas suportadas pela API. |
| POST | /api/authentication/token |
Gera um token JWT para autenticação usando client_id e secret (via header). |
POST /api/authentication/token
Headers:
client_id: 3f29b6e7-1c4b-4f9a-b8b4-2f5e2f4d5c6a
secret: f8d9a7b6-2c3e-4f7a-8b1d-3e2f4a5b6c7d
Resposta esperada (resumo):
{
"success": true,
"data": {
"accessToken": "jwt-token",
"expiresAt": "2026-03-07T15:00:00Z"
},
"error": null,
}POST /api/currency/convert
Headers:
Authorization: Bearer {{access_token}}
Content-Type: application/json
Body:
{
"toCurrency": "EUR",
"amountBRL": 1000,
"dateQuotation": "2025-08-13",
"exchangeType": 1
}{
"success": true,
"data": {
"originalAmount": 1000,
"fromCurrency": "BRL",
"convertedAmount": 158.75,
"toCurrency": "EUR",
"exchangeRate": 6.30,
"exchangeType": 1,
"dateQuotation": "2025-08-13",
"provider": "BACEN"
},
"error": null,
}{
"success": false,
"data": null,
"error": {
"code": "VALIDATION_ERROR",
"message": "O valor deve ser maior que zero.",
"details": null
},
}💡 Observações:
Authorization: Bearer {{access_token}}→ o token deve ser obtido no endpoint de autenticação (/api/authentication/token).Content-Type: application/json→ necessário para que a API interprete corretamente o JSON.exchangeType→ pode ser usado para diferenciar tipos de câmbio (ex.: comercial, turismo).
Para testar a API, você pode usar os seguintes valores fixos para se autenticar:
- client_id:
3f29b6e7-1c4b-4f9a-b8b4-2f5e2f4d5c6a - secret:
f8d9a7b6-2c3e-4f7a-8b1d-3e2f4a5b6c7d
- 🚫 Valores inválidos (ex.: argumentos incorretos) resultam em resposta HTTP 400 Bad Request, com mensagens claras para facilitar o entendimento do problema.
- ❌ Erros inesperados ou internos são capturados globalmente por um middleware de tratamento de exceções, que garante o retorno de uma resposta HTTP 500 Internal Server Error padronizada e evita vazamento de detalhes sensíveis.
- 💡 Esse middleware centraliza o tratamento de erros, simplificando o código dos controllers e melhorando a manutenção da aplicação.
A aplicação foi implantada com sucesso no AWS ECS Fargate e está disponível através do ALB (Application Load Balancer).
Foi adicionada a pasta Infra/ na raiz do projeto com provisionamento via CloudFormation para ECS Fargate:
Infra/cloudformation/ecs-fargate.yaml: template principal de infraestrutura.Infra/cloudformation/parameters.dev.json: parâmetros de exemplo para ambiente dev.Infra/scripts/deploy.ps1: script para validar e aplicar stack.
Comando de deploy:
.\Infra\scripts\deploy.ps1 -StackName exchange-api-dev -Region us-east-1Workflow de deploy no GitHub Actions:
- Arquivo:
.github/workflows/deploy-ecs-cloudformation.yml - Execucao manual via
workflow_dispatch(nao executa automaticamente em push)
Você pode acessar o endpoint de autenticação pelo link abaixo:
http://alb-exchange-1526545477.us-east-1.elb.amazonaws.com/api/authentication/token
curl --location --request POST 'http://alb-exchange-1526545477.us-east-1.elb.amazonaws.com/api/authentication/token' \
--header 'client_id: 3f29b6e7-1c4b-4f9a-b8b4-2f5e2f4d5c6a' \
--header 'secret: f8d9a7b6-2c3e-4f7a-8b1d-3e2f4a5b6c7d'- 🔹 Build da imagem Docker localmente.
- 🔹 Push da imagem para o ECR (Elastic Container Registry).
- 🔹 Configuração da Task Definition no ECS.
- 🔹 Criação do Service com integração ao ALB.
- 🔹 Testes e validação do endpoint.
Agora a API está rodando na nuvem com alta disponibilidade e escalabilidade! 🎉
- ✅🔗 Integrar API oficial do Banco Central do Brasil (Bacen) para obter taxas de câmbio oficiais e atualizadas (DONE).
Fonte: Bacen - Taxas de Câmbio - Dados Abertos
Exemplo: Bacen - Exemplo de busca - 🔐✅ Implementar autenticação e autorização (DONE).
- 🧪✅ Adicionar testes automatizados (DONE).
- 💱✅ Evoluir rotas de câmbio com
rate,supportedehistory/{id}(DONE). - 📜✅ Adicionar filtros e paginação no histórico de conversões (DONE).
- 📊✅ Ampliar cobertura de testes unitários com relatório de cobertura (DONE).
- 🌐✅ Buscar moedas suportadas dinamicamente no Bacen (DONE).
- 🧩✅ Adicionar Result Pattern ao projeto (DONE).
- 📦✅ Padronizar response envelope REST (
success/data/error) (DONE). - ☁️🚀 Implantar na AWS
- ☁️🚀 Criar Infraestrutura como codigo com CloudFormation
- ⏰ Adicionar agendamento de conversões com notificação quando taxa atingir determinado valor.
- 🧪 Adicionar testes de integração
- = tarefa pendente.
- = tarefa concluída