Projeto de fim do módulo 4 da Resilia Educação. O projeto consiste na criação deuma API REST que retorna informações do portifólio de um estúdio de tatuagem.
O projeto foi feito através Node.js com o framework Express e utilizando a ORM Sequelize.
Outras bibliotecas utilizadas nesse projeto foram:
- Nodemon - para recarregar automaticamente o servidor durante o desenvolvimento.
- Supertest - para rodar testes de rota.
A estrutura de banco de dados utilizada foi o Sqlite3. As configurações do banco de dados podem ser encontradas no arquivo /src/sequelize.js.
Abra o terminal (Linux/Mac) ou o PowerShell (Windows) e siga os passos abaixo.
-
Clone o repositório em sua máquina
git clone https://github.com/cinmcantu/EstudioTattooAPI.git
-
Acesse a pasta criada
cd EstudioTattooAPI
-
Instale os pacotes
npm install
-
Para iniciar os projetos use o comando abaixo
npm run start
A porta padrão é a 3003. Caso queira alterá-la, procure a linha
const port = process.env.PORT || 3003
no arquivo /server.js e altere o número 3003 para sua porta de preferência.
Caso queira, foi disponibilizado um arquivo que popula o banco de dados criado com quadro instâncias. Para rodá-lo, em uma nova janela no terminal/Powershell, ainda dentro do diretório do projeto, rode o seguinte comando:
npm run seed
A API é do tipo Restful, contendo assim, os quatro verbos HTTP: GET, POST, PUT e DELETE.
Ao iniciar o arquivo em sua máquina, a url base será http:https://localhost:{porta}, onde {porta}
deve ser substituido pela porta escolhida, por padrão será a 3003. As rotas abaixo deverão estar sempre prescindidas por essa url.
Segue abaixo um resumo das rotas da API. Em seguida terão mais informações sobre cada uma delas.
- GET: URL_BASE/portfolio
- GET: URL_BASE/portfolio/{id}
- GET: URL_BASE/portfolio/tag/{tag}
- POST: URL_BASE/portfolio
- PUT: URL_BASE/portfolio/{id}
- DELETE: URL_BASE/portfolio/{id}
GET: URL_BASE/portfolio
RESPOSTA
{
"result": [
{
"id": 1,
"artist_id": 2,
"description": "Pokemon",
"size": "medium",
"tag": "geek",
"color": "colored",
"avaliable": true,
"createdAt": "2021-07-25T19:11:08.684Z",
"updatedAt": "2021-07-25T19:11:08.684Z"
},
{
"id": 2,
"artist_id": 2,
"description": "Bart from The Simpsons",
"size": "small",
"tag": "cartoon",
"color": "colored",
"avaliable": true,
"createdAt": "2021-07-25T19:11:08.684Z",
"updatedAt": "2021-07-25T19:11:08.684Z"
}
],
"count": 2
}
GET: URL_BASE/portfolio/{id}
Resposta para id = 1:
{
"result": [
{
"id": 1,
"artist_id": 2,
"description": "Pokemon",
"size": "medium",
"tag": "geek",
"color": "colored",
"avaliable": true,
"createdAt": "2021-07-25T19:11:08.684Z",
"updatedAt": "2021-07-25T19:11:08.684Z"
}
],
"count": 1
}
GET: URL_BASE/portfolio/tag/{tag}
Resposta para tag = Cartoon:
{
"result": [
{
"id": 2,
"artist_id": 2,
"description": "Bart from The Simpsons",
"size": "small",
"tag": "cartoon",
"color": "colored",
"avaliable": true,
"createdAt": "2021-07-25T19:11:08.684Z",
"updatedAt": "2021-07-25T19:11:08.684Z"
}
],
"count": 1
}
POST: URL_BASE/portfolio
Modelo a ser utilizado no body, no formato JSON:
{
"artist_id" : 1,
"description" : "Lion with a cross",
"size" : "huge",
"tag" : "Religion",
"color" : "black and white",
"avaliable": true
}
Resposta:
{
"message": "The portfolio Lion with a cross has been inserted",
"error": false
}
IMPORTANTE:
-
Os atributos size e color só aceitam os seguintes valores:
size : "tiny", "small", "medium", "big", "huge"
color : "black and white", "colored"
-
Os atributos artist_id e avaliable não podem ser nulos
-
O atributo avaliable é do tipo booleano, ou seja, só pode ser true ou false
PUT: URL_BASE/portfolio/{id}
Modelo a ser utilizado no body, no formato JSON. Não é obrigatório conter todos atributos:
{
"artist_id" : 1,
"description" : "Lion with a cross",
"size" : "huge",
"tag" : "Religion",
"color" : "colored",
"avaliable": false
}
Resposta:
{
"message": "The row with id 4 has been updated",
"result": {
"artist_id" : 1,
"description" : "Lion with a cross",
"size" : "huge",
"tag" : "religion",
"color" : "colored",
"avaliable": false,
"createdAt": "2021-07-25T19:11:08.683Z",
"updatedAt": "2021-07-25T19:11:19.648Z"
},
"error": false
}
DELETE: URL_BASE/portfolio/{id} Resposta:
{
"message": "The row with id 2 has been deleted",
"error": false
}
Foi implementado um arquivo de testes para checar o funcionamento correto das rotas da API. Para isso foi utilizado a biblioteca Supertest com o framework Jest
IMPORTANTE
Para o funcionamento correto dos testes, é necessário que o banco de dados esteja populado. Para isso, antes de iniciar os testes, rode:
npm run seed
E depois rode os testes com:
npm run test