O objetivo deste mini projeto é fornecer uma api restfull para gerenciar o catálogo de produtos de um ecommerce.
A api de produtos conforme a documentação abaixo
-
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 api de produtos relacionados, em uma relação de n..n, 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 uma 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.
Requisitos:
- Ruby 3.0.1
- Rails 6.1.4
- Postgresql
Comandos:
git clone https://github.com/WallasFaria/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"]
}