Esse projeto simula uma plataforma que interliga compradores e lojas. Aqui existem rotas que atendem tanto a um front-end do cliente, quanto das lojas.
Para rodar o projeto em sua máquina, você precisará ter o mysql instalado na sua máquina ou rodar via Docker. Para rodar via Docker pode ser usado o comando:
docker container run --name container-mysql -e MYSQL_ROOT_PASSWORD=senha-mysql -d -p 3306:3306 mysql:8.0Agora basta clonar o repositório e rodar o comando:
se estiver usando npm:
npm installse tiver usando yarn:
yarn installDepois de instalar as dependências, crie e popule o banco de dados com o comando:
npm run migrationPara um novo cliente se cadastrar ele precisará informar suas informações pessoais e pode ou não cadastrar um endereço. A rota utilizada deve ser: POST /pedidos/user O Back-end recebe as informações no formato:
{
"user": {
"name": "Ana Maria",
"email": "anamaria@email.com",
"password": "123456",
"role": "client"
},
"address": {
"street": "Rua da Independência",
"number":"30",
"complement": "apt 102",
"neighborhood": "bairro do brasil",
"city": "Juiz de Fora",
"defaultAddress": true
}
}Ou no seguinte formato quando o cliente não for cadastrar um endereço ao se registrar:
{
"user": {
"name": "Ana Maria",
"email": "anamaria@email.com",
"password": "123456",
"role": "client"
}
}O cliente após o registro já estará logado se tudo estiver certo. Essa requisição retorna um token.
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImlkIjoiYmRjYjRkNDItNDQ0OS00NzBlLWJhODgtNGEzYjZjMjkwMzgzIiwibmFtZSI6IlrDqSBkYSBTaWx2YSIsImVtYWlsIjoiemVzaWx2YUBlbWFpbC5jb20iLCJyb2xlIjoiY2xpZW50In0sImlhdCI6MTY2NzE1MTAxNH0.-6nyo3UYqhUyH5dPfCaop6dCs8TvcoUq1BbCWmEPp-Y",
"expiresIn": 60
}Para um cliente conseguir fazer o login, primeiro ele dever ter sido registrado. A rota utilizada deve ser: POST /pedidos/login O Back-end recebe as informações no formato:
{
"email": "zesilva@email.com",
"password": "123456"
}Caso contrário ou a senha estiver errada, a mensagem de erro será retornada:
{
"message": "Invalid email or password"
}O cliente tem acesso a todos os produtos que estão na plataforma, mesmo que de diferentes lojas.
A rota utilizada deve ser: GET /pedidos/products
Não é necessário passar nenhuma informação. Nem mesmo ter feito o login, ou seja, não é necessario ter um accessToken. O retorno será:
[
{
"id": "53ee23dc-d502-456c-a93f-1e4b6646bd41",
"name": "caderno",
"quantity": 50,
"price": "18.80",
"photo": "http://localhost:3001/img/caderno.jpg"
},
{
"id": "5a9df949-3e28-4865-bd19-260b9cef4754",
"name": "lápis",
"quantity": 20,
"price": "0.50",
"photo": "http://localhost:3001/img/lapis-preto.webp"
},
{
"id": "ba18fc37-c7b2-48ac-82f1-9bf161d396f2",
"name": "borracha",
"quantity": 10,
"price": "1.20",
"photo": "http://localhost:3001/img/borracha.webp"
}
]Também é possível a busca de um produto pelo seu id:
A rota utilizada deve ser: GET /pedidos/products/:id
O retorno dessa requisição será semelhante a:
{
"id": "ba18fc37-c7b2-48ac-82f1-9bf161d396f2",
"name": "borracha",
"quantity": 10,
"price": "1.20",
"photo": "http://localhost:3001/img/borracha.webp"
}Para realizar um pedido o usuário precisa estar logado. Os pedidos apenas podem ser feitos pelos usuários com role client. Cada cliente pode ter quantos pedidos desejar.
A rota utilizada deve ser: POST /pedidos/order
Se um vendedor tentar criar uma nova venda, é gerado o seguinte erro:
{
"message": "Only users who has the role client, can add new orders"
}Se o cliente não possuir um endereço cadastrado, o ideal é que Front-end deixe que o usuário faça a requisição sem o cadastro de um endereço. Mas se mesmo assim nenhum endereço for informado, o seguinte erro deve ser gerado:
{
"message": "There is no user address register with the given userId"
}
O Back-end recebe as informações no formato, onde cada posição do array productsInfos é referente ao id de um produto e a quantidade desse produto no pedido. Se o usuário já possuir um endereço cadastrado, a chave address não precisa ser informada.
{
"order": {
"sellerId": "8ab2043b-fbca-45c0-9521-4687e9a7513f",
"productsInfos": [
{
"productId": "53ee23dc-d502-456c-a93f-1e4b6646bd41",
"quantity": 5
},
{
"productId": "5a9df949-3e28-4865-bd19-260b9cef4754",
"quantity": 2
}
]
},
"address": {
"street": "Rua da Independência",
"number":"30",
"complement": "apt 102",
"neighborhood": "bairro do brasil",
"city": "Juiz de Fora",
"defaultAddress": true
}
}Se tudo estiver correto, o retorno dessa requisição será semelhante a:
{
"id": "b376edd3-eef5-4e1e-b952-6f6a86b4f0c4",
"clientId": "bdcb4d42-4449-470e-ba88-4a3b6c290383",
"sellerId": "8ab2043b-fbca-45c0-9521-4687e9a7513f",
"productsInfos": [
{
"productId": "53ee23dc-d502-456c-a93f-1e4b6646bd41",
"quantity": 5
},
{
"productId": "5a9df949-3e28-4865-bd19-260b9cef4754",
"quantity": 2
}
]
}Cada usuário consegue buscar todos os seus pedidos independente do status que o pedido se encontra.
A rota utilizada deve ser: GET /pedidos/order
O retorno será semelhante a:
[
{
"id": "be8336c8-92fc-45ea-ae66-a90c2525fdc0",
"client_id": "079fc49e-3196-4c2d-ac70-5945bd2ede69",
"seller_id": "8ab2043b-fbca-45c0-9521-4687e9a7513f",
"date": "2022-11-05T23:55:54.000Z",
"status": "pendente"
},
{
"id": "e4d491c7-e8e1-471d-9798-cb96bb1ed841",
"client_id": "079fc49e-3196-4c2d-ac70-5945bd2ede69",
"seller_id": "8ab2043b-fbca-45c0-9521-4687e9a7513f",
"date": "2022-11-05T23:56:21.000Z",
"status": "pendente"
}
]Cada usuário consegue buscar qualquer um dos seus pedidos independente do status que o pedido se encontra.
A rota utilizada deve ser: GET /pedidos/order/:id
O retorno será semelhante a:
[
{
"id": "b376edd3-eef5-4e1e-b952-6f6a86b4f0c4",
"client_id": "bdcb4d42-4449-470e-ba88-4a3b6c290383",
"seller_id": "bdcb4d42-4449-470e-ba88-4a3b6c290353",
"date": "2022-11-05T22:07:51.000Z",
"status": "pendente"
}
]Um cliente só consegue buscar pedidos que ele tenha feito. Se ele buscar pelo id de um pedido que não foi ele quem fez, é gerado o seguinte erro:
{ "message": "You has no order with this id" }Os pedidos apenas podem ser atualizados o status. Os clientes apenas podem atualizar o status de para Entregue, independente de qual seja o status anterior.
A rota utilizada deve ser: PATCH /pedidos/order/:id
O back-end espera os dados assim:
{
"status": "Entregue"
}A saída da requisição será semelhante a:
{
"message": "Order status b376edd3-eef5-4e1e-b952-6f6a86b4f0c4 has been updated successfully"
}Se o cliente tentar mudar o status de um pedido para Em andamento, ele irá receber a seguinte mensagem de erro:
{
"message": "Only user who the role is 'seller' can to 'Em andamento'"
}Para um novo vendedor se cadastrar ele precisará informar suas informações pessoais, e pode ou não cadastrar um endereço. Importante: Se um vendedor ja tiver um cadastro como cliente, ele não poderá se cadastrar com o mesmo email. A rota utilizada deve ser: POST /pedidos/register O Back-end recebe as informações no formato:
{
"user": {
"name": "Maria do bairro",
"email": "mariadobairro@email.com",
"password": "123456",
"role": "seller"
},
"address": {
"street": "Rua da Independencia",
"number":"30",
"complement": "apt 102",
"neighborhood": "bairro do brasil",
"city": "Juiz de Fora",
"defaultAddress": true
}
}Ou no seguinte formato quando o cliente não for cadastrar um endereço ao se registrar:
{
"user": {
"name": "Maria do bairro",
"email": "mariadobairro@email.com",
"password": "123456",
"role": "seller"
}
}O vendedor após o registro já estará logado se tudo estiver certo. Essa requisição retorna um token.
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjE3YjFjYTY5LTllZGUtNGViNi1iMWE5LWQ4ODQxMDJlODUyZCIsIm5hbWUiOiJNYXJpYSBkbyBiYWlycm8iLCJlbWFpbCI6Im1hcmlhZG9iYWlycm9AZW1haWwuY29tIiwicm9sZSI6InNlbGxlciIsImlhdCI6MTY2NzE2NDQwMH0.J1jlqdN62eDewT0y_u1lAT9h7ZY20im-GXSFoE4Hk6Y",
"expiresIn": 60
}Apenas vendedores podem adicionar produtos. O vendedor precisará estar logado para adicionar um novo produto. Será necessario informar: nome do produto, quantidade em estoque e preço da unidade, e uma imagem do protuto (opcional).
A rota utilizada deverá ser: POST pedidos/products
O Back-end recebe as informações no formato:
{
"name":"Lápis de cor",
"quantity": "20",
"price": "40.50"
}O retornor serão as informações passadas com o id desse produto:
{
"id": "aa38228e-fb29-4dfc-809d-6c172535294c",
"sellerId": "bdcb4d42-4449-470e-ba88-4a3b6c290353",
"name": "Lápis de cor",
"quantity": 20,
"price": 40.5
}É possível a busca de um produto pelo seu id:
A rota utilizada deve ser: GET /pedidos/products/:id
O retorno dessa requisição será semelhante a:
{
"id": "aa38228e-fb29-4dfc-809d-6c172535294c",
"seller_id": "bdcb4d42-4449-470e-ba88-4a3b6c290353",
"name": "Lápis de cor",
"quantity": 20,
"price": "40.50",
"photo": null
}Apenas vendedores podem atualizar produtos. O vendedor precisará estar logado para atualizar um novo produto. Será necessario informar: nome do produto, quantidade em estoque e preço da unidade, e uma imagem do protuto (opcional).
A rota utilizada deverá ser: PUT pedidos/products/:id
Todos os campos podem ser atualizados exceto o sellerId. O back-end espera os dados assim:
{
"name":"Lápis de cor faber castel",
"quantity": "35",
"price": "50.50"
}O retorno irão conter os dados atualizados e o id do vendedor:
{
"id": "aa38228e-fb29-4dfc-809d-6c172535294c",
"sellerId": "bdcb4d42-4449-470e-ba88-4a3b6c290353",
"name": "Lápis de cor faber castel",
"quantity": 35,
"price": 50.5
}Apenas vendedores podem deletar produtos. E cada vendedor só pode deletar produtos que foram criados por ele mesmo.
A rota utilizada deverá ser: DELETE pedidos/products/:id
A resposta dessa rota quando a deleção acontece com sucesso é apenas o status 204, sem nenhum corpo.
Se um vendedor tentar deletar um produto que não é dele, será enviada a seguinte mensagem de erro:
{
"message": "You aren't the owner of this product. You can't delete this product"
}
Cada usuário consegue buscar todos os seus pedidos independente do status que o pedido se encontra.
A rota utilizada deve ser: GET /pedidos/order
O retorno será semelhante a:
[
{
"id": "b376edd3-eef5-4e1e-b952-6f6a86b4f0c4",
"client_id": "bdcb4d42-4449-470e-ba88-4a3b6c290383",
"seller_id": "bdcb4d42-4449-470e-ba88-4a3b6c290353",
"date": "2022-11-05T22:07:51.000Z",
"status": "pendente"
}
]Cada usuário consegue buscar qualquer um dos seus pedidos independente do status que o pedido se encontra.
A rota utilizada deve ser: GET /pedidos/order/:id
O retorno será semelhante a:
[
{
"id": "b376edd3-eef5-4e1e-b952-6f6a86b4f0c4",
"client_id": "bdcb4d42-4449-470e-ba88-4a3b6c290383",
"seller_id": "bdcb4d42-4449-470e-ba88-4a3b6c290353",
"date": "2022-11-05T22:07:51.000Z",
"status": "pendente"
}
]O vendedor não consegue buscar pedidos de outros vendedores. É gerado o seguinte erro:
{ "message": "You has no order with this id" }Os pedidos apenas podem ser atualizados o status. Os vendedores apenas podem atualizar o status de Pendente para Em andamento.
A rota utilizada deve ser: PATCH /pedidos/order/:id
O back-end espera os dados assim:
{
"status": "Em andamento"
}A saída da requisição será semelhante a:
{
"message": "Order status b376edd3-eef5-4e1e-b952-6f6a86b4f0c4 has been updated successfully"
}Se um vendedor tentar mudar o status de um pedido para Entregue, ele irá receber a seguinte mensagem de erro:
{
"message": "Only user who the role is 'client' can to 'Entregue'"
}