O objetivo deste projeto foi simular uma loja de itens Medievais feitos por encomenda, onde desenvolvi uma API, utilizando TypeScript e Sequelize; Foi desenvolvido as camadas Services e Controller da aplicação, utilizando JWT para autenticar algumas rotas e as validações do userId, product, também foi criado os testes unitários para cada função;
- TypeScript
- Node JS
- Express
- Https Status Code
- Thunder Client
- Mocha
- Jest
- Nodemon
- Linter
- Sequelize
- Json Web Token
- Joi
Para Clonar e testar a aplicação
Git
Thunder Client
MySQL
Node v16.13.0
TypeScript
- Clone o repositório
git clone git@github.com:georgia-rocha/trybeSmith.git
- Entre na pasta do repositório que você acabou de clonar:
cd trybeSmith
Rodando Projeto no Docker vs Localmente
! É necessário ter um arquivo .env na raiz da aplicação, com o conteúdo:
FROM node:16.14
RUN mkdir -p /app && chown -R node:node /app
USER node
WORKDIR /app
COPY --chown=node:node package*.json ./
RUN npm install
COPY --chown=node:node src src
COPY --chown=node:node .editorconfig .
COPY --chown=node:node .eslintignore .
COPY --chown=node:node .eslintrc.json .
COPY --chown=node:node .sequelizerc .
COPY --chown=node:node tsconfig.json .
Rode o serviço
node
com o comandodocker-compose up -d
.
- Esse serviço irá inicializar um container chamado
trybesmith_api
. - A partir daqui você pode rodar o container via CLI ou abri-lo no VS Code.
Use o comando
docker exec -it trybesmith_api bash
.
- Ele te dará acesso ao terminal interativo do container criado pelo compose, que está rodando em segundo plano.
Instale as dependências [Caso existam] com
npm install
A aplicação é executada automaticamente
Instale as dependências [Caso existam] com
npm install
- POST /login
Exemplo de body para cadastro
{
"username": "string",
"password": "string"
}
Validações Necessárias para o Login
Se o login não tiver o campo "username", o resultado retornado deverá ser um status http `400` e{ "message": "\"username\" and \"password\" are required" }
Se o login não tiver o campo "password", o resultado retornado deverá ser um status http 400 e
{ "message": "\"username\" and \"password\" are required" }
Se o login tiver um username que não exista no banco de dados ele será considerado inválido e o resultado retornado deverá ser um status http 401 e
{ "message": "Username or password invalid" }
Se o login tiver uma senha que não corresponda à senha salva no banco de dados, ela será considerada inválida e o resultado retornado deverá ser um status http 401 e
{ "message": "Username or password invalid" }
Resposta com status code 200
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}
Use o Token nos para fazer a autenticação passando ele no Headers da sua requisição como valor da chave
authorization
.
- POST /products
Exemplo de body para cadastro
{
"name": "Martelo de Thor",
"price": "30 peças de ouro",
"orderId": 4
}
Resposta com status code 201
{
"id": 6,
"name": "Martelo de Thor",
"price": "30 peças de ouro"
}
Validações Necessárias para Products
Validação 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" }
Validação para price
Se o campo "price" não for informado, o resultado retornado deverá ser um status http 400 e
{ "message": "\"price\" is required" }
Se o campo "price" não for do tipo string, o resultado retornado deverá ser um status http 422 e
{ "message": "\"price\" must be a string" }
Se o campo "price" não for uma string com mais de 2 caracteres, o resultado retornado deverá ser um status http 422 e
{ "message": "\"price\" length must be at least 3 characters long" }
- GET /products
Resposta com status code 200
[
{
"id": 1,
"name": "Pedra Filosofal",
"price": "20 gold",
"orderId": null
},
{
"id": 2,
"name": "Lança do Destino",
"price": "100 diamond",
"orderId": 1
}
]
- GET /orders
Resposta com status code 200
[
{
"id": 1,
"userId": 2,
"productIds": [1, 2]
},
{
"id": 2,
"userId": 1,
"productIds": [3, 4]
}
]
POST /orders
Exemplo de body para cadastro
{
"productIds": [1, 2],
"userId": 1
}
Validações Necessárias para o POST de orders
Se o token não for informado, o resultado retornado deverá ser um status http 401 eValidação do Token
{ "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" }
Validação para o user
Se o corpo da requisição não possuir o campo "userId", o resultado retornado deverá ser um status http 400 e
{ "message": "\"userId\" is required" }
Se o campo "userId" não for do tipo number, o resultado retornado deverá ser um status http 422 e
{ "message": "\"userId\" must be a number" }
Se o campo "userId" não for um usuário, o resultado retornado deverá ser um status http 404 e
{ "message": "\"userId\" not found" }
Validação para products
Se o corpo da requisição não possuir o campo "productIds", o resultado retornado deverá ser um status http 400 e
{ "message": "\"productIds\" is required" }
Se o valor do campo "productIds" não for um array, o resultado retornado deverá ser um status http 422 e
{ "message": "\"productIds\" must be an array" }
Se o campo "productIds" possuir um array vazio, o resultado retornado deverá ser um status http 422 e
{ "message": "\"productIds\" must include only numbers" }
Resposta com status code 201
{
"userId": 1,
"productIds": [1, 2]
}
- Para rodar a aplicação:
A aplicação é executada automaticamente
- Para abrir o terminal do docker
docker exec -it trybesmith_api bash
- Para criar e popular as tabelas:
npx db:reset
- Para testar a aplicação: Testar todas:
npm test
Testar individuamente:
- Colocar o número do requisito a ser testado;
npm test **01**
- Para testar a cobertura da aplicação:
npm run test:coverage
- 1 - Criei um endpoint para o cadastro de produtos e os testes das funcionalidades deste endpoint;
- 2 - Criei um endpoint para a listagem de produtos e testes das funcionalidades deste endpoint;
- 3 - Criei um endpoint para listar todos os pedidos e testes das funcionalidades deste endpoint;
- 4 - Criei um endpoint para o login de pessoas usuárias e testes das funcionalidades deste endpoint;
- 5 - Criei as validações dos produtos e testes das funcionalidades deste endpoint;
- 6 - Criei um endpoint para o cadastro de um pedido e testes das funcionalidades deste endpoint;