Skip to content

georgia-rocha/trybeSmith

Folders and files

NameName
Last commit message
Last commit date
May 25, 2023
Jun 5, 2023
Jun 5, 2023
May 24, 2023
May 24, 2023
May 24, 2023
May 24, 2023
May 24, 2023
May 24, 2023
May 24, 2023
May 24, 2023
May 24, 2023
May 24, 2023
May 24, 2023
Jun 6, 2023
May 31, 2023
May 24, 2023
Jun 1, 2023
Jun 6, 2023
May 24, 2023

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 [email protected]: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;