O objetivo deste mini projeto é implementar tarefas adicionais à api restfull deste repositório, que consiste em gerenciar o catálogo de produtos de um e-commerce.
-
Adicionar paginação a api de produtos com o valor padrão de 20 itens por página, podendo ser alterado via parâmetros até o máximo de 100
-
Permitir ordenar por qualquer uma das colunas de forma crescente ou decrescente
-
Permitir filtrar por qualquer uma das colunas, podendo usar todas as comparações possíveis (contém, igual, diferente, maior, maior ou igual, menor...)
-
Criar endpoint de produtos relacionados, em uma relação de n..n com produto, onde um produto pode ter um ou mais produtos relacionados, sendo necessário validar que um produto não pode ser linkado a ele próprio. a api permitirá adicionar e remover relações de produtos
POST /products/:product_id/related_products
// request body { "related_product_id": 22 }
// response body, status: 201 { "id": 22, "name": "Product test", "price": "10.99" }
// response body, status: 404|422 { "errors": ["Mensagem de erro"] }
DELETE /products/:product_id/related_products/:related_product_id
// response body, status: 204 null
// response body, status: 404 { "errors": ["Mensagem de erro"] }
-
Adicionar produtos relacionados ao json do produto apenas no endpoint de detalhes do produto, ficando no formato abaixo:
// response body, status: 200 { "id": 1, "name": "Product test", "description": "Description of product test", "price": "10.99", "quantity": 50, "created_at": "2021-07-05T23:13:17.383Z", "created_at": "2021-07-05T23:13:17.383Z", "related_prooducts": [ { "id": 22, "name": "Product test", "price": "10.99" } ] }
-
Atualizar a documentação com as alterações nos endpoints existentes e os novos
OBS:
- Nas tarefas 2 e 3 pode ser usado uma gem para facilitar o trabalho
- Já existem specs para o código atual, o candidato deverá adaptalas as mudanças solicitadas e adicionar novas quando necessário.
A api de produtos conforme a documentação abaixo
Requisitos:
- Ruby 3.0.1
- Rails 6.1.4
- Postgresql
Comandos:
git clone https://github.com/Hendel-Tecnologia/teste_vaga_rails.git
cd teste_vaga_rails
bundle install
rails db:create db:migrate db:seed && RAILS_ENV=test rails db:migrate
Rodando os testes:
rspec -f doc
OBS: Após finalizado o teste, o candidato deverá subir o projeto em seu github e nos enviar o link
- Product
GET /products
// response body, status: 200
[
{
"id": 1,
"name": "Product test",
"description": "Description of product test",
"price": "10.99",
"quantity": 50,
"created_at": "2021-07-05T23:13:17.383Z",
"created_at": "2021-07-05T23:13:17.383Z"
}
]
GET /products/:id
// response body, status: 200
{
"id": 1,
"name": "Product test",
"description": "Description of product test",
"price": "10.99",
"quantity": 50,
"created_at": "2021-07-05T23:13:17.383Z",
"created_at": "2021-07-05T23:13:17.383Z"
}
// response body, status: 404
{
"errors": ["Couldn't find Product with 'id'=22"]
}
POST /products
// request body
{
"name": "Product test",
"description": "Description of product test",
"price": "10.99",
"quantity": 50,
}
// response body, status: 201
{
"id": 1,
"name": "Product test",
"description": "Description of product test",
"price": "10.99",
"quantity": 50,
"created_at": "2021-07-05T23:13:17.383Z",
"created_at": "2021-07-05T23:13:17.383Z"
}
// response body, status: 422
{
"errors": ["Name has already been taken"]
}
PUT/PATCH /products
// request body
{
"description": "NEW Description of product test",
}
// response body, status: 201
{
"id": 1,
"name": "Product test",
"description": "NEW Description of product test",
"price": "10.99",
"quantity": 50,
"created_at": "2021-07-05T23:13:17.383Z",
"created_at": "2021-07-05T23:13:17.383Z"
}
// response body, status: 422
{
"errors": ["Description can't be blank"]
}
DELETE /products/:id
// response body, status: 204
null
// response body, status: 404
{
"errors": ["Couldn't find Product with 'id'=22"]
}