Proxy tech challenge for MELI
Como o guia de getting started da api do MELI já não possuia mais suporte para aplicações rodando em localhost, o proxy é api agnostico, então qualquer api rest deveria funcionar(proxy testado com duas apis httpbin.org e inshorts.deta.dev)
Criar um arquivo .env e copiar o conteudo de exemplo do env.example
Para rodar no docker:
docker-compose up -d --build
docker-compose up redis elasticsearch
e uma vez que os bancos ja estejam de pé basta rodar:
node index.js
Para facilitar o teste, o projeto conta com uma coleção http que pode ser rodada no insomnia sob o nome de Insomnia_collection
A aplicação possui 3 dominios distintos: Rules, Metrics e Proxy
Rules é responsável por criar e remover regras de acesso como o tipo(ip ou path), o numero maximo de requests e em quanto tempo em segundos as requests podem ser resetadas, por exemplo:
- Uma regra que permita que cada ip faça um maximo de 10 requisições por segundo
Proxy é responsavel por receber uma request e ver se determinado ip ou path atingiu o numero maximo de requests, se sim retorna um 400 informando o ocorrido, caso não adiciona em mais um o contador de requests no redis e adiciona uma metrica no elasticsearch e após isso chama a api e devolve seu resultado para o usuario
Metrics é responsavel por guardar e pesquisar o historico das requests, se a request atingiu seu maximo de requests na regra, quantas vezes determinado ip e path foram acessados etc
Tanto Rules, Proxy e Metrics podem ser configurados e acessados via api rest através dos endpoints listados na collection do insomnia
-
RULES
- [POST] Criar uma regra (http://localhost:3000/rules/)
{ "type": "path", "max_requests": 10, "expiration_every": 60 } - [DELETE] Remover uma regra (http://localhost:3000/rules/:type)
- [POST] Criar uma regra (http://localhost:3000/rules/)
-
METRICS
- [GET] Visualizar todas as metricas (http://localhost:3000/metrics) e para filtrar basta usar os seguintes query params:
- Para obter os paths que atingiram o maximo de requisições ?type=path&max_requests_reached=true
- Para obter os ips que atingiram o maximo de requisições ?type=ip&max_requests_reached=true
- Para agrupar ordenar as requests mais acessadas por path e ip ?type=path&count_requests=true
- [GET] Visualizar todas as metricas (http://localhost:3000/metrics) e para filtrar basta usar os seguintes query params:
-
PROXY
- [ANY] Chamar um endpoint da api configurada (http://localhost:3000/)
Para executar os testes unitarios basta rodar
npm run test
ou para obter o coverage
npm run coverage
