Giter Site home page Giter Site logo

loja-de-produtos-medievais-api's Introduction

Loja de produtos medievais

Contexto

API de uma loja de produtos medievais onde o usuário logado consegue listar e cadastrar produtos e vendas

Tecnologias usadas

NodeJS, Typescript, ExpressJS, JWT, MySQL, Docker

Clonando o projeto

[email protected]:joyceandronico/loja-de-produtos-medievais-API.git
  • Acessando a pasta do projeto:
cd loja-de-produtos-medievais-API

Executando a aplicação

  • Com Docker:

    docker-compose up
    
    • Acesse o container da aplicação:
    docker exec -it loja-medieval bash
    
    • Instale as dependências:
    npm install
    
  • Localmente:

    • Variáveis de Ambiente

Na raiz do projeto, crie um arquivo .env para configurar as variáveis de ambiente. Por exemplo, caso o seu usuário SQL seja nome e senha 1234, o arquivo ficará desta forma:

MYSQL_HOST=localhost
MYSQL_USER=nome
MYSQL_PASSWORD=1234
  • Instale as dependências:
npm install
  • Recrie a base de dados usando MySQL Workbench ou programa semelhante (arquivo loja_medieval.sql)

  • Inicie a aplicação:

npm start

Endpoints


Endpoint para o cadastro de produtos

  • O endpoint será acessível através do caminho (/products);

  • Os produtos enviados serão salvos na tabela Products do banco de dados;

  • O endpoint deve receber a seguinte estrutura:

  {
    "name": "Espada longa",
    "amount": "30 peças de ouro"
  }

Endpoint para a listagem de produtos

  • O endpoint será acessível através do caminho (/products);

👉 Para caso os dados sejam enviados corretamente

  • O resultado retornado para listar produtos com sucesso deverá ser conforme exibido abaixo, com um status http 200:
    [
      {
        "id": 1,
        "name": "Poção de cura",
        "amount": "20 gold",
        "orderId": null
      },
      {
        "id": 2,
        "name": "Escudo do Herói",
        "amount": "100 diamond",
        "orderId": 1
      }
    ]

Endpoint para o cadastro de pessoas usuárias

  • O endpoint será acessível através do caminho (/users);

  • As informações de pessoas usuárias cadastradas serão salvas na tabela Users do banco de dados;

  • O endpoint deve receber a seguinte estrutura:

{
  "username": "MAX",
  "classe": "swordsman",
  "level": 10,
  "password": "SavingPeople"
}

👉 Para caso os dados sejam enviados corretamente

  • Se a pessoa usuária for cadastrada com sucesso, o resultado deverá ser conforme o exibido abaixo, com um status http 201 e retornando um token:
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImlkIjozLCJ1c2VybmFtZSI6InlyYWEifSwiaWF0IjoxNjY1ODg3NTExLCJleHAiOjE2NjY0OTIzMTF9.oDRUJtVKzCrYUnjELNa1Pj58VeB_JVVzMPe63xRBBAk"
}

Endpoint para listar todos os pedidos

  • O endpoint será acessível através do caminho (/orders).
  • Essa rota retorna todos os pedidos e os ids dos produtos associados a estes.

👉 Para orders

  • Quando houver mais de um pedido, o resultado retornado para listar pedidos com sucesso deverá ser conforme exibido abaixo, com um status http 200: json [ { "id": 1, "userId": 2, "productsIds": [1, 2] }, { "id": 2, "userId": 2, "productsIds": [3, 4] } ]

Endpoint para o login de pessoas usuárias

  • O endpoint será acessível através do caminho (/login).

  • A rota deve receber os campos username e password, e esses campos serão validados no banco de dados.

  • Um token JWT deve ser gerado e retornado caso haja sucesso no login. No seu payload deve estar presente o id e username.

  • O endpoint deve receber a seguinte estrutura:

  {
    "username": "string",
    "password": "string"
  }

👉 Para caso haja problemas no login

  • Se o login não tiver o campo "username", o resultado retornado deverá ser um status http 400 e

      { "message": "\"username\" is required" }
  • Se o login não tiver o campo "password", o resultado retornado deverá ser um status http 400

      { "message": "\"password\" is required" }
  • Se o login tiver o username inválido, o resultado retornado deverá ser um status http 401 e

      { "message": "Username or password invalid" }
  • Se o login tiver a senha inválida, o resultado retornado deverá ser um status http 401 e

      { "message": "Username or password invalid" }

👉 Para caso os dados sejam enviados corretamente

  • Se o login foi feito com sucesso, o resultado deverá ser um status http 200 e deverá retornar um token:
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImlkIjozLCJ1c2VybmFtZSI6InlyYWEifSwiaWF0IjoxNjY1ODg3NTExLCJleHAiOjE2NjY0OTIzMTF9.oDRUJtVKzCrYUnjELNa1Pj58VeB_JVVzMPe63xRBBAk"
}

Validações dos produtos


👉 Para name

  • Se o campo "name" não for informado, o resultado retornado deverá ser um status http 400 e

      { "message": "\"name\" is required" }
  • Se o campo "name" não for do tipo string, o resultado retornado deverá ser um status http 422 e

      { "message": "\"name\" must be a string" }
  • Se o campo "name" não for uma string com mais de 2 caracteres, o resultado retornado deverá ser um status http 422 e

      { "message": "\"name\" length must be at least 3 characters long" }

👉 Para amount

  • Se o campo "amount" não for informado, o resultado retornado deverá ser um status http 400 e

      { "message": "\"amount\" is required" }
  • Se o campo "amount" não for do tipo string, o resultado retornado deverá ser um status http 422 e

      { "message": "\"amount\" must be a string" }
  • Se o campo "amount" não for uma string com mais de 2 caracteres, o resultado retornado deverá ser um status http 422 e

      { "message": "\"amount\" length must be at least 3 characters long" }


Validações para as pessoas usuárias


👉 Para username

  • Se a requisição não tiver o campo "username", o resultado retornado deverá ser um status http 400 e

      { "message": "\"username\" is required" }
  • Se o campo "username" não for do tipo string, o resultado retornado deverá ser um status http 422 e

      { "message": "\"username\" must be a string" }
  • Se o campo "username" não for do tipo string com mais de 2 caracteres, o resultado retornado deverá ser um status http 422 e

      { "message": "\"username\" length must be at least 3 characters long" }

👉 Para classe

  • Se a requisição não tiver o campo "classe", o resultado retornado deverá ser um status http 400 e

      { "message": "\"classe\" is required" }
  • Se o campo "classe" não for do tipo string, o resultado retornado deverá ser um status http 422 e

      { "message": "\"classe\" must be a string" }
  • Se o campo "classe" não for do tipo string com mais de 2 caracteres, o resultado retornado deverá ser um status http 422 e

      { "message": "\"classe\" length must be at least 3 characters long" }

👉 Para level

  • Se a pessoa usuária não tiver o campo "level", o resultado retornado deverá ser um status http 400 e

      { "message": "\"level\" is required" }
  • Se o campo "level" não for do tipo number, o resultado retornado deverá ser um status http 422 e

      { "message": "\"level\" must be a number" }
  • Se o campo "level" não for do tipo number maior que 0, o resultado retornado deverá ser um status http 422 e

      { "message": "\"level\" must be greater than or equal to 1" }

👉 Para password

  • Se a requisição não tiver o campo "password", o resultado retornado deverá ser um status http 400 e

      { "message": "\"password\" is required" }
  • Se o campo "password" não for do tipo string, o resultado retornado deverá ser um status http 422 e

      { "message": "\"password\" must be a string" }
  • Se o campo "password" não for do tipo string com mais de 8 caracteres, o resultado retornado deverá ser um status http 422 e

      { "message": "\"password\" length must be at least 8 characters long" }


Endpoint para o cadastro de um pedido

  • O endpoint será acessível através do caminho (/orders);

  • Um pedido só pode ser criado caso a pessoa usuária esteja logada e o token JWT validado;

  • Os pedidos enviados devem ser salvos na tabela Orders do banco de dados, salvando id da pessoa usuária da aplicação que fez esse pedido.

  • A tabela Products também deve ser alterada, atualizando todos os produtos com os id incluídos na chave productsIds da requisição, e adicionando nesses produtos o orderId do pedido recém criado;

  • O endpoint deve receber a seguinte estrutura:

  {
    "productsIds": [1, 2]
  }

👉 Para token

  • Se o token não for informado, o resultado retornado deverá ser um status http 401 e

      { "message": "Token not found" }
  • Se o token informado não for válido, o resultado retornado deverá ser um status http 401 e

      { "message": "Invalid token" }

👉 Para products

  • Se o corpo da requisição não possuir o campo "productsIds", o resultado retornado deverá ser um status http 400 e

      { "message": "\"productsIds\" is required" }
  • Se o valor do campo "productsIds" não for um array, o resultado retornado deverá ser um status http 422 e

      { "message": "\"productsIds\" must be an array" }
  • Se o campo "productsIds" possuir um array vazio, o resultado retornado deverá ser um status http 422 e

      { "message": "\"productsIds\" must include only numbers" }

👉 Para caso os dados sejam enviados corretamente

  • O resultado retornado para cadastrar um pedido com sucesso deverá ser conforme exibido abaixo, com um status http 201:

      {
        "userId": 1,
        "productsIds": [1],
      }
  • O resultado retornado para cadastrar um pedido com sucesso deverá ser conforme exibido abaixo, com um status http 201:

      {
        "userId": 1,
        "productsIds": [1, 2]
      }

loja-de-produtos-medievais-api's People

Contributors

joyceandronico avatar trybe-tech-ops avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.