Desenvolvimento de uma API RESTful utilizando a arquitetura MSC (model-service-controller)!
A API construída é um sistema de gerenciamento de vendas no formato dropshipping em que será possível criar, visualizar, deletar e atualizar produtos e vendas. Foi utilizado o banco de dados MySQL para a gestão de dados.
Habilidades desenvolvidas
- Arquitetura de software: Model, Service e Controller.
- O endpoint para listar produtos deve ser acessível através do caminho (
/products
) e (/products/:id
); - Através do caminho
/products
, todos os produtos devem ser retornados; - Através do caminho
/products/:id
, apenas o produto com oid
presente na URL deve ser retornado; - O resultado da listagem deve ser ordenado de forma crescente pelo campo
id
;
Os seguintes pontos serão avaliados
-
[Será validado que é possível listar todos os produtos]
- Ao listar usuários com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200
:
[ { "id": 1, "name": "Martelo de Thor" }, { "id": 2, "name": "Traje de encolhimento" } /* ... */ ]
- Ao listar usuários com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que não é possível listar um produto que não existe]
- Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
404
:
{ "message": "Product not found" }
- Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que é possível listar um produto específico com sucesso]
- Ao listar um produto com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200
:
{ "id": 1, "name": "Martelo de Thor" }
- Ao listar um produto com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
- Seus arquivos de teste devem ficar no diretório
tests/unit
, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
model
devem fazer mock do banco de dados obrigatoriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em sua máquina. Para rodar seus teste utilizenpm run test:mocha
; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
-
[Será validado que a cobertura total das linhas e funções dos arquivos de CADA camada
models
,services
econtrollers
é maior ou igual a 5%. Ou seja, cada uma das camadas tem de ter, ao menos, 5% de cobertura de testes.] -
[Será validado que existe um mínimo de 2 funções em CADA camada
models
,services
econtrollers
.]
- O endpoint deve ser acessível através do caminho (
/products
); - Os produtos enviados devem ser salvos na tabela
products
do banco de dados; - O corpo da requisição deverá seguir o formato abaixo:
{
"name": "ProdutoX"
}
Os seguintes pontos serão avaliados
-
[Será validado que é possível cadastrar um produto com sucesso]
- Se o produto for criado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
201
:
{ "id": 4, "name": "ProdutoX" }
- Se o produto for criado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
- O endpoint de produtos deve ser acessível através do caminho (
/products
); - Lembre-se, o banco de dados não deve ser acessado nas validações iniciais do corpo da requisição;
Os seguintes pontos serão avaliados
-
[Será validado que não é possível realizar operações em um produto sem o campo
name
]- Se a requisição não tiver o campo
name
, o resultado retornado deverá ser conforme exibido abaixo, com um status http400
:
{ "message": "\"name\" is required" }
- Se a requisição não tiver o campo
-
[Será validado que não é possível realizar operações em um produto com o campo
name
menor que 5 caracteres]- Se a requisição não tiver
name
com pelo menos 5 caracteres, o resultado retornado deverá ser conforme exibido abaixo, com um status http422
{ "message": "\"name\" length must be at least 5 characters long" }
- Se a requisição não tiver
- Seus arquivos de teste devem ficar no diretório
tests/unit
, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
model
devem fazer mock do banco de dados obrigatoriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em sua máquina. Para rodar seus teste utilizenpm run test:mocha
; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas e funções dos arquivos de CADA camada
models
,services
econtrollers
é maior ou igual a 10%. Ou seja, cada uma das camadas tem de ter, ao menos, 10% de cobertura de testes.] - [Será validado que existe um mínimo de 3 funções em CADA camada
models
,services
econtrollers
.]
- O endpoint de vendas deve ser acessível através do caminho (
/sales
); - As vendas enviadas devem ser salvas nas tabelas
sales
esales_products
do banco de dados; - Deve ser possível cadastrar a venda de vários produtos através da uma mesma requisição;
- O corpo da requisição deverá seguir o formato abaixo:
[
{
"productId": 1,
"quantity": 1
},
{
"productId": 2,
"quantity": 5
}
]
Os seguintes pontos serão avaliados
-
[Será validado que não é possível realizar operações em uma venda sem o campo
productId
]- Se algum dos itens da requisição não tiver o campo
productId
, o resultado retornado deverá ser conforme exibido abaixo, com um status http400
:
{ "message": "\"productId\" is required" }
- Se algum dos itens da requisição não tiver o campo
-
[Será validado que não é possível realizar operações em uma venda sem o campo
quantity
]- Se algum dos itens da requisição não tiver o campo
quantity
, o resultado retornado deverá ser conforme exibido abaixo, com um status http400
:
{ "message": "\"quantity\" is required" }
- Se algum dos itens da requisição não tiver o campo
-
[Será validado que não é possível realizar operações em uma venda com o campo
quantity
menor ou igual a 0 (Zero)]- Se a requisição tiver algum item em que o campo
quantity
seja menor ou igual a zero, o resultado retornado deverá ser conforme exibido abaixo, com um status http422
{ "message": "\"quantity\" must be greater than or equal to 1" }
- Se a requisição tiver algum item em que o campo
-
[Será validado que não é possível realizar operações em uma venda com o campo
productId
inexistente, em uma requisição com um único item]- Se o campo
productId
do item da requisição não existir no banco de dados, o resultado retornado deverá ser conforme exibido abaixo, com um status http404
{ "message": "Product not found" }
- Se o campo
-
[Será validado que não é possível realizar operações em uma venda com o campo
productId
inexistente, em uma requisição com vários items]- Se a requisição tiver algum item cujo campo
productId
não existe no banco de dados, o resultado retornado deverá ser conforme exibido abaixo, com um status http404
{ "message": "Product not found" }
- Se a requisição tiver algum item cujo campo
-
[Será validado que é possível cadastrar uma venda com sucesso]
- Se a venda for criada com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
201
:
{ "id": 3, "itemsSold": [ { "productId": 1, "quantity": 1 }, { "productId": 2, "quantity": 5 } ] }
- Se a venda for criada com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
💬 Em caso de dúvidas, lembre-se de consultar a seção Dicas e Diagrama ER, Entidades e Scripts
- Seus arquivos de teste devem ficar no diretório
tests/unit
, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
model
devem fazer mock do banco de dados obrigatoriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em sua máquina. Para rodar seus teste utilizenpm run test:mocha
; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
-
[Será validado que a cobertura total das linhas e funções dos arquivos de CADA camada
models
,services
econtrollers
é maior ou igual a 15%. Ou seja, cada uma das camadas tem de ter, ao menos, 15% de cobertura de testes.] -
[Será validado que existe um mínimo de 4 funções em CADA camada
models
,services
econtrollers
.]
- O endpoint para listar vendas deve ser acessível através do caminho (
/sales
) e (/sales/:id
); - Através do caminho
/sales
, todas as vendas devem ser retornadas; - Através do caminho
/sales/:id
, apenas a venda com oid
presente na URL deve ser retornada; - o resultado deve ser ordenado de forma crescente pelo campo
saleId
, em caso de empate, ordenar também de forma crescente pelo campoproductId
;
Os seguintes pontos serão avaliados
-
[Será validado que é possível listar todas as vendas]
- Ao listar vendas com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200
:
[ { "saleId": 1, "date": "2021-09-09T04:54:29.000Z", "productId": 1, "quantity": 2 }, { "saleId": 1, "date": "2021-09-09T04:54:54.000Z", "productId": 2, "quantity": 2 } /* ... */ ]
- Ao listar vendas com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que não é possível listar uma venda que não existe]
- Se a venda for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
404
:
{ "message": "Sale not found" }
- Se a venda for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que é possível listar uma venda específica com sucesso]
- Ao listar uma venda com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200
:
[ { "date": "2021-09-09T04:54:29.000Z", "productId": 1, "quantity": 2 }, { "date": "2021-09-09T04:54:54.000Z", "productId": 2, "quantity": 2 } /* ... */ ]
- Ao listar uma venda com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
- Seus arquivos de teste devem ficar no diretório
tests/unit
, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
model
devem fazer mock do banco de dados obrigatoriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em sua máquina. Para rodar seus teste utilizenpm run test:mocha
; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas e funções dos arquivos de CADA camada
models
,services
econtrollers
é maior ou igual a 20%. Ou seja, cada uma das camadas tem de ter, ao menos, 20% de cobertura de testes.] - [Será validado que existe um mínimo de 6 funções em CADA camada
models
,services
econtrollers
.]
- O endpoint deve ser acessível através do caminho (
/products/:id
); - Apenas o produto com o
id
presente na URL deve ser atualizado; - O corpo da requisição deve ser validado igual no cadastro;
- O corpo da requisição deverá seguir o formato abaixo:
{
"name": "Martelo do Batman"
}
Os seguintes pontos serão avaliados
-
[Será validado que não é possível alterar um produto que não existe]
-
Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
404
:{ "message": "Product not found" }
-
-
[Será validado que é possível alterar um produto com sucesso]
- Se o produto for alterado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200
:
{ "id": 1, "name": "Martelo do Batman" }
- Se o produto for alterado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
- Seus arquivos de teste devem ficar no diretório
tests/unit
, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
model
devem fazer mock do banco de dados obrigatoriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em sua máquina. Para rodar seus teste utilizenpm run test:mocha
; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas e funções dos arquivos de CADA camada
models
,services
econtrollers
é maior ou igual a 25%. Ou seja, cada uma das camadas tem de ter, ao menos, 25% de cobertura de testes.] - [Será validado que existe um mínimo de 7 funções em CADA camada
models
,services
econtrollers
.]
- O endpoint deve ser acessível através do caminho (
/products/:id
); - Apenas o produto com o
id
presente na URL deve ser deletado;
Os seguintes pontos serão avaliados
-
[Será validado que não é possível deletar um produto que não existe]
-
Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
404
:{ "message": "Product not found" }
-
-
[Será validado que é possível deletar um produto com sucesso]
-
Se o produto for deletado com sucesso não deve ser retornada nenhuma resposta, apenas um status http
204
;
-
💬 Em caso de dúvidas, lembre-se de consultar a seção Diagrama ER, Entidades e Scripts
- Seus arquivos de teste devem ficar no diretório
tests/unit
, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
model
devem fazer mock do banco de dados obrigatoriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em sua máquina. Para rodar seus teste utilizenpm run test:mocha
; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas e funções dos arquivos de CADA camada
models
,services
econtrollers
é maior ou igual a 30%. Ou seja, cada uma das camadas tem de ter, ao menos, 30% de cobertura de testes.] - [Será validado que existe um mínimo de 8 funções em CADA camada
models
,services
econtrollers
.]
- O endpoint deve ser acessível através do caminho (
/sales/:id
); - Apenas a venda com o
id
presente na URL deve ser deletado;
Os seguintes pontos serão avaliados
-
[Será validado que não é possível deletar uma venda que não existe]
-
Se a venda for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
404
:{ "message": "Sale not found" }
-
-
[Será validado que é possível deletar uma venda com sucesso]
-
Se a venda for deletada com sucesso não deve ser retornada nenhuma resposta, apenas um status http
204
;
-
💬 Em caso de dúvidas, lembre-se de consultar a seção Diagrama ER, Entidades e Scripts
- Seus arquivos de teste devem ficar no diretório
tests/unit
, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
model
devem fazer mock do banco de dados obrigatoriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em sua máquina. Para rodar seus teste utilizenpm run test:mocha
; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas e funções dos arquivos de CADA camada
models
,services
econtrollers
é maior ou igual a 35%. Ou seja, cada uma das camadas tem de ter, ao menos, 35% de cobertura de testes.] - [Será validado que existe um mínimo de 9 funções em CADA camada
models
,services
econtrollers
.]
- O endpoint deve ser acessível através do caminho (
/sales/:id
); - Apenas a venda com o
id
presente na URL deve ser atualizada; - O corpo da requisição deve ser validado igual no cadastro;
- O corpo da requisição deverá seguir o formato abaixo:
[
{
"productId": 1,
"quantity": 10
},
{
"productId": 2,
"quantity": 50
}
]
Os seguintes pontos serão avaliados
-
[Será validado que não é possível alterar uma venda que não existe]
-
Se a venda for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http
404
:{ "message": "Sale not found" }
-
-
[Será validado que é possível alterar uma venda com sucesso]
- Se a venda for alterada com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
200
:
"saleId": 1, "itemsUpdated": [ { "productId": 1, "quantity":10 }, { "productId": 2, "quantity":50 } ]
- Se a venda for alterada com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http
- Seus arquivos de teste devem ficar no diretório
tests/unit
, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
model
devem fazer mock do banco de dados obrigatoriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em sua máquina. Para rodar seus teste utilizenpm run test:mocha
; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas e funções dos arquivos de CADA camada
models
,services
econtrollers
é maior ou igual a 40%. Ou seja, cada uma das camadas tem de ter, ao menos, 40% de cobertura de testes.] - [Será validado que existe um mínimo de 10 funções em CADA camada
models
,services
econtrollers
.]
-
O endpoint deve ser acessível através do URL
/products/search
; -
O endpoint deve ser capaz de trazer os produtos baseados no
q
do banco de dados, se ele existir; -
Sua aplicação deve ser capaz de retornar um array de produtos que contenham em seu nome termo passado na URL;
-
Sua aplicação deve ser capaz de retornar um array vazio caso nenhum nome satisfaça a busca;
-
O query params da requisição deverá seguir o formato abaixo:
http://localhost:PORT/products/search?q=Martelo
Os seguintes pontos serão avaliados
-
[Será validado que é possível buscar um produto pelo
name
]- Se a buscar for feita com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com um status http
200
:
// GET /products/search?q=Martelo [ { "id": 1, "name": "Martelo de Thor" } ]
- Se a buscar for feita com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com um status http
-
[Será validado que é possível buscar todos os produtos quando passa a busca vazia] - Se a buscar for vazia o resultado retornado deverá ser conforme exibido abaixo, com um status http
200
:// GET /products/search?q= [ { "id": 1, "name": "Martelo de Thor", }, { "id": 2, "name": "Traje de encolhimento", } /* ... */ ] ```
- Seus arquivos de teste devem ficar no diretório
tests/unit
, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
model
devem fazer mock do banco de dados obrigatoriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em sua máquina. Para rodar seus teste utilizenpm run test:mocha
; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas e funções dos arquivos de CADA camada
models
,services
econtrollers
é maior ou igual a 50%. Ou seja, cada uma das camadas tem de ter, ao menos, 50% de cobertura de testes.] - [Será validado que existe um mínimo de 11 funções em CADA camada
models
,services
econtrollers
.]
- Seus arquivos de teste devem ficar no diretório
tests/unit
, como é descrito em Para escrever seus próprios arquivos de teste; - Seus testes da
model
devem fazer mock do banco de dados obrigatoriamente; - Opcionalmente você pode parar o serviço do
MYSQL
em sua máquina. Para rodar seus teste utilizenpm run test:mocha
; - Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
- [Será validado que a cobertura total das linhas e funções dos arquivos de CADA camada
models
,services
econtrollers
é maior ou igual a 60%. Ou seja, cada uma das camadas tem de ter, ao menos, 60% de cobertura de testes.] - [Será validado que existe um mínimo de 11 funções em CADA camada
models
,services
econtrollers
.]