README

Nexoos Challenge Made with Ruby Made with RoR Build with Docker

Desafio para desenvolvedor rails júnior Nexoos

Tabela de Coneúdos

Visão Geral

Seu desafio será completar o desenvolvimento dessa API capaz de gerir empréstimos, salvando informações necessárias do cliente para podermos realizar o cálculo do valor da parcela (PMT), além de haver a possibilidade de leitura desses dados pelo cliente.

Deve-se:

  • Modelar o banco de dados parar ter os dados necessários do cálculo da PMT
  • Completar as rotas POST /loans e GET /loans/ID, alterando a API para escrever e retornar dados do banco de dados.
    • Na escrita, deve-se calcular o valor da parcela (PMT) e salvar no banco de dados.

Sobre a PMT:

O que é PMT em matemática financeira?

Cálculo da PMT:

http://ghiorzi.org/amortiza.htm

Post Request para Loans*:

curl --request POST http://localhost:3000/loans -d \
 value=1000& \
 taxa=0.2

Expected Response:

{
  "loan": {
    "id": 1
  }
}

Get Request para Loans:

curl --request GET http://localhost:3000/loans/1

Expected Response:

{
  "loan": {
    "id": 1, "pmt": 308
  }
}

Requisitos técnicos

  • Usar Ruby on Rails
  • É permitido o uso de frameworks e gems
  • Deve ser usado GIT para versionamento

Pontos extras para:

  • Documentação
  • Testes unitários e/ou de integração com Rspec

Envio:

Envie o seu código pronto através de um Pull Request para esse repositório

Começando

Essas instruções fornecerão uma cópia do projeto instalado e funcionando em sua máquina local para fins de desenvolvimento e teste.

Pré-Requisitos

  • Ruby 2.7.2
  • Rails +6.1.3.2
  • PostgreSQL 12.5

Caso prefira usar Docker:

  • Docker 20.10.0
  • Docker-compose 1.26.0

Instalação

Rodando com Docker e Docker-Compose

Na raíz do projeto, abra um terminal e execute as seguintes ações: 1 - Instalar as gems localmente

bundle install

2 - subindo os containers em segundo plano (-d):

docker-compose up -d

3.1 - para verificar se os containers subiram sem problema, executar o comando:

docker-compose logs

4 - criar a base de dados, executar migrations:

docker-compose run web rails db:create db:migrate

4.1 - caso queira executar os comandos acima e popular a base de dados:

docker-compose run web rails db:setup

4.2 - caso queira apagar as bases de dados, execute:

docker-compose run web rails db:drop

Rodando SEM Docker

Configurando o ambiente de Desenvolvimento:

1 - Configurando a base de dados:

2 - Instalando o Ruby e Rails:

Utilizando a aplicação

Por se tratar de uma aplicação back-end onde sua utilização é realizada através de chamada a uma API, sugerimos utlização do curl ou Postman para interagir com a mesma.

Por se tratar de um desafio simples, trataremos o uso da API apenas com o curl. Caso queira realizar os testes com o Postman, você pode encontrar mais informações de utilizá-lo nos links abaixo:

Primeiramente, inicie a aplicação, subindo os containers em segundo plano (-d):

docker-compose up -d

Fazendo chamadas a API com curl

Seguem abaixo alguns exemplos de como utilizar o curl para interagir com apliação:

Operações com Clientes

RECUPERANDO (GET) todos os Clientes com seus respectivos empréstimos
curl --request GET http://localhost:3000/clients

A aplicação possui paginação nos Clientes para melhoria de desempenho (estão limitadas a 15 por página), onde as informações sobre as mesmas são passadas via headers. Para acessá-las, use:

curl -v --request GET http://0.0.0.0:3000/clients
...
< Link: <http://0.0.0.0:3000/clients?page=3>; rel="last", <http://0.0.0.0:3000/clients?page=2>; rel="next"
< Per-Page: 15
< Total: 40
...
<
BODY_CONTENT

Para navegar entre as páginas, troque 'numero_da_pagina_aqui'.

curl --location --request GET '0.0.0.0:3000/clients?page=numero_da_pagina_aqui'
RECUPERANDO (GET) um Cliente específico atavrés de seu id
curl --request GET http://localhost:3000/clients/{id}
ATUALIZANDO (PATCH) as informações de um Cliente
curl --location --request PATCH '0.0.0.0:3000/clients/{id}' \
--header 'Content-Type: application/json' \
--data-raw ' { "client":
    {
    "name": "novo_nome_ do_cliente_aqui",
    "email": "novo_email_do_client_aqui",
    "nickname": "novo_apelido_do_cliente_aqui",
    }
}'
ADICIONANDO (POST) um novo Cliente
curl --location --request POST '0.0.0.0:3000/clients' \
--header 'Content-Type: application/json' \
--data-raw '{ "client":
    {
        "name": "nome_ do_cliente_aqui",
        "email": "email_do_cliente_aqui",
        "nickname": "apelido_do_cliente_aqui"
    }
}
ADICIONANDO (POST) um novo Cliente com um EMPRÉSTIMO
curl --location --request POST '0.0.0.0:3000/clients' \
--header 'Content-Type: application/json' \
--data-raw ' { "client":
    {
    "name": "nome_ do_cliente_aqui",
    "email": "email_do_cliente_aqui",
    "nickname": "apelido_do_cliente_aqui"
    "loans_attributes": [
        {
          "loan_amount": "xxx.xx",
          "interest_rate": "x",
          "period": x
        },
        {
          "loan_amount": "xx.xx",
          "interest_rate": "xx",
          "period": xx
        }
    ]
    }
}'

Apagando (DELETE) um determinado cliente através de seu id

curl --X DELETE http://localhost:3000/clients/{id}

Operações com Empréstimos (Loans)

RECUPERANDO (GET) todos os Empréstimos
curl --request GET http://localhost:3000/loans
RECUPERANDO (GET) um Empréstimo específico atavrés de seu id
curl --request GET http://localhost:3000/loans/{id}
ATUALIZANDO (PATCH) as informações de um Empréstimo
curl --location --request PATCH '0.0.0.0:3000/loans/{id}' \
--header 'Content-Type: application/json' \
--data-raw ' { "loan":
      {
        "loan_amount": "novo_valor_aqui",
        "interest_rate": "nova_taxa_aqui",
        "period": novo_periodo,
        "client_id": id_cliente
    }
 }'
ADICIONANDO (POST) um novo Empréstimo
curl --location --request POST '0.0.0.0:3000/loans/' \
--header 'Content-Type: application/json' \
--data-raw ' { "loan":
      {
        "loan_amount": "valor_desejado_aqui",
        "interest_rate": "taxa_desejada_aqui",
        "period": period_desejado_aqui,
        "client_id": id_cliente
    }
 }'

Apagando (DELETE) um determinado Empréstimo através de seu id

curl --X DELETE http://localhost:3000/loans/{id}

Executando bateria de testes

Com Docker e Docker-compose

Para rodar a bateria de tests completa:

docker-compose run web rspec --format documentation

Caso queira executar uma 'spec' de um model específico:

docker-compose run web rspec spec/models/nome_da_espec.rb

Caso queira executar uma 'spec' de um controller específico:

docker-compose run web rspec spec/controllers/nome_da_espec.rb

SEM Docker

Na raíz do projeto, executar os seguintes comandos:

Para executar toda a bateria de testes:

rspec

Caso queira executar uma 'spec' de um model específico:

rspec spec/models/nome_da_espec.rb

Caso queira executar uma 'spec' de um controller específico:

rspec spec/controllers/nome_da_espec.rb

Contribuir

Contato

Desafio feito por Rafael Viana Lopes Araújo

LinkedIn GitHub Gmail