Skip to content

lucas-moura1/api-rest-monetary-conversion-nodejs

 
 

Repository files navigation

Hurb Desafio Bravo

Construa uma API, que responda JSON, para conversão monetária. Ela deve ter uma moeda de lastro (USD) e fazer conversões entre diferentes moedas com cotações de verdade e atuais.

A API precisa converter entre as seguintes moedas:

  • USD
  • BRL
  • EUR
  • BTC
  • ETH

Outras moedas podem ser adicionadas conforme o uso.

Ex: USD para BRL, USD para BTC, ETH para BRL, etc...

A requisição deve receber como parâmetros: A moeda de origem, o valor a ser convertido e a moeda final.

Ex: ?from=BTC&to=EUR&amount=123.45

Construa também um endpoint para adicionar e remover moedas suportadas pela API, usando os verbos HTTP.

A API deve suportar conversão entre moedas fiduciárias, crypto e fictícias. Exemplo: BRL->HURB, HURB->ETH

"Moeda é o meio pelo qual são efetuadas as transações monetárias." (Wikipedia, 2021).

Sendo assim, é possível imaginar que novas moedas passem a existir ou deixem de existir, é possível também imaginar moedas fictícias como as de Dungeons & Dragons sendo utilizadas nestas transações, como por exemplo quanto vale uma Peça de Ouro (D&D) em Real ou quanto vale a GTA$ 1 em Real.

Vamos considerar a cotação da PSN onde GTA$ 1.250.000,00 custam R$ 83,50 claramente temos uma relação entre as moedas, logo é possível criar uma cotação. (Playstation Store, 2021).

Ref: Wikipedia [Site Institucional]. Disponível em: https://pt.wikipedia.org/wiki/Moeda. Acesso em: 28 abril 2021. Playstation Store [Loja Virtual]. Disponível em: https://store.playstation.com/pt-br/product/UP1004-CUSA00419_00-GTAVCASHPACK000D. Acesso em: 28 abril 2021.

Você pode usar qualquer linguagem de programação para o desafio. Abaixo a lista de linguagens que nós aqui do Hurb temos mais afinidade:

  • JavaScript (NodeJS)
  • Python
  • Go
  • Ruby
  • C++
  • PHP

Solução -> API REST em Node.JS

Para tal, foi desenvolvido uma API REST em Node.JS onde foi usado o Express como web framework, MongoDB como banco de dados NoSQL e Jest para os testes unitários e integrados. O motivo da utilização dessas tecnologias foram pela familiaridade do desenvolvedor com elas, pela vasta comunidade e pelo potencial que possuem para suportar 1000 requisições por segundo.

Então, a API recebe os dados fornecidos por um client, trata-os e fornece um JSON como resposta. O valor da moeda tida como base, o dólar, é atualizada a cada 3 minutos, mediante a requisição do usuário. E após esse tempo, o valor é atualizado no banco de dados caso a moeda não seja fiduciária ou fictícia.

Tecnologias utilizadas:

  • Node.Js com ECMAScript modules;
  • Express como framework web;
  • Mongoose para MongoDB;
  • Eslint e Prettier (JavaScript Standard como Style guide);
  • Jest para os testes unitários e integrados;
  • Winston para os logs;
  • Yup para as validações dos dados de entrada do client;
  • Axios para fazer requisições a API de Cotações de Moedas (AwesomeAPI);
  • Babel para auxiliar o Jest na hora de executar os testes por conta da utilização do ECMAScript modules.

Modelo de Endidade

Currency

code: <string>
name: <string>
inDollar: <float>
isFiatOrFictitious: <boolean>

Funcionalidades da API

  • Criação de moeda;
  • Listagem de todas as moedas;
  • Conversão de moeda desejada;
  • Deleção de moeda.

Rotas

Criação de moeda

Endpoint: /currency

Method: POST

Headers: {
    "Content-Type": "application/json"
}

Query: {}

Params: {}

Body: {
    "code": "USD",
	"name": "Dólar Americano",
	"inDollar": 1,
	"isFiatOrFictitious": false
}
}

Response: {
    status: 200,
    body: {
        "code": "USD",
        "name": "Dólar Americano",
        "inDollar": 1,
        "isFiatOrFictitious": false,
        "_id": <id_mongo>,
        "createdAt": <data_criação>,
        "updatedAt": <data_última_atualização>
    }
}

Listagem de todas as moedas

Endpoint: /currency

Method: GET

Headers: {}

Query: {}

Params: {}

Body: {}

Response: {
    status: 200,
    body: [
        {
            "code": "USD",
            "name": "Dólar Americano",
            "inDollar": 1,
            "isFiatOrFictitious": false,
            "_id": <id_mongo>,
            "createdAt": <data_criação>,
            "updatedAt": <data_última_atualização>
        }
    ]
}

Conversão de moeda desejada

Endpoint: /currency/conversion

Method: GET

Headers: {}

Query: {
    "from": "USD"
    "to": "BRL",
    "amount": 1
}

Params: {}

Body: {}

Response: {
    status: 200,
    body: [
        {
            "from": "USD"
            "to": "BRL",
            "convertedAmount": 5,60
        }
    ]
}

Deleção de moeda

Endpoint: /currency/:currencyCode

Method: DELETE

Headers: {}

Query: {}

Params: {
    "currencyCode": "USD"
}

Body: {}

Response: {
    status: 200,
    body: [
        {
            "deletedCount": 1
        }
    ]
}

Vulnerabilidade

Como a API é pública, o usuário consegue realizar todas as funções sem a necessidade de um token de acesso.

Execução do projeto

Para a execução do projeto é necessário ter instalado na máquina o Docker e docker-compose.

Comandos

Executar localmente

  • git clone <url_repositorio> : clonar o repositório;
  • docker-compose up: rodar a aplicação.

Para acessar a API diretamente é preciso acessar http://localhost:8888 + o endpoint.

Ex: http://localhost:8888/heath

Para executar os testes

Para rodar os testes unitários e integrados é preciso seguir os seguintes comandos abaixo:

  • Alterar a variável de ambiente chamado NODE_ENV dentro do arquivo docker-compose.yml de development para test;
  • docker-compose up para rodar a aplicação;
  • Abra uma nova aba no terminal e execute docker ps para obter id do container da API REST;
  • docker exec -it <container_id> bash para executar o bash e "entrar" no container da aplicação principal;
  • yarn test para executar os testes.

Performance

Como um dos requisitos foi que a API suportasse 1000 requisições por segundo, foi utilizado uma ferramente chamado Jmeter para a realização dos testes localmente.

Conforme a imagem abaixo, a API suportou as 1000 requisições com sucesso, sem nenhum erro.

StressTest

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 99.7%
  • Dockerfile 0.3%