Sistema desenvolvido como parte do desafio técnico da PagueVeloz, simulando um ambiente de alta disponibilidade e processamento financeiro com múltiplos tipos de transações, controle de concorrência e consistência de dados.
- Visão Geral
- Arquitetura e Decisões Técnicas
- Camadas e Padrões Utilizados
- Resiliência e Confiabilidade
- Configuração e Execução
- Testes Unitários e de Integração
- Exemplos de Uso da API
- Documentação da API (Swagger)
- Considerações Finais
O Transaction Processor é responsável pelo gerenciamento de contas e transações financeiras, garantindo integridade, idempotência e isolamento transacional entre operações concorrentes.
- Criação de clientes e contas vinculadas
- Processamento de crédito, débito, reserva, captura, estorno e transferência
- Controle de saldo disponível, saldo reservado e limite de crédito
- Garantia de idempotência via
reference_id - Persistência e consistência transacional via Unit of Work
- Polly para políticas de retry e resiliência em acesso a banco de dados
O projeto segue uma arquitetura em Clean Architecture, dividindo claramente responsabilidades entre domínio, aplicação e infraestrutura.
| Camada | Responsabilidade |
|---|---|
| Domain | Entidades, enums e regras de negócio puras (ex: Account, Transaction) |
| Application | Casos de uso e orquestração de lógica de aplicação (ex: Handlers Mediator) |
| Infrastructure | Acesso a banco (EF Core), persistência e configuração de serviços |
| API | Exposição dos endpoints HTTP, documentação Swagger/OpenAPI |
- .NET 9 — Base do projeto
- Entity Framework Core 9 (PostgreSQL) — ORM e controle de transações
- MediatR — Implementação de CQRS e desacoplamento entre comandos/handlers
- Polly — Resiliência e retry com backoff exponencial
- FluentAssertions + xUnit + Moq — Testes unitários e integração
- Swashbuckle (Swagger) — Documentação e teste interativo da API
Define as entidades principais:
ClientAccountTransaction
As entidades encapsulam validações e comportamentos, por exemplo:
Account.Debit(amount)— garante que saldo + crédito sejam suficientes.Account.Reserve(amount)— move valores do saldo disponível para o reservado.
Implementa os casos de uso via CQRS com MediatR:
CreateClientHandler— cadastra um novo cliente.CreateAccountHandler— cria uma conta para um cliente existente.CreateTransactionHandler— processa operações financeiras conforme regras de negócio.
Utiliza o Unit of Work para garantir atomicidade:
await _unitOfWork.BeginTransactionAsync();
await _accountRepository.UpdateAsync(account);
await _transactionRepository.AddAsync(transaction);
await _unitOfWork.CommitAsync();Responsável pela configuração do EF Core, mapeamento das entidades e repositórios concretos:
AccountRepositoryTransactionRepositoryClientRepositoryUnitOfWork
Inclui também a implementação de Polly via RetryPolicyFactory, com backoff exponencial:
.WaitAndRetryAsync(3, attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)))Todas as operações de banco utilizam Polly para repetição segura em caso de falhas transitórias.
dotnet builddotnet testdotnet run --project PagueVeloz.Apidocker-compose up --buildCenários cobertos:
- Criação de cliente e conta
- Operações de transação (
credit,debit,reserve,capture,transfer) - Validação de saldo e limite de crédito
- Garantia de idempotência (
ReferenceIdduplicado)
Executar:
dotnet testcurl -X POST http://localhost:5000/api/clients \
-H "Content-Type: application/json" \
-d '{"name": "Nome Cliente", "email": "nome.cliente@example.com"}'curl -X POST http://localhost:5000/api/accounts \
-H "Content-Type: application/json" \
-d '{"clientId": "CLI-001", "initialBalance": 0, "creditLimit": 50000}'curl -X POST http://localhost:5000/api/transactions \
-H "Content-Type: application/json" \
-d '{
"operation": "credit",
"accountId": "ACC-001",
"amount": 10000,
"currency": "BRL",
"referenceId": "TXN-001",
"metadata": { "description": "Depósito inicial" }
}'{
"transaction_id": "TXN-001-PROCESSED",
"status": "success",
"balance": 10000,
"reserved_balance": 0,
"available_balance": 10000,
"timestamp": "2025-07-07T20:05:00Z",
"error_message": null
}Após rodar a aplicação:
A documentação exibe todos os endpoints, schemas de requisição e resposta, e exemplos práticos.
O projeto foi desenvolvido com foco em:
- Isolamento transacional e integridade financeira
- Escalabilidade e concorrência segura
- Observabilidade e logging detalhado
- Testabilidade e cobertura ampla
- Publicação de eventos via fila (Kafka/RabbitMQ)
- Cache distribuído para leitura de contas
- Monitoramento via OpenTelemetry
- Autenticação e autorização via JWT