Desafio para desenvolvedor rails júnior Nexoos
- Visão Geral
- Começando
- Instalação
- Utilizando a aplicação
- Fazendo chamadas a API com curl
- Operações com Clientes
- RECUPERANDO (GET) todos os Clientes com seus respectivos empréstimos
- RECUPERANDO (GET) Clientes ordenados por ordem Alfabética do Nome
- RECUPERANDO (GET) Clientes ordenados por ordem pela quantidade de empréstimos
- RECUPERANDO (GET) um Cliente específico atavrés de seu id
- ATUALIZANDO (PATCH) as informações de um Cliente
- ADICIONANDO (POST) um novo Cliente
- ADICIONANDO (POST) um novo Cliente com um EMPRÉSTIMO
- Operações com Empréstimos (Loans)
- RECUPERANDO (GET) todos os Empréstimos
- RECUPERANDO (GET) todos os Empréstimos de um determinado Cliente
- RECUPERANDO (GET) todos os Empréstimos de um determinado Cliente ordenados pelo valor do Capital (Loan Amount)
- RECUPERANDO (GET) um Empréstiom específico atavrés de seu id
- ATUALIZANDO (PATCH) as informações de um Empréstimo
- ADICIONANDO (POST) um novo Empréstimo
- Executando bateria de testes
- Contribuir
- Contato
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
eGET /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
Essas instruções fornecerão uma cópia do projeto instalado e funcionando em sua máquina local para fins de desenvolvimento e teste.
- 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
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
Configurando o ambiente de Desenvolvimento:
- Install Ruby On Rails on Ubuntu 21.04 Hirsute Hippo (e outras versões), com rbenv ou rvm
- Install Ruby On Rails on macOS 11.0 Big Sur
- Install Ruby On Rails on Windows 10
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:
- https://idratherbewriting.com/learnapidoc/docapis_understand_curl.html
- https://medium.com/beadlist/using-curl-for-api-testing-463803304620
- https://linuxize.com/post/curl-rest-api/
Primeiramente, inicie a aplicação, subindo os containers em segundo plano (-d):
docker-compose up -d
Seguem abaixo alguns exemplos de como utilizar o curl para interagir com apliação:
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'
curl --request GET http://localhost:3000/clients/{id}
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",
}
}'
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"
}
}
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
}
]
}
}'
curl --X DELETE http://localhost:3000/clients/{id}
curl --request GET http://localhost:3000/loans
curl --request GET http://localhost:3000/loans/{id}
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
}
}'
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
}
}'
curl --X DELETE http://localhost:3000/loans/{id}
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
Na raíz do projeto, executar os seguintes comandos:
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
- Repositório original no Github: NexoosBR/nx_challenge
Desafio feito por Rafael Viana Lopes Araújo