Transfer API é uma API para gerenciar transferências entre contas bancárias. Esta aplicação foi desenvolvida utilizando a linguagem Go e a arquitetura Clean Architecture, que promove a separação de responsabilidades e um código mais modular e de fácil manutenção.
O projeto é organizado de acordo com a Clean Architecture, que se baseia nos seguintes princípios:
- Domínio: Contém as entidades principais do sistema e suas regras de negócio.
- Use Cases: Contém a lógica de aplicação, orquestrando o fluxo de dados entre as entidades e os adaptadores.
- Adapters: Contém a interface para o mundo externo, como controladores HTTP e gateways de dados.
- Frameworks & Drivers: Contém bibliotecas e frameworks específicos de implementação, como o framework Gin para roteamento HTTP e o logger Zap para logging estruturado.
Fonte: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
- Go: Linguagem de programação para construção de serviços escaláveis e de alto desempenho.
- Gin: Framework web para Go que simplifica a construção de APIs.
- Zap: Biblioteca de logging de alto desempenho desenvolvida pela Uber.
- Testify: Framework de teste que facilita a escrita de testes unitários com mocks e asserções.
Antes de executar a aplicação, certifique-se de ter o seguinte software instalado:
-
Clone o repositório para o seu diretório local:
git clone https://github.com/princeflaco/transfer-api-case-itau.git cd transfer-api-case-itau -
Instale as dependências
go mod download
-
(Opcional) Configure as variáveis de ambiente
export TRANSFER_MAX_AMOUNT=10000 export TRANSFER_WORKER_COUNT=5 export PORT=8080 export TIMEOUT=30 export APP_NAME="Transfer API" export LOGGING_LEVEL=debug
-
Execute a aplicação
go run main.go
A aplicação estará disponível em http://localhost:8080.
-
(Opcional) Configure as variáveis de ambiente: modifique o Dockerfile
-
Faça o build
- Certifique que está no diretório raiz do projeto
docker build -t transfer-api-case-itau . -
Execute
- Certifique que a porta externa está livre e a interna está correta.
docker run -p 8080:8080 transfer-api-case-itau
Este projeto implementa um sistema de transferências com um controle de concorrência utilizando mutex no serviço de transferência e os padrões de design worker e queue no caso de uso.
No TransferServiceImpl, um mutex é usado para garantir que as operações de transferência sejam realizadas de forma isolada. Isso garante que as atualizações de saldo das contas sejam executadas sem condições de corrida, mesmo com múltiplas transferências simultâneas.
O CreateTransferUseCase utiliza os padrões worker e queue para gerenciar a carga de trabalho:
- Queue: As transferências são enfileiradas em um canal para processamento assíncrono.
- Workers: Um conjunto de goroutines processa as transferências da fila, permitindo o processamento paralelo e eficiente das operações.
O projeto utiliza variáveis de ambiente para configuração. As variáveis incluem:
- TRANSFER_WORKER_COUNT: quantidade de workers que será utilizado para execução das transferências. (padrão é 5)
- TRANSFER_MAX_AMOUNT: valor máximo por transferência. (padrão é 10000)
- PORT: porta na qual a aplicação será executada. (padrão é 8080)
- TIMEOUT: tempo limite para requisições, em segundos. (padrão é 30 segundos)
- APP_NAME: nome da aplicação. (padrão é o nome do modulo, setado em go.mod)
- LOGGING_LEVEL: nível do Logger. (padrão é INFO)
Endpoints Disponíveis:
- POST /customers: cria um novo cliente e uma conta associada.
- GET /customers: lista todos os clientes.
- GET /customers/{accountId}: obtém um cliente pelo ID da conta.
- POST /transfers/{accountId}: realiza uma transferência de uma conta para outra.
- GET /transfers/{accountId}: obtém o histórico de transferências de uma conta.
A documentação da API está disponível via Swagger em:
- http://localhost:8080/swagger/index.html (após execução do app)
- Pode ser encontrada em ./docs
- Faça um fork do projeto.
- Crie uma branch para sua feature (git checkout -b feature/nova-feature).
- Faça um commit das suas mudanças (git commit -m 'Adiciona nova feature').
- Faça o push para a branch (git push origin feature/nova-feature).
- Abra um Pull Request.

