- Cadastro de cliente.
- Login do cliente e autenticação [jwt] e rotas privadas.
- Ao fazer um depósito, o cliente recebe um e-mail. A implementação foi feita utilizando um sistema de filas com RabbitMQ e com envio de e-mail para o Mailtrap. Esta estratégia visa não perder nenhum e-mail, mesmo com volume alto.
A funcionalidade de depósito não persiste na base de dados, apenas dispara um evento de e-mail para o cliente.
- Ao consultar o valor do cripto no mercado bitcoin é feito um cache de 15 minutos utilizando redis, é renovado após o cache expirar, outra estratégia para resolver a alta demanda de requisições no endpoint.
- Typescript
- Express
- PostgreSQL
- Jest
- Typeorm
- Logs - Winston
- Migrations - Typeorm
- Validação usando DTOs
- Cache - Redis
- Filas - RabbitMQ
- Docker compose
A nivel de Arquitetura e Design de codigo tentei ser o mais simplista e claro possivel, Alguns detalhes como falta de algumas contrato entre classes foi devido a curto prazo. Utilizei SOLID, Factory e singleton (caracteristica que os modulos nodejs tem por padrão)
Estava começando a implementar os varios tipos de emails usando o design Template Method, é um padrão comportamental que define a estrutura do algoritmo, permite que as subclasses implementem etapas especificas do algoritmo.
Cobertura geral de testes unitarios:
- 52.02% Statements 167/321
- 52.63% Branches 30/57
- 50% Functions 45/90
- 51.91% Lines 163/314
Testes de integração e e2e ainda nao foram feitos ( este repositorio contem testes e como costumo contruí-los https://github.com/BillRizer/auction-api/tree/master/src)
Para ver os emails (fake) crie uma conta no https://mailtrap.io/ e adicione user e password no .env
# Renomeie o arquivo .env.sample para .env
mv .env.sample .env
docker-compose up --build -d
Agora verifique no docker, a API esta na porta 3000 (possivelmente http://0.0.0.0:3000 funcionara)
Ainda não implementei https porque não houve tempo
curl --request POST \
--url http://0.0.0.0:3000/register \
--header 'Content-Type: application/json' \
--data '{
"name": "John Smith",
"email": "email@email.com.br",
"password": "my-pass-123456"
}'
curl --request POST \
--url http://0.0.0.0:3000/login \
--header 'Content-Type: application/json' \
--data '{
"email": "email@email.com.br",
"password": "my-pass-123456"
}'
curl --request GET \
--url http://0.0.0.0:3000/currency-quote \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN_HERE' \
curl --request POST \
--url http://0.0.0.0:3000/deposit \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN_HERE' \
--header 'Content-Type: application/json' \
--data '{
"amount":2545
}'