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.
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.
git clone git@github.com:costalucs/medieval-store-api.git
docker-compose up -d --build
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
.
docker exec -it trybesmith bash
Instalando dependências:
npm install
Executando aplicação:
npm start
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" }
- Se o login não tiver o campo "username", o resultado retornado deverá ser um status http
-
[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" }
- Se o login não tiver o campo "password", o resultado retornado deverá ser um status http
-
[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" }
- Se o login tiver o username inválido, o resultado retornado deverá ser um status http
-
[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" }
- Se o login tiver a senha inválida, o resultado retornado deverá ser um status http
👉 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" }
- Se o login foi feito com sucesso, o resultado deverá ser um status http
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]
}