Projeto criado visando colocar em prática os conhecimentos adquiridos em Back-end, onde crio uma API REST para cadastro/leitura de produtos/vendas composta de:
-
✅ Usuários:
- Criação;
- Remoção;
- Atualização;
- Leitura por Id;
- Leitura de todos os usuários cadastrados.
-
✅ Cadastro de produtos:
- Criação;
- Remoção;
- Atualização;
- Leitura por Id;
- Leitura de todos os produtos cadastrados.
-
✅ Cadastro de vendas:
- Criação;
- Remoção;
- Atualização;
- Leitura por Id;
- Leitura de todas as vendas cadastradas.
-
✅ Leitura de todos os erros internos possivelmente encontrados na execução da API;
- Status
- Licença
- Habilidades desenvolvidas
- Tecnologias utilizadas
- Organização e Estruturação do Projeto
- Pré-requisitos
- Orientações detalhadas de como utilizar
- Contribuição
- Agradecimentos
- Autor
Este projeto está em constante construção, pois a cada conhecimento adquirido e novas tecnologias aprendidas, as implementarei visando melhorar sua performance e escalabilidade.
Este projeto esta sobe a licença MIT.
- Entender os conceitos básicos de como o JavaScript funciona;
- Realizar operações assíncronas utilizando async/await;
- Realizar chamadas de funções de forma consciente;
- Detectar e solucionar problemas no código de forma mais objetiva;
- Entender o que é o HTTP, o que é uma API e o que os dois têm a ver com o Express;
- Escrever APIs utilizando Node e Express;
- Entender a estrutura de uma aplicação Express e como organizar seu código;
- Criar rotas e aplicar middlewares;
- Entender o funcionamento das camadas Model, Service, Controller;
- Estruturar uma aplicação em camadas;
- Delegar responsabilidades específicas para cada camada;
- Delegar responsabilidades específicas para cada parte do seu app;
- Melhorar manutenibilidade e reusabilidade do seu código;
- Entender e aplicar os padrões REST;
- Escrever assinaturas para APIs intuitivas e facilmente entendíveis;
- Autenticar rotas do Express, usando o token JWT;
- Gerar tokens a partir de informações como login e senha;
- Entender como utilizar o bcrypt para criptografar senhas de usuários;
- Entender e aplicar os conceitos de markdown na criação de um README estruturado.
- Node.js
- Express.js
- nodemon
- bcrypt
- body-parser
- dotenv
- eslint-config-trybe-backend
- http-status-codes
- jsonwebtoken
- mongodb
O projeto está organizado e estruturado da seguinte maneira:
├── .env
├── README.md
└── src
├── api
│ ├── app.js
│ └── server.js
├── controller
│ ├── documents
│ │ ├── errors
│ │ │ ├── index.js
│ │ │ └── searchAll.js
│ │ ├── login
│ │ │ ├── index.js
│ │ │ └── login.js
│ │ ├── products
│ │ │ ├── create.js
│ │ │ ├── index.js
│ │ │ ├── remove.js
│ │ │ ├── searchAll.js
│ │ │ ├── searchById.js
│ │ │ └── update.js
│ │ ├── sales
│ │ │ ├── create.js
│ │ │ ├── index.js
│ │ │ ├── remove.js
│ │ │ ├── searchAll.js
│ │ │ ├── searchById.js
│ │ │ └── update.js
│ │ └── users
│ │ ├── create.js
│ │ ├── index.js
│ │ ├── remove.js
│ │ ├── searchAll.js
│ │ ├── searchById.js
│ │ └── update.js
│ ├── middlewares
│ │ ├── auth
│ │ │ ├── admAuthorization.js
│ │ │ ├── authentication.js
│ │ │ └── userAuthorization.js
│ │ ├── error
│ │ │ └── index.js
│ │ ├── index.js
│ │ ├── validations
│ │ │ ├── validateEmail.js
│ │ │ ├── validateFirstName.js
│ │ │ ├── validateId.js
│ │ │ ├── validateLastName.js
│ │ │ ├── validatePassword.js
│ │ │ ├── validateProductCategory.js
│ │ │ ├── validateProductName.js
│ │ │ ├── validateProductPrice.js
│ │ │ ├── validateProductQuantity.js
│ │ │ ├── validateProductUnity.js
│ │ │ └── validateSale.js
│ │ └── wrapper
│ │ └── index.js
│ ├── routers
│ │ ├── errors.js
│ │ ├── login.js
│ │ ├── products.js
│ │ ├── root.js
│ │ ├── sales.js
│ │ └── users.js
│ └── statusAndMessage
│ └── index.js
├── model
│ ├── connection.js
│ ├── documents
│ │ ├── create.js
│ │ ├── remove.js
│ │ ├── searchAll.js
│ │ ├── searchByField.js
│ │ ├── searchById.js
│ │ └── update.js
│ └── index.js
└── service
├── auth
│ ├── getToken.js
│ ├── index.js
│ └── verifyToken.js
├── documents
│ ├── errors
│ │ ├── create.js
│ │ ├── index.js
│ │ └── searchAll.js
│ ├── login
│ │ ├── index.js
│ │ └── login.js
│ ├── products
│ │ ├── create.js
│ │ ├── index.js
│ │ ├── remove.js
│ │ ├── searchAll.js
│ │ ├── searchById.js
│ │ └── update.js
│ ├── sales
│ │ ├── create.js
│ │ ├── index.js
│ │ ├── remove.js
│ │ ├── searchAll.js
│ │ ├── searchById.js
│ │ └── update.js
│ └── users
│ ├── create.js
│ ├── index.js
│ ├── remove.js
│ ├── searchAll.js
│ ├── searchById.js
│ └── update.js
├── functions
│ ├── includeTotalAndAmountOnSale.js
│ ├── index.js
│ ├── inventoryUpdate.js
│ └── saleDataConvert.js
├── strings
│ └── index.js
└── validations
├── admVerify.js
├── emailVerify.js
├── idVerify.js
├── index.js
├── newEmailUpdateVerify.js
├── newProductNameUpdateVerify.js
├── numbersVerify.js
├── passwordVerify.js
├── productInventoryVerify.js
├── saleFieldVerify.js
├── saleNumbersVerify.js
├── saleStringsVerify.js
├── stringsVerify.js
└── unityVerify.js
Para rodar o projeto, você vai precisar instalar as seguintes ferramentas:
- Git;
- Node.js;
- Um editor para trabalhar com o código como VSCode ou outro de sua preferência;
- Um cliente de API REST como Postman, Insomnia ou outro de sua preferência;
-
Clone do Projeto e instale as dependências
# Clone este repositório $ git clone `https://github.com/WanderDinizVeloso/My-Store-API.git` # Acesse a pasta do projeto no terminal/cmd $ cd My-Store-API # Instale as dependências $ npm install
-
Crie um arquivo chamado
.env
na raiz do projeto com as seguintes configurações:- PORT: Porta que rodará localmente o projeto (ex. 3000);
- URL: URL do banco MongoDB (ex. mongodb://localhost:27017)
- SECRET: Segredo utilizado na autenticação.
- EXPIRES_IN: tempo de duração dos tokens gerados. (ex.
1d
) - ALGORITHM: algoritmo de criptografia do token. (ex.
HS256
) - EMAIL_ADM: email para acesso como administrador do sistema.
- PASSWORD_ADM: senha para acesso como administrador do sistema.
⚠️ ATENÇÃO⚠️
- Para mais detalhes sobre SECRET, EXPIRES_IN e ALGORITHM vide: jsonwebtoken
- Tanto o email quanto a senha de administrador deve atender aos mesmos requisitos de sua criação como usuário. vide: Users create.
-
Inicie o sistema:
# Inicie o sistema $ npm start ou $ npm run dev # para ambiente de desenvolvimento
-
Faça as requisições pelo Postman, Insomnia ou outro de sua preferência;
-
Crie uma branch e faça sua contribuição:
# Crie uma branch a partir da branch main $ git checkout -b nome-da-nova-branch # Adicione as mudanças desejadas com os devidos commits $ git add . # adiciona as mudanças ao stage do Git $ git commit -m 'informação do conteúdo do commit' # salvando as alterações de cada pequena alteração em um commit $ git push -u origin nome-da-nova-branch # adiciona a nova branch no repositório remoto do Projeto
-
Crie um novo
Pull Request
(PR):- Vá até a página de
Pull Requests
do repositório no GitHub - Clique no botão verde
"New pull request"
- Clique na caixa de seleção
"Compare"
e escolha a sua branch com atenção - Clique no botão verde
"Create pull request"
- Adicione uma descrição para o Pull Request
- Clique no botão verde
"Create pull request"
- Me marque para revisar.
:)
Wander
- Vá até a página de
// Fonte utilizada na criação do Pré-requisitos
: Trybe
- Descrição: Responsável pela criação, remoção, atualização e leitura de usuários da API.
⚠️ ATENÇÃO⚠️
Para a execução de
searchAll
esearchId
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Para a execução de
remove
eupdate
é necessário:
- Estar logado e;
- Ser o detentor da conta criada ou usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
-
Descrição: Responsável pela criação de usuários.
-
Body:
{ "firstName": " ", "lastName": " ", "email": " ", "password": " ", }
-
Retorno:
{ "message": "'user' created successfully.", "createdUser": { "_id": " ", "firstName": " ", "lastName": " ", "email": " ", "role": " " } }
Tradução da mensagem: "'usuário' criado com sucesso."
⚠️ ATENÇÃO: Campos"_id"
e"role"
são gerados automaticamente pelo sistema.⚠️ -
Campos obrigatórios:
-
firstName
:-
Tradução: nome
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'firstName' field is required." } }
Tradução da mensagem: "O campo 'nome' é obrigatório."
-
Conter ao menos 03 caracteres
:{ "error": { "message": "The 'firstName' field must contain at least 3 characters" } }
Tradução da mensagem: "O campo 'nome' deve conter pelo menos 3 caracteres"
-
Ser um texto/string
:{ "error": { "message": "The 'firstName' field must be a string." } }
Tradução da mensagem: "O campo 'nome' deve ser uma string."
-
-
-
lastName
:-
Tradução: sobrenome
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'lastName' field is required." } }
Tradução da mensagem: "O campo 'sobrenome' é obrigatório."
-
Conter ao menos 03 caracteres
:{ "error": { "message": "The 'lastName' field must contain at least 3 characters" } }
Tradução da mensagem: "O campo 'sobrenome' deve conter pelo menos 3 caracteres"
-
Ser um texto/string
:{ "error": { "message": "The 'lastName' field must be a string." } }
Tradução da mensagem: "O campo 'sobrenome' deve ser uma string."
-
-
-
email
:-
Tradução: email
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'email' field is required." } }
Tradução da mensagem: "O campo 'email' é obrigatório."
-
Ser um texto/string
:{ "error": { "message": "The 'email' field must be a string." } }
Tradução da mensagem: "O campo 'email' deve ser uma string."
-
Ser um email válido
:{ "error": { "message": "The invalid 'email' field." } }
Tradução da mensagem: "Campo 'email' inválido."
-
Ser único no banco de dados
:{ "error": { "message": "'email' is already." } }
Tradução da mensagem: "'email' ja existe."
-
-
-
password
:⚠️ ATENÇÃO⚠️ - Visando maior segurança as senhas:
- São encriptadas antes de armazenadas no banco de dados, através do bcrypt;
- Não são retornadas em consultas por
searchAll
esearchId
.
-
Tradução: senha
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'password' field is required." } }
Tradução da mensagem: "O campo 'senha' é obrigatório."
-
Ser um texto/string
:{ "error": { "message": "The 'password' field must be a string." } }
Tradução da mensagem: "O campo 'senha' deve ser uma string."
-
Conter ao menos 10 caracteres
:{ "error": { "message": "The 'password' field must contain at least 10 characters" } }
Tradução da mensagem: "O campo 'senha' deve conter pelo menos 10 caracteres"
-
Conter caracteres maiúsculos, números e especiais
:{ "error": { "message": "The 'password' field must contain at least one: a capital letter, a number and a special character (!, $, #, %, _)." } }
Tradução da mensagem: "O campo 'senha' deve conter pelo menos: uma letra maiúscula, um número e um caractere especial (!, $, #, %, _)."
-
- Visando maior segurança as senhas:
-
-
Descrição: Responsável pela remoção de usuários.
-
Retorno:
{ "message": "'user' deleted successfully,", "deletedUser": { "deletedCount": 1, "user": { "_id": " ", "firstName": " ", "lastName": " ", "email": " ", "role": " " } } }
Tradução da mensagem: "'usuário' excluído com sucesso."
⚠️ ATENÇÃO⚠️
Para a execução de
remove
é necessário:
- Estar logado e;
- Ser o detentor da conta criada ou usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
-
Campos obrigatórios:
-
id
:-
Tradução: id
-
Requisitos do campo / Erro retornado:
-
Conter 24 caracteres
:{ "error": { "message": "The 'id' field must contain 24 characters" } }
Tradução da mensagem: "O campo 'id' deve conter 24 caracteres"
-
id/usuário deve existir no banco de dados
:{ "error": { "message": "'user' not found." } }
Tradução da mensagem: "'usuário' não encontrado"
-
-
-
-
Descrição: Responsável pela leitura de todos usuários.
-
Retorno:
{ "users": [ { "_id": " ", "firstName": " ", "lastName": " ", "email": " ", "role": " " }, { "_id": " ", "firstName": " ", "lastName": " ", "email": " ", "role": " " }, ... ] }
⚠️ ATENÇÃO⚠️
Para a execução de
searchAll
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
-
Erro retornado no searchAll:
nenhum usuário cadastrado no banco de dados
:Tradução da mensagem: "não há 'usuários' registrados".{ "error": { "message": "no registered 'users'." } }
-
Descrição: Responsável pela leitura de um usuário pelo id.
-
Retorno:
{ "user": { "_id": " ", "firstName": " ", "lastName": " ", "email": " ", "role": " " } }
⚠️ ATENÇÃO⚠️
Para a execução de
searchId
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
-
Campos obrigatórios:
-
id
:-
Tradução: id
-
Requisitos do campo / Erro retornado:
-
Conter 24 caracteres
:{ "error": { "message": "The 'id' field must contain 24 characters" } }
Tradução da mensagem: "O campo 'id' deve conter 24 caracteres"
-
id/usuário deve existir no banco de dados
:{ "error": { "message": "'user' not found." } }
Tradução da mensagem: "'usuário' não encontrado"
-
-
-
-
Descrição: Responsável pela atualização dos dados do usuário.
-
body:
{ "firstName": " ", "lastName": " ", "email": " ", "password": " ", }
-
Retorno:
{ "message": "'user' modified successfully.", "updatedUser": { "modifiedCount": 1, "newUserData": { "_id": " ", "firstName": " ", "lastName": " ", "email": " ", "role": " " } } }
Tradução da mensagem: "'usuário' modificado com sucesso."
⚠️ ATENÇÃO: Campos"_id"
,"role"
emodifiedCount
são gerados automaticamente pelo sistema.⚠️
⚠️ ATENÇÃO⚠️
Para a execução de
update
é necessário:
- Estar logado e;
- Ser o detentor da conta criada ou usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
-
Campos obrigatórios:
-
id
:-
Tradução: id
-
Requisitos do campo / Erro retornado:
-
Conter 24 caracteres
:{ "error": { "message": "The 'id' field must contain 24 characters" } }
Tradução da mensagem: "O campo 'id' deve conter 24 caracteres"
-
id/usuário deve existir no banco de dados
:{ "error": { "message": "'user' not found." } }
Tradução da mensagem: "'usuário' não encontrado"
-
-
-
firstName
:-
Tradução: nome
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'firstName' field is required." } }
Tradução da mensagem: "O campo 'nome' é obrigatório."
-
Conter ao menos 03 caracteres
:{ "error": { "message": "The 'firstName' field must contain at least 3 characters" } }
Tradução da mensagem: "O campo 'nome' deve conter pelo menos 3 caracteres"
-
Ser um texto/string
:{ "error": { "message": "The 'firstName' field must be a string." } }
Tradução da mensagem: "O campo 'nome' deve ser uma string."
-
-
-
lastName
:-
Tradução: sobrenome
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'lastName' field is required." } }
Tradução da mensagem: "O campo 'sobrenome' é obrigatório."
-
Conter ao menos 03 caracteres
:{ "error": { "message": "The 'lastName' field must contain at least 3 characters" } }
Tradução da mensagem: "O campo 'sobrenome' deve conter pelo menos 3 caracteres"
-
Ser um texto/string
:{ "error": { "message": "The 'lastName' field must be a string." } }
Tradução da mensagem: "O campo 'sobrenome' deve ser uma string."
-
-
-
email
:-
Tradução: email
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'email' field is required." } }
Tradução da mensagem: "O campo 'email' é obrigatório."
-
Ser um texto/string
:{ "error": { "message": "The 'email' field must be a string." } }
Tradução da mensagem: "O campo 'email' deve ser uma string."
-
Ser um email válido
:{ "error": { "message": "The invalid 'email' field." } }
Tradução da mensagem: "Campo 'email' inválido."
-
Ser único no banco de dados
:{ "error": { "message": "'email' is already." } }
Tradução da mensagem: "'email' ja existe."
-
Para troca de email, o novo email não deve existir no banco de dados
:{ "error": { "message": "'new email' is already." } }
Tradução da mensagem: "'novo email' ja existe."
-
-
-
password
:⚠️ ATENÇÃO⚠️ - Visando maior segurança as senhas:
- São encriptadas antes de armazenadas no banco de dados, através do bcrypt;
- Não são retornadas em consultas por
searchAll
esearchId
.
-
Tradução: senha
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'password' field is required." } }
Tradução da mensagem: "O campo 'senha' é obrigatório."
-
Ser um texto/string
:{ "error": { "message": "The 'password' field must be a string." } }
Tradução da mensagem: "O campo 'senha' deve ser uma string."
-
Conter ao menos 10 caracteres
:{ "error": { "message": "The 'password' field must contain at least 10 characters" } }
Tradução da mensagem: "O campo 'senha' deve conter pelo menos 10 caracteres"
-
Conter caracteres maiúsculos, números e especiais
:{ "error": { "message": "The 'password' field must contain at least one: a capital letter, a number and a special character (!, $, #, %, _)." } }
Tradução da mensagem: "O campo 'senha' deve conter pelo menos: uma letra maiúscula, um número e um caractere especial (!, $, #, %, _)."
-
- Visando maior segurança as senhas:
-
-
Descrição: Responsável por dar autorização para acesso ao sistema pelo usuário.
-
body:
{ "email": " ", "password": " ", }
-
Retorno:
{ "token": " " }
⚠️ ATENÇÃO⚠️
Para efetuar login como administrator do sistema basta digitar o
password
cadastrados no arquivo .env.Ao efetuar o primeiro acesso como administrador, será cadastrado automaticamente seus respectivos dados no sistema.
-
Erro retornado no login:
-
Email ou senha incorreto
:{ "error": { "message": "The invalid 'email or password' field." } }
Tradução da mensagem: "O campo de 'e-mail ou senha' inválido.".
-
-
Campos obrigatórios:
-
email
:-
Tradução: email
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'email' field is required." } }
Tradução da mensagem: "O campo 'email' é obrigatório."
-
Ser um texto/string
:{ "error": { "message": "The 'email' field must be a string." } }
Tradução da mensagem: "O campo 'email' deve ser uma string."
-
Ser um email válido
:{ "error": { "message": "The invalid 'email' field." } }
Tradução da mensagem: "Campo 'email' inválido."
-
-
-
password
:⚠️ ATENÇÃO⚠️ - Visando maior segurança as senhas:
- São encriptadas antes de armazenadas no banco de dados, através do bcrypt;
- Não são retornadas em consultas por
searchAll
esearchId
.
-
Tradução: senha
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'password' field is required." } }
Tradução da mensagem: "O campo 'senha' é obrigatório."
-
Ser um texto/string
:{ "error": { "message": "The 'password' field must be a string." } }
Tradução da mensagem: "O campo 'senha' deve ser uma string."
-
Conter ao menos 10 caracteres
:{ "error": { "message": "The 'password' field must contain at least 10 characters" } }
Tradução da mensagem: "O campo 'senha' deve conter pelo menos 10 caracteres"
-
Conter caracteres maiúsculos, números e especiais
:{ "error": { "message": "The 'password' field must contain at least one: a capital letter, a number and a special character (!, $, #, %, _)." } }
Tradução da mensagem: "O campo 'senha' deve conter pelo menos: uma letra maiúscula, um número e um caractere especial (!, $, #, %, _)."
-
- Visando maior segurança as senhas:
-
- Descrição: Responsável pela criação, remoção, atualização e leitura de produtos.
⚠️ ATENÇÃO⚠️
Para a execução de
searchAll
esearchId
é necessário:
- Estar logado.
Para a execução de
create
,remove
eupdate
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
-
Descrição: Responsável pela criação de produtos.
-
body:
{ "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " }
-
Retorno:
{ "message": "'product' created successfully.", "createdProduct": { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " } }
Tradução da mensagem: "'produto' criado com sucesso."
⚠️ ATENÇÃO: O Campo"_id"
é gerado automaticamente pelo sistema.⚠️
⚠️ ATENÇÃO⚠️
Para a execução de
create
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
-
Campos obrigatórios:
-
name
:-
Tradução: nome
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'name' field is required." } }
Tradução da mensagem: "O campo 'nome' é obrigatório."
-
Conter ao menos 04 caracteres
:{ "error": { "message": "The 'name' field must contain at least 4 characters" } }
Tradução da mensagem: "O campo 'nome' deve conter pelo menos 4 caracteres"
-
Ser um texto/string
:{ "error": { "message": "The 'name' field must be a string." } }
Tradução da mensagem: "O campo 'nome' deve ser uma string."
-
Ser único no banco de dados
:{ "error": { "message": "'product' is already." } }
Tradução da mensagem: "'produto' ja existe."
-
-
-
category
:-
Tradução: categoria
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'category' field is required." } }
Tradução da mensagem: "O campo 'categoria' é obrigatório."
-
Conter ao menos 04 caracteres
:{ "error": { "message": "The 'category' field must contain at least 4 characters" } }
Tradução da mensagem: "O campo 'categoria' deve conter pelo menos 4 caracteres"
-
Ser um texto/string
:{ "error": { "message": "The 'category' field must be a string." } }
Tradução da mensagem: "O campo 'categoria' deve ser uma string."
-
-
-
unity
:-
Tradução: unidade
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'unity' field is required." } }
Tradução da mensagem: "O campo 'unidade' é obrigatório."
-
Conter ao entre 02 e 03 caracteres
:{ "error": { "message": "The 'unity' field must contain between 2 and 3 characters." } }
Tradução da mensagem: "O campo 'unidade' deve conter entre 2 e 3 caracteres."
-
Ser um texto/string
:{ "error": { "message": "The 'unity' field must be a string." } }
Tradução da mensagem: "O campo 'unidade' deve ser uma string."
-
-
-
quantity
:-
Tradução: quantidade
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'quantity' field is required." } }
Tradução da mensagem: "O campo 'quantidade' é obrigatório."
-
Ser um número positivo
:{ "error": { "message": "The 'quantity' field must be a positive number." } }
Tradução da mensagem: "O campo 'quantidade' deve ser um número positivo."
-
-
-
price
:-
Tradução: preço
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'price' field is required." } }
Tradução da mensagem: "O campo 'preço' é obrigatório."
-
Ser um número positivo
:{ "error": { "message": "The 'preço' field must be a positive number." } }
Tradução da mensagem: "O campo 'preço' deve ser um número positivo."
-
-
-
-
Descrição: Responsável pela remoção de produtos.
-
Retorno:
{ "message": "product deleted successfully,", "deletedProduct": { "deletedCount": 1, "product": { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " } } }
Tradução da mensagem: "'usuário' excluído com sucesso."
⚠️ ATENÇÃO⚠️
Para a execução de
remove
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
-
Campos obrigatórios:
-
id
:-
Tradução: id
-
Requisitos do campo / Erro retornado:
-
Conter 24 caracteres
:{ "error": { "message": "The 'id' field must contain 24 characters" } }
Tradução da mensagem: "O campo 'id' deve conter 24 caracteres"
-
id/produto deve existir no banco de dados
:{ "error": { "message": "'product' not found." } }
Tradução da mensagem: "'product' não encontrado"
-
-
-
-
Descrição: Responsável pela leitura de todos os produtos cadastrados.
-
Retorno:
{ "products": [ { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " }, { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " }, ... ] }
⚠️ ATENÇÃO⚠️
Para a execução de
searchAll
é necessário:
- Estar logado.
Vide: Authentication, Authorization
-
Erro retornado no searchAll:
nenhum usuário cadastrado no banco de dados
:Tradução da mensagem: "não há 'produtos' registrados".{ "error": { "message": "no registered 'products'." } }
-
Descrição: Responsável pela leitura de produtos pelo id.
-
Retorno:
{ "product": { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " } }
⚠️ ATENÇÃO⚠️
Para a execução de
searchById
é necessário:
- Estar logado.
Vide: Authentication, Authorization
-
Campos obrigatórios:
-
id
:-
Tradução: id
-
Requisitos do campo / Erro retornado:
-
Conter 24 caracteres
:{ "error": { "message": "The 'id' field must contain 24 characters" } }
Tradução da mensagem: "O campo 'id' deve conter 24 caracteres"
-
id/usuário deve existir no banco de dados
:{ "error": { "message": "'product' not found." } }
Tradução da mensagem: "'produto' não encontrado"
-
-
-
-
Descrição: Responsável pela atualização dos dados do produto.
-
body:
{ "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " }
-
Retorno:
{ "message": "'product' modified successfully.", "createdProduct": { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " } }
Tradução da mensagem: "'produto' modificado com sucesso."
⚠️ ATENÇÃO⚠️
Para a execução de
update
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
-
Campos obrigatórios:
-
id
:-
Tradução: id
-
Requisitos do campo / Erro retornado:
-
Conter 24 caracteres
:{ "error": { "message": "The 'id' field must contain 24 characters" } }
Tradução da mensagem: "O campo 'id' deve conter 24 caracteres"
-
id/usuário deve existir no banco de dados
:{ "error": { "message": "'product' not found." } }
Tradução da mensagem: "'produto' não encontrado"
-
-
-
name
:-
Tradução: nome
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'name' field is required." } }
Tradução da mensagem: "O campo 'nome' é obrigatório."
-
Conter ao menos 04 caracteres
:{ "error": { "message": "The 'name' field must contain at least 4 characters" } }
Tradução da mensagem: "O campo 'nome' deve conter pelo menos 4 caracteres"
-
Ser um texto/string
:{ "error": { "message": "The 'name' field must be a string." } }
Tradução da mensagem: "O campo 'nome' deve ser uma string."
-
Ser único no banco de dados
:{ "error": { "message": "'product' is already." } }
Tradução da mensagem: "'produto' ja existe."
-
Para troca de nome do produto, o novo nome não deve existir no banco de dados
:{ "error": { "message": "'new product name' is already." } }
Tradução da mensagem: "'novo nome do produto' ja existe."
-
-
-
category
:-
Tradução: categoria
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'category' field is required." } }
Tradução da mensagem: "O campo 'categoria' é obrigatório."
-
Conter ao menos 04 caracteres
:{ "error": { "message": "The 'category' field must contain at least 4 characters" } }
Tradução da mensagem: "O campo 'categoria' deve conter pelo menos 4 caracteres"
-
Ser um texto/string
:{ "error": { "message": "The 'category' field must be a string." } }
Tradução da mensagem: "O campo 'categoria' deve ser uma string."
-
-
-
unity
:-
Tradução: unidade
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'unity' field is required." } }
Tradução da mensagem: "O campo 'unidade' é obrigatório."
-
Conter ao entre 02 e 03 caracteres
:{ "error": { "message": "The 'unity' field must contain between 2 and 3 characters." } }
Tradução da mensagem: "O campo 'unidade' deve conter entre 2 e 3 caracteres."
-
Ser um texto/string
:{ "error": { "message": "The 'unity' field must be a string." } }
Tradução da mensagem: "O campo 'unidade' deve ser uma string."
-
-
-
quantity
:-
Tradução: quantidade
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'quantity' field is required." } }
Tradução da mensagem: "O campo 'quantidade' é obrigatório."
-
Ser um número positivo
:{ "error": { "message": "The 'quantity' field must be a positive number." } }
Tradução da mensagem: "O campo 'quantidade' deve ser um número positivo."
-
-
-
price
:-
Tradução: preço
-
Requisitos do campo / Erro retornado:
-
Obrigatório
:{ "error": { "message": "The 'price' field is required." } }
Tradução da mensagem: "O campo 'preço' é obrigatório."
-
Ser um número positivo
:{ "error": { "message": "The 'preço' field must be a positive number." } }
Tradução da mensagem: "O campo 'preço' deve ser um número positivo."
-
-
-
- Descrição: Responsável pela criação, remoção, atualização e leitura de vendas de produtos previamente cadastrados.
⚠️ ATENÇÃO⚠️
Para a execução de
create
,searchAll
esearchId
é necessário:
- Estar logado.
Para a execução de
remove
eupdate
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
Para criar / atualizar uma venda, é necessário enviar um array de produtos, sendo eles previamente cadastrados no banco de dados;
Na execução de
create
eupdate
será checado:Na execução de
remove
será restabelecida a quantidade do produto registrado na venda excluída.
-
Descrição: Responsável pela criação de uma venda dos produtos previamente cadastrados.
-
body:
[ { "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " }, { "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " }, ... ]
-
Retorno:
{ "message": "'sale' created successfully.", "createdSale": { "_id": " ", "creationDate": { "userId": " ", "date": " " }, "amount": " ", "soldProducts": [ { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " }, { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " }, ... ] } }
Tradução da mensagem: "'venda' criada com sucesso."
⚠️ ATENÇÃO⚠️ Os seguintes campos serão gerados automaticamente pelo sistema:"_id"
: id da venda;"creationDate"
: armazena o id do usuário que criou a venda e a respectiva data e hora;"amount"
: valor total da venda;"total"
: multiplicação da quantidade do produto vendido pelo seu preço unitário.
⚠️ ATENÇÃO⚠️
Para a execução de
create
é necessário:
- Estar logado.
Vide: Authentication, Authorization
Na execução de
create
será checado:
-
Erro(s) retornado(s) no create:
-
Não atendimento aos mesmos requisitos de criação de um produto
:{ "error": { "message": "The invalid 'sale' field." } }
Tradução da mensagem: "O campo de 'venda' inválido.".
-
Um ou mais produtos na lista de venda não existem no banco de dados
:{ "error": { "message": "shopping list with unregistered products: (list)" } }
Tradução da mensagem: "Lista de compras com produtos não cadastrados: (lista)".
OBS.:
no lugar de '(lista)'será retornado o nome dos produtos não cadastrados no banco. -
Um ou mais produtos na lista de venda não contém saldo suficiente para a venda
:{ "error": { "message": "Insufficient stock of products: (list)" } }
Tradução da mensagem: "Estoque insuficiente de produtos: (lista)".
OBS.:
no lugar de '(lista)'será retornado o nome dos produtos com ausência de saldo.
-
-
Descrição: Responsável pela remoção de uma venda realizada.
-
Retorno:
{ "message": "'sale' deleted successfully,", "deletedUser": { "deletedCount": 1, "saleDeleted": { "_id": " ", "creationDate": { "userId": " ", "date": " " }, "amount": " ", "soldProducts": [ { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " } ] } } }
Tradução da mensagem: "'venda' excluída com sucesso."
⚠️ ATENÇÃO⚠️
Para a execução de
remove
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
⚠️ ATENÇÃO⚠️
- Na execução de
remove
será restabelecida a quantidade do produto registrado na venda excluída.
-
Campos obrigatórios:
-
id
:-
Tradução: id
-
Requisitos do campo / Erro retornado:
-
Conter 24 caracteres
:{ "error": { "message": "The 'id' field must contain 24 characters" } }
Tradução da mensagem: "O campo 'id' deve conter 24 caracteres"
-
id/venda deve existir no banco de dados
:{ "error": { "message": "'sale' not found." } }
Tradução da mensagem: "'venda' não encontrada"
-
-
-
-
Descrição: Responsável pela leitura de todas as vendas realizadas.
-
Retorno:
{ "sales": [ { "_id": " ", "creationDate": { "userId": " ", "date": " " }, "amount": " ", "soldProducts": [ { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " }, { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " }, ... ] }, { "_id": " ", "creationDate": { "userId": " ", "date": " " }, "amount": " ", "soldProducts": [ { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " }, { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " }, ... ] }, ... ] }
⚠️ ATENÇÃO⚠️
Para a execução de
searchAll
é necessário:
- Estar logado.
Vide: Authentication, Authorization
-
Erro retornado no searchAll:
nenhuma venda cadastrada no banco de dados
:Tradução da mensagem: "não há 'vendas' registradas".{ "error": { "message": "no registered 'sales'." } }
-
Descrição: Responsável pela leitura de uma venda pelo id.
-
Retorno:
{ "sale": { "_id": " ", "creationDate": { "userId": " ", "date": " " }, "amount": " ", "soldProducts": [ { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " }, { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " }, ... ] } }
⚠️ ATENÇÃO⚠️
Para a execução de
searchById
é necessário:
- Estar logado.
Vide: Authentication, Authorization
-
Campos obrigatórios:
-
id
:-
Tradução: id
-
Requisitos do campo / Erro retornado:
-
Conter 24 caracteres
:{ "error": { "message": "The 'id' field must contain 24 characters" } }
Tradução da mensagem: "O campo 'id' deve conter 24 caracteres"
-
id/sale deve existir no banco de dados
:{ "error": { "message": "'sale' not found." } }
Tradução da mensagem: "'venda' não encontrada"
-
-
-
-
Descrição: Responsável pela atualização de dados de uma venda realizada.
-
body:
[ { "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " }, { "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " " }, ... ]
-
Retorno:
{ "message": "'sale' modified successfully.", "updatedSale": { "modifiedCount": 1, "newData": { "_id": " ", "creationDate": { "userId": " ", "date": " " }, "amount": " ", "soldProducts": [ { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " }, { "_id": " ", "name": " ", "category": " ", "unity": " ", "quantity": " ", "price": " ", "total": " " }, ... ], "modifiedDate": { "userId": " ", "date": " " } } } }
Tradução da mensagem: "'venda' modificada com sucesso."
⚠️ ATENÇÃO⚠️ Os seguintes campos serão gerados automaticamente pelo sistema:"modifiedDate"
: armazena o id do usuário que modificou a venda e a respectiva data e hora.
⚠️ ATENÇÃO⚠️
Para a execução de
update
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
Na execução de
update
será checado:
-
Erro(s) retornado(s) no update:
-
Não atendimento aos mesmos requisitos de criação de um produto
:{ "error": { "message": "The invalid 'sale' field." } }
Tradução da mensagem: "O campo de 'venda' inválido.".
-
Um ou mais produtos na lista de venda não existe no banco de dados
:{ "error": { "message": "shopping list with unregistered products: (list)" } }
Tradução da mensagem: "Lista de compras com produtos não cadastrados: (lista)".
OBS.:
no lugar de '(lista)'será retornado o nome dos produtos não cadastrados no banco. -
Um ou mais produtos na lista de venda não contém saldo suficiente para a venda
:{ "error": { "message": "Insufficient stock of products: (list)" } }
Tradução da mensagem: "Estoque insuficiente de produtos: (lista)".
OBS.:
no lugar de '(lista)'será retornado o nome dos produtos com ausência de saldo.
-
- Descrição: Responsável por capturar, guardar e leitura de todos os erros internos disparados na execução da API.
-
Descrição: Responsável pela leitura de todos os erros internos disparados na execução da API.
-
Retorno:
{ "errors": [ { "_id": " ", "message": " ", "method": " ", "URL": " ", "bodyWithoutPassword": { ... }, "user": { ... }, "date": " " }, { "_id": " ", "message": " ", "method": " ", "URL": " ", "bodyWithoutPassword": { ... }, "user": { ... }, "date": " " }, ... ] }
⚠️ ATENÇÃO⚠️
Para a execução de
searchAll
é necessário:
- Estar logado e;
- Ser usuário administrator do sistema (role: "adm").
Vide: Authentication, Authorization
- Para efetuar a autenticação, é necessário seguir os seguintes passos:
- Efetuar o seu cadastro como usuário. Vide Users create;
- Efetuar o login com dos dados do usuário criado. Em caso de sucesso você receberá um
token
. Vide Login; - Incluir no Header, o campo
authorization
(exatamente assim, tudo com letras minúsculas) otoken
recebido ao efetuar o login.
⚠️ ATENÇÃO⚠️
- Para acesso ao sistema, como administrador, é necessário:
- A inclusão do
email
(EMAIL_ADM) epassword
(PASSWORD_ADM) no arquivo .env; - Efetuar o login com os dados do usuário administrador. Em caso de sucesso você receberá um
token
. Vide Login; - Incluir no Header, o campo
authorization
(exatamente assim, tudo com letras minúsculas) otoken
recebido ao efetuar o login.
- A inclusão do
⚠️ ATENÇÃO⚠️
Bora entrar para esta lista? ;)
AQUI
Agradeço:
- À minha família por me apoiar nos estudos em minha transição de carreira;
- À Trybe por me dar a oportunidade de aprender uma nova carreira, com seu Curso de Desenvolvimento WEB Full-Stack, na modalidade MSC.
- Toda a equipe Trybe, em especial:
- Jadezita e Rê, pelo carinho e apoio em softs skills;
- Pedro, Nato, Ricci e Rafa Guimarães, pelo belíssimo apoio e ensinamentos em back-end;
- Daniel e Rafa Medeiros, monitores Summer de Instrução, pelo apoio, principalmente na introdução de novos conteúdos.
Wander Diniz Veloso
Estudante de Desenvolvimento WEB e a cada dia mais apaixonado por tecnologia!
Entre em contato!
Feito com muito ❤️ e dedicação por Wander Diniz Veloso.