rodrigoftw / desafio09-database-relations

Desafio 09 - Database Relations

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

GoStack

Desafio 09: Database Relations no Node.js

🚀 Sobre o desafio

Nesse desafio, foi criada uma nova aplicação para aprender novas coisas e treinar o que foi aprendido até agora no Node.js junto ao TypeScript, incluindo o uso de banco de dados com o TypeORM, e relacionamentos ManyToMany.

Essa é uma aplicação que deve permitir a criação de clientes, produtos e pedidos, onde o cliente pode gerar novos pedidos de compra de certos produtos, como um pequeno e-commerce.

Rotas da aplicação

Deve-se verificar os arquivos da pasta src e completar onde não possui código com o código para atingir os objetivos de cada rota.

  • POST /customers: A rota deve receber name e email dentro do corpo da requisição, sendo o name o nome do cliente a ser cadastrado. Ao cadastrar um novo cliente, ele deve ser armazenado dentro do banco de dados e deve ser retornado o cliente criado. Ao cadastrar no banco de dados, na tabela customers ele deverá possuir os campos name, email, created_at, updated_at.

Antes de criar um novo cliente, é verificado se já existe um cliente com o mesmo e-mail. Caso exista, é retornado um erro.

  • POST /products: Essa rota deve receber name, price e quantity dentro do corpo da requisição, sendo o name o nome do produto a ser cadastrado, price o valor unitário e quantity a quantidade existente em estoque do produto. Com esses dados deve ser criado no banco de dados um novo produto com os seguintes campos: name, price, quantity, created_at, updated_at.

Antes de criar um novo produto, é verificado se já existe um produto com o mesmo nome. Caso ele exista, é retornado um erro.

  • POST /orders/: Essa rota deve receber no corpo da requisição o customer_id e um array de products, contendo o id e a quantity que deseja-se adicionar a um novo pedido. Aqui deve-se cadastrar na tabela order um novo pedido, que estará relacionado ao customer_id informado, created_at e updated_at . Já na tabela orders_products, deve-se armazenar o product_id, order_id, price e quantity, created_at e updated_at.

Nessa funcionalidade, deve-se fazer um relacionamento de N:N entre produtos e pedidos, onde vários produtos podem estar em vários pedidos, com isso deve-se sempre armazenar o valor do produto no momento da compra e a quantidade pedida na tabela pivô com nome de orders_products. Essa tabela terá os campos id, order_id, product_id, quantity, price, created_at e updated_at.

A requisição deve enviar um JSON com o formato parecido com esse:

{
  "customer_id": "e26f0f2a-3ac5-4c21-bd22-671119adf4e9",
  "products": [
    {
      "id": "ce0516f3-63ae-4048-9a8a-8b6662281efe",
      "quantity": 5
    },
    {
      "id": "82612f2b-3f31-40c6-803d-c2a95ef35e7c",
      "quantity": 7
    }
  ]
}

Uma chamada a essa rota deve retornar os dados do cliente, produtos do pedido e id do pedido, num formato parecido com o seguinte:

{
  "id": "5cbc4aa2-b3dc-43f9-b121-44c1e416fa92",
  "created_at": "2020-05-11T07:09:48.767Z",
  "updated_at": "2020-05-11T07:09:48.767Z",
  "customer": {
    "id": "e26f0f2a-3ac5-4c21-bd22-671119adf4e9",
    "name": "Rocketseat",
    "email": "oi@rocketseat.com.br",
    "created_at": "2020-05-11T06:20:28.729Z",
    "updated_at": "2020-05-11T06:20:28.729Z"
  },
  "order_products": [
    {
      "product_id": "ce0516f3-63ae-4048-9a8a-8b6662281efe",
      "price": "1400.00",
      "quantity": 5,
      "order_id": "5cbc4aa2-b3dc-43f9-b121-44c1e416fa92",
      "id": "265b6cbd-3ab9-421c-b358-c2e2b5b3b542",
      "created_at": "2020-05-11T07:09:48.767Z",
      "updated_at": "2020-05-11T07:09:48.767Z"
    },
    {
      "product_id": "82612f2b-3f31-40c6-803d-c2a95ef35e7c",
      "price": "500.00",
      "quantity": 7,
      "order_id": "5cbc4aa2-b3dc-43f9-b121-44c1e416fa92",
      "id": "ae37bcd6-7be7-47b9-b277-afee35aab4e4",
      "created_at": "2020-05-11T07:09:48.767Z",
      "updated_at": "2020-05-11T07:09:48.767Z"
    }
  ]
}
  • GET /orders/:id: Essa rota deve retornar as informações de um pedido específico, com todas as informações que podem ser recuperadas através dos relacionamentos entre a tabela orders, customers e orders_products.

Links úteis

Específicação dos testes

Em cada teste, há uma breve descrição no que a aplicação deve cumprir para que o teste passe.

⚠️ Foi criado um banco de dados com o nome "gostack_desafio09_tests" para que todos os testes possam executar corretamente. ⚠️

Para esse desafio, existem os seguintes testes:

  • should be able to create a new customer: Para que esse teste passe, a aplicação deve permitir que um cliente seja criado, e retorne um json com o cliente criado.

  • should not be able to create a customer with one e-mail thats already registered: Para que esse teste passe, a aplicação deve retornar um erro quando houver a tentativa de cadastrar um cliente com um e-mail que já esteja cadastrado no banco de dados.

  • should be able to create a new product: Para que esse teste passe, a aplicação deve permitir que um produto seja criado, e retorne um json com o produto criado.

  • should not be able to create a duplicated product: Para que esse teste passe, a aplicação deve retornar um erro quando houver a tentativa de cadastrar um produto com um nome que já esteja cadastrado no banco de dados.

  • should be able to create a new order: Para que esse teste passe, a aplicação deve permitir que um pedido seja criado, e retorne um json com o todos os dados do pedido criado.

  • should not be able to create an order with a invalid customer: Para que esse teste passe, a aplicação não deve permitir a criação de um novo pedido com um cliente que não existe no banco de dados, retornando um erro.

  • should not be able to create an order with invalid products: Para que esse teste passe, a aplicação não deve permitir a criação de um novo pedido com um produtos que não existem no banco de dados, retornando um erro caso um ou mais dos produtos enviados não existam no banco de dados.

  • should not be able to create an order with products with insufficient quantities: Para que esse teste passe, a aplicação não deve permitir a criação de um novo pedido com um ou mais produtos que não possuam quantidade disponível, retornando um erro caso um ou mais dos produtos enviados não possuam a quantidade necessária.

  • should be able to subtract an product total quantity when it is ordered: Para que esse teste passe, a aplicação deve permitir que, quando um novo pedido for criado, seja alterada a quantidade total dos produtos baseado na quantidade pedida.

  • should be able to list one specific order: Para que esse teste passe, deve-se permitir que a rota orders/:id retorne um pedido, contendo todas as informações do pedido com o relacionamento de customer e order_products.

About

Desafio 09 - Database Relations


Languages

Language:TypeScript 83.1%Language:JavaScript 16.9%