Skip to content

Projeto de criação de uma API REST e banco de dados MongoDB, visando colocar em prática os conhecimentos adquiridos em Back-end

Notifications You must be signed in to change notification settings

WanderDinizVeloso/My-Store-API

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

My-Store-API

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;


Sumário


Status

Este projeto está em constante construção, pois a cada conhecimento adquirido e novas tecnologias aprendidas, as implementarei visando melhorar sua performance e escalabilidade.


Licença

Este projeto esta sobe a licença MIT.


Habilidades desenvolvidas

  • 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.

Tecnologias utilizadas


Organização e Estruturação do Projeto

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

Pré-requisitos

Ferramentas necessárias

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;

Rodando no servidor local

  • 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:

    .env

    • 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;

Quer contribuir com o projeto?

  • 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

// Fonte utilizada na criação do Pré-requisitos: Trybe


Orientações detalhadas de como utilizar

Users

  • 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 e searchId é necessário:

    • Estar logado e;
    • Ser usuário administrator do sistema (role: "adm").
  • Para a execução de remove e update é necessário:

    • Estar logado e;
    • Ser o detentor da conta criada ou usuário administrator do sistema (role: "adm").

    Vide: Authentication, Authorization

Users create

  • 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 e searchId.
      • 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 (!, $, #, %, _)."

Users remove

  • 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"

Users searchAll

  • 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:
      {
        "error": {
          "message": "no registered 'users'."
        }
      }
      Tradução da mensagem: "não há 'usuários' registrados".

Users searchById

  • 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"

Users update

  • 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" e modifiedCount 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 e searchId.
      • 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 (!, $, #, %, _)."

Login

  • 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 email e 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 e searchId.
      • 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 (!, $, #, %, _)."

Products

  • Descrição: Responsável pela criação, remoção, atualização e leitura de produtos.

⚠️ ATENÇÃO ⚠️

  • Para a execução de searchAll e searchId é necessário:

    • Estar logado.
  • Para a execução de create, remove e update é necessário:

    • Estar logado e;
    • Ser usuário administrator do sistema (role: "adm").

    Vide: Authentication, Authorization

Products create

  • 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."

Products remove

  • 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"

Products searchAll

  • 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 ⚠️

  • Erro retornado no searchAll:

    • nenhum usuário cadastrado no banco de dados:
      {
        "error": {
          "message": "no registered 'products'."
        }
      }
      Tradução da mensagem: "não há 'produtos' registrados".

Products searchById

  • Descrição: Responsável pela leitura de produtos pelo id.

  • Retorno:

    {
      "product": {
        "_id": " ",
        "name": " ",
        "category": " ",
        "unity": " ",
        "quantity": " ",
        "price": " "
      }
    }

⚠️ ATENÇÃO ⚠️

  • 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"

Products update

  • 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."

Sales

  • 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 e searchId é necessário:

    • Estar logado.
  • Para a execução de remove e update é 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 e update será checado:

    • Se o produto contém saldo suficiente para a sua venda / atualização;
    • Se cada produto a ser vendido contém os mesmos requisitos de criação / atualização verificados no create e update do Products
  • Na execução de remove será restabelecida a quantidade do produto registrado na venda excluída.

Sales create

  • 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:

    • Se o produto contém saldo suficiente para a sua venda;
    • Se cada produto a ser vendido contém os mesmos requisitos de criação verificados no create do Products
  • 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.

Sales remove

  • 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"

Sales searchAll

  • 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 ⚠️

  • Erro retornado no searchAll:

    • nenhuma venda cadastrada no banco de dados:
      {
        "error": {
          "message": "no registered 'sales'."
        }
      }
      Tradução da mensagem: "não há 'vendas' registradas".

Sales searchById

  • 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 ⚠️

  • 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"

Sales update

  • 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:

    • Se o produto contém saldo suficiente para a sua modificação;
    • Se cada produto a ser modificado contém os mesmos requisitos de criação verificados no create do Products
  • 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.

Errors

  • Descrição: Responsável por capturar, guardar e leitura de todos os erros internos disparados na execução da API.

Errors searchAll

  • 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

Authentication

  • 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) o token recebido ao efetuar o login.

⚠️ ATENÇÃO ⚠️

  • Em todas as requisições que contenha será necessário a inclusão do token.

Authorization

  • Para acesso ao sistema, como administrador, é necessário:
    • A inclusão do email(EMAIL_ADM) e password (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) o token recebido ao efetuar o login.

⚠️ ATENÇÃO ⚠️

  • Somente terá acesso as requisições que contenham com o efetivo login e token de administrador.
  • Na presente implementação existe a possibilidade de inclusão de somente 01 (um) usuário administrador. Em futuras implementações haverá rota específica para mais usuários administradores.

Contribuição

Bora entrar para esta lista? ;) AQUI


Agradecimentos

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:

Autor

minha foto


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.


About

Projeto de criação de uma API REST e banco de dados MongoDB, visando colocar em prática os conhecimentos adquiridos em Back-end

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published