Recebemos uma demanda para realizar a criação de uma API REST. Essa API será utilizada para organização do estoque de uma startup em processo de testes que pretende se transformar em uma rede de mercados autônomos (Smart Store). Hoje o mercado trabalha com apenas dois tipos de produtos: comida e limpeza.
Como iremos controlar o estoque do mercado, nossa aplicação deverá ter rotas para a criação, listagem, atualização e deleção de produtos.
Vamos colocar a mão na massa no código!
O repositório da entrega conta com o arquivo chamado market_workspace. Esse arquivo é um documento de design utilizado no insomnia.
Ele contém todas as rotas necessárias para que a aplicação esteja de acordo com as regras impostas.
Esse arquivo também será utilizado por instrutores e monitores na correção das entregas.
O workspace em questão possui duas páginas:
Página para Debug:
- pode ser utilizado a vontade e ter seus valores para criação, listagem, atualização ou deleção, alterados sem problemas.
Página para Testes:
- NUNCA ALTERE NENHUM TESTE OU ROTA DA PÁGINA DE TESTES;
- ATENÇÃO: sempre REINICIE o servidor a cada novo teste ou bateria de testes, que for executar;
Regras da entrega
A entrega deve seguir as seguintes regras ou será zerada:
O código deve estar em TypeScript.
Não deve ser utilizada nenhuma outra tecnologia além das apresentadas e utilizadas nessa sprint.
A organização de arquivos deve seguir o que foi visto previamente (app.ts, interfaces.ts, logics.ts, database.ts, middlewares.ts).
Uma constante market deve ser criada em seu arquivo database.ts.
Deverá ser um array vazio utilizado para simular o banco de dados.
Todas as funções e atributos devem ser nomeados de acordo com o solicitado.
Caso não esteja de acordo com o estabelecido, será descontado nota.
Interfaces da aplicação
Para a tipagem dos produtos deverá ser criada a seguinte interface:
Product representando os dados em comum entre os dois tipo de produtos;
Product
Atributos
id:
Tipo: number;
Representa o número de identificação único do produto;
Deve ser gerado automaticamente na criação do produto;
Deve ser sequencial. Exemplo: (1, 2, 3, ...)
Não deve se repetir.
name:
Tipo string;
Representa o nome do produto.
price:
Tipo: number;
Representa o preço do produto;
Será enviado na menor casa possível, ou seja, em centavos.
weight:
Tipo: number;
Representa o peso do produto;
Será enviado na menor casa possível, ou seja, em gramas.
section:
Tipo: "food" ou "cleaning";
Deverá ser uma string enviada no momento criação.
calories:
Tipo: number, null e undefined;
Representa as calorias do produto.
expirationDate:
Tipo: Date;
Esse atributo deverá ser gerado automaticamente, pela função de criação do produto;
Representa a data de expiração do produto;
O valor deverá ser de 365 dias a partir da data de criação do produto.
Endpoints da aplicação
Método
Endpoint
Responsabilidade
POST
/products
Criar e adicionar o produto ao mercado
GET
/products
Listar todos os produtos do mercado, sendo possível listar pela section
GET
/products/:id
Listar um produto específico através do seu id
PATCH
/products/:id
Atualizar os dados de um produto através do seu id
DELETE
/products/:id
Deletar o produto a partir do seu id
Middlewares da aplicação
Verificação de nome existente
Esse middleware deverá verificar se o name enviado pelo request.body já existe no banco.
Deverá ser utilizado nas rotas:
POST /products
PATCH /products/:id
Caso o produto já exista, deverá ser retornado um erro com status code 409 CONFLICT.
Resposta do servidor:
Formato Json
Status code:409 CONFLICT.
{
"message": "Product already registered."
}
Verificação se o id buscado existe
Esse middleware deverá verificar se o id enviado por route param existe de fato no banco;
Deverá ser criado apenas um middleware e utilizado nas rotas:
GET /products/:id
PATCH /products/:id
DELETE /products/:id
Caso o produto não exista deverá ser um erro com status code 404 NOT FOUND.
Caso seja enviado um id inexistente no banco, não deverá ser possível atualizar o produto. Deverá ser retornado um objeto contendo a seguinte chave:
message:
Tipo: string.
Deve ser uma mensagem informando que o produto não foi encontrado.
Exemplo de retorno:
O exemplo abaixo foi realizado na seguinte rota: /products/9999 informando um id inexistente.
Resposta do servidor:
Status code:404 NOT FOUND.
{
"message": "Product not found."
}
DELETE /products/:id
Deve ser possível deletar um produto pelo seu id.
Sucesso:
Não deve ser retornada nenhuma mensagem, apenas o status code 204 NO CONTENT.
Exemplo de retorno:
O exemplo abaixo foi realizado na seguinte rota: /products/1.
Resposta do servidor:
Status code:204 NO CONTENT.
Falha:
Caso seja enviado um id inexistente no banco, não deverá ser possível deletar o produto. Deverá ser retornado um objeto contendo a seguinte chave:
message:
Tipo: string.
Deve ser uma mensagem informando que o produto não foi encontrado.
Exemplo de retorno:
O exemplo abaixo foi realizado na seguinte rota: /products/9999 informando um id inexistente.
Resposta do servidor:
Status code:404 NOT FOUND.
{
"message": "Product not found."
}
Importante!
Não esqueça de adicionar team-m4-correcoes no seu repositório do github, para que seja possível realizarmos as correções.
Também não se esqueça de enviar o link do repositório na submissão da entrega.