Este projeto foi desenvolvido com o intuito de seguir o escopo descrito no teste da empresa Dental Office.
Esta aplicação tem finalidade de retornar via api um JSON com o valor do IMC, sua classificação e nível de obesidade. Para isso deve receber uma requisição HTTP POST no endpoint '/imc' com o valor dos parâmetros de altura e peso e um token JWT válido para autorização no header da requisição.
Como não foi requerido no escopo do projeto o login para criar o JWT token, não foi possível realmente decodificar o código JWT enviado e verificar se corresponde ao token do usuário correspondente.
Com isso, simulei a autenticação do JWT Token criando uma classe Ruby pura
JsonWebToken
onde verificava se o código enviado no header correspondia
ao token de validação denominado 'valid_token'.
Esta aplicacao foi desenvolvida com uma cobertura de testes de 100%. A imagem a seguir apresenta o resultado da análise de cobertura de testes realizado pela gem simplecov.
As configurações necessárias para executar a aplicação sem utilizar Docker sao:
ruby: "~> 3.1.2"
rails: "~> 7.0.4"
Primeiro, clone o repositório:
$ git clone git@github.com:thaisantero/imc-calculator.git
Se desejar utilizar o Docker para executar a aplicação siga as seguintes etapas:
- Faça download do Docker Desktop, caso não o tenha instalado em seu computador, a partir do link:
https://www.docker.com/products/docker-desktop/
- Execute o docker compose, que sobe o container da aplicação e executa o servidor, utilizando o comando:
$ docker compose up
Se preferir não utilizar o Docker terá que seguir as etapas:
- Instalar as gems em seu computador executando o comando:
$ bundle install
- Executar o servidor por meio do comando:
$ rails server
Esta aplicação possui um endpoint POST '/imc' o qual foi desenvolvido para receber um JSON via API com dois parâmetros ('height' e 'weight') e com o header com um JWT token para autorização. A partir disso, retorna um JSON com três parâmetros: 'imc', 'classification' e 'obesity'.
A seguir é explicado como o JSON deve ser enviado, quais os status HTTP possíveis e qual o formato e os parâmetros do JSON de resposta da requisição.
Para obter o IMC, sua classificação e nível de obesidade deve ser feita
uma requisição com o verbo POST
na seguinte URL:
https://localhost:3000/api/v1/imc
Para documentar a API de cálculo do IMC foi utilizado a gem 'rswag' que gera
uma documentação da API utilizando swagger e cria o endpoint /api-docs/
que
contém a documentação da API com todas as possíveis respostas
e exemplos. Além disso, é possível realizar requisições e visualizar as respostas.
A imagem abaixo apresenta a documentação da API desenvolvida com swagger.
Status 200
| A requisição foi bem sucedida.
Status 400
| Os valores dos parâmetros height
ou weight
são inválidos.
Status 401
| JWT Token enviado é inválido.
Para fazer uma requisição de POST com sucesso é necessário enviar os dados no seguinte formato:
{
"height": 1.70,
"weight": 76
}
Com o header no formato do exemplo a seguir:
headers: {"Authorization": "Bearer valid_token"}
Caso a requisição seja um sucesso, será retornado um JSON com os parâmetros obtidos
e o status http 200
, de acordo com o exemplo:
{
"imc": 26.3,
"classification": "Sobrepeso",
"obesity": "I"
}
Caso a requisição envie parâmetros inválidos, será retornada uma mensagem de erro em formato JSON
e o status http 400
:
{
"errors": "mensagens de erros de validação"
}
Se a requisição enviar um token JWT inválido, será retornada uma mensagem de erro em formato JSON
e o status http 401
:
{
"errors": "Token inválido"
}
Como não foi colocado como prioridade no escopo do projeto e, também, pelo tempo reduzido para desenvolver a aplicação, não desenvolvi a rota para login.
Com isso, uma feature interessante para evolução da aplicação no futuro seria a implantação de um endpoint para login que retornaria o JWT Token referente ao usuário e os dados do usuário seriam salvos no banco de dados.
Para que, assim, realmente seja realizada a autenticação do JWT Token
na rota POST '/imc'
.