/medieval-store-api

API RESTful desenvolvida com TypeScript, Node.js, Express.js e MySQL

Primary LanguageTypeScript

🚧 README em construção 🚧

📃 Sobre

API RESTful utilizando Node, Express, TypeScript, utilizando a arquitetura MSC (MODEL-SERVICE-CONTROLER), MySQL para armazenar os dados. Consiste em uma API de uma loja de itens medievais.


🛠️ Instalação e execução

Para rodar está aplicação é necessário ter Git, Docker e o Docker Compose instalados no seu computador. O Docker Compose precisa estar na versão 1.29 ou superior.

1 - Clone o repositório

git clone git@github.com:costalucs/medieval-store-api.git

2 - Rode os containers executando o comando abaixo na pasta raiz da aplicação

docker-compose up -d --build

3 - Execute o script SQL para criar o banco de dados

Conecte ao servidor MySQL rodando na porta 3306 usando um cliente MySQL de sua preferência. Utilize as seguintes credenciais:

  • host: db
  • user: root
  • password: password

Então, no cliente, rode o script que está no arquivo Trybesmith.sql.

4 - Rode o comando para abrir o terminal do container trybesmith

docker exec -it trybesmith bash

5 - No terminal do container, installe as dependências e execute a aplicação

Instalando dependências:

npm install

Executando aplicação:

npm start

🔨 Funcionalidades do projeto

1 - Endpoint para o cadastro de produtos:

  • O endpoint está acessível através do caminho (/products) com o método POST;
  • Os produtos enviados devem sã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"
  }

2 - Endpoint para a listagem de produtos:

  • O endpoint deve ser acessível através do caminho (/products) com o método GET;
  • 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
      }
    ]

3 - Endpoint para o cadastro de pessoas usuárias:

  • O endpoint está acessível através do caminho (/users) com o método POST;
  • O endpoint deve receber a seguinte estrutura:
{ 
  "username": "MAX",
  "classe": "swordsman",
  "level": 10,
  "password": "SavingPeople"
}

4 - Endpoint para listar todos os pedidos:

  • O endpoint está acessível através do caminho (/orders) com o método GET.
  • Endpoint para o login de pessoas usuárias:
  • Endpoint responsável por gerar um token.
  • O endpoint deve ser acessível através do caminho (/login) com o método POST.
  • O endpoint deve receber a seguinte estrutura:
  {
    "username": "string",
    "password": "string"
  }
Além disso, as seguintes verificações serão feitas:

👉 Para caso haja problemas no login

  • [Será validado que o campo "username" é enviado]

    • Se o login não tiver o campo "username", o resultado retornado deverá ser um status http 400 e
      { "message": "\"username\" is required" }
  • [Será validado que o campo "password" é enviado]

    • Se o login não tiver o campo "password", o resultado retornado deverá ser um status http 400
      { "message": "\"password\" is required" }
  • [Será validado que não é possível fazer login com um username inválido]

    • Se o login tiver o username inválido, o resultado retornado deverá ser um status http 401 e
      { "message": "Username or password invalid" }
  • [Será validado que não é possível fazer login com uma senha inválida]

    • 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

  • [Será validado que é possível fazer login com sucesso]
    • Se o login foi feito com sucesso, o resultado deverá ser um status http 200 e deverá retornar um token:
    {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
    }

5 - Endpoint para o cadastro de um pedido:

  • O endpoint deve ser acessível através do caminho (/orders) com o método POST;
  • Um pedido só pode ser criado caso a pessoa usuária esteja logada e o token JWT validado;
  • O endpoint deve receber a seguinte estrutura:
  {
    "productsIds": [1, 2]
  }