Skip to content

georgia-rocha/trybeSmith

Repository files navigation

Boas vindas ao repositório do projeto Trybesmith

node-version typeSript

Objetivo 👩‍🎓

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;

Tecnologias utilizadas

Para Clonar e testar a aplicação

Será necessário ter instalado na sua máquina:

  Git
  Thunder Client
  MySQL
  Node v16.13.0
  TypeScript
  1. Clone o repositório
git clone git@github.com:georgia-rocha/trybeSmith.git
  1. Entre na pasta do repositório que você acabou de clonar:
cd trybeSmith
Rodando Projeto no Docker vs Localmente

Com Docker

! É 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 comando docker-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


Sem Docker

Instale as dependências [Caso existam] com npm install

Descrição da aplicação

- 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 e

Validaçã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]
}


Testes de Corbetura

  • Os testes de cobertura apresentam uma média de 93%, onde são testadas todas as funções e rotas; tests-coverage
  1. Para rodar a aplicação:
A aplicação é executada automaticamente
  1. Para abrir o terminal do docker
 docker exec -it trybesmith_api bash
  1. Para criar e popular as tabelas:
npx db:reset
  1. Para testar a aplicação: Testar todas:
npm test

Testar individuamente:

  • Colocar o número do requisito a ser testado;
npm test **01** 
  1. Para testar a cobertura da aplicação:
npm run test:coverage

Requisitos 100%

  • 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;