Skip to content

thiagosf-dev/api-rest-nodejs-solid

Repository files navigation

API GymPass

Projeto do módulo 3 do curso de Nodejs da Rocktseat (GymPass style App)

Requisitos Funcionais

  • deve ser possível se cadastrar
  • deve ser possível se autenticar
  • deve ser possível obter o perfil de um usuário logado
  • deve ser possível obter o número de check-ins realizados pelo usuário logado
  • deve ser possível o usuário obter seu histórico de check-ins
  • deve ser possível o usuário buscar academias próximas
  • deve ser possível o usuário buscar academias pelo nome
  • deve ser possível o usuário realizar chack-in em uma academia
  • deve ser possível validar o check-in de um usuário
  • deve ser possível cadastrar uma academia

Regras de Negócio

  • o usuário não deve poder se cadastrar com um e-mail duplicado
  • o usuário não pode fazer 2 check-ins no mesmo dia
  • o usuário não pode fazer check-in se não estiver perto (100m) da academia
  • o check-in só pode ser valido até 20 minutos após criado
  • o check-in só pode ser validado por administradores
  • a academia só pode ser cadastrada por administradores
  • [ ]

Requisitos Não Funcionais

  • a senha do usuário precisa estar criptografada
  • os dados da aplicação precisam estar persistido em um banco PostgreSQL
  • todas as listas de dados precisam estar paginadas com 20 itens por página
  • o usuário deve ser identificado por um JWT

Tecnologias utilizadas

  • Javascript
  • Typescript
  • NodeJS
  • NPM
  • Git
  • Editor Config
  • Dotenv
  • Zod
  • Eslint
  • Prisma ORM
  • Docker
  • Bcrypt
  • Vitest

Conceitos aplicados

  • Design de Software
  • Engenharia de Requisitos
  • Variáveis de ambiente
  • Validação de variáveis via schema validation
  • Padrão de lint de codificação
  • Aliases de importação
  • Object Relational Mapping
  • Migrations
  • Containerização com Docker
  • Docker hub
  • Docker compose
  • Criptografia Hashing
  • Primary key e Foregein key
  • Relacionamentos entre tabelas
  • Estruturando com controllers e services
  • Criptografia e hash para senha
  • S.O.L.I.D.
  • Repository pattern
  • Handler de erros globais
  • Testes Unitários
  • In Memory Test Database
  • Coverage Report
  • UI view para os testes
  • Aplicando (SUT - system under test) como um modelo para maior produtividade na implementação dos testes
  • Factory Pattern

Geral

  1. adicionado o arquivo .gitignore

  2. adicionado o arquivo .editorconfig

Git

  1. projeto iniciado com o comando

      git init
  2. repositório do projeto disponibilizado em: https://github.com/thiagosf-dev/api-rest-nodejs-solid

Starter

  1. projeto criado com o comando:

      npm init

Typescript

  1. instalação com o comando:

      npm i -D typescript @types/node tsx tsup
  2. criado o arquivo tsconfig.json com o comando:

      npx tsc --init
  3. configurado o arquivo tsconfig.json para alias import:

      "baseUrl": "./",
      "paths": {
        "@/*": [
          "./src/*"
        ]
      },

Fastify

  1. instalado com o comando:

      npm i fastify

NPM

  1. criado na raíz do projeto o arquivo .npmrc com a seguinte configuração:

      save-exact=true
    

Environments Variables

  1. criado o arquivo .env e o .env.example com a seguinte configuração:

      NODE_ENV=dev
  2. instalado Dotenv com o comando:

      npm i dotenv

Zod

  1. instalado com o comando:

      npm i zod

Eslint

  1. instalado o ESLint com o comando:

      npm i -D eslint @rocketseat/eslint-config
  2. criado na raíz do projeto o arquivo de configuração do ESLint: .eslintrc.json

  3. configurado o .eslintrc.json: { "extends": [ "@rocketseat/eslint-config/node" ] }

  4. criado script para rodar o ESlint e fazer o fix: `"eslint:fix": "eslint --ext .js,.ts src --fix"````

  5. criado o arquivo .eslintignore

Prisma ORM

  1. instalado com o comando:

      npm i -D prisma
  2. iniciado o Prisma com o comando:

      npx prisma init
  3. instalada a extensão do vscode para o Prisma: prisma.io

  4. ajustado o arquivo .vscode/settings.json:

      {
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
          "sourse.fixAll.eslint": true,
          "source.organizeImports": false
        },
        "files.eol": "\n",
        "[javascript]": {
          "editor.formatOnSave": false,
          "editor.codeActionsOnSave": {
            "source.fixAll.eslint": true
          }
        },
        "[prisma]": {
          "editor.formatOnSave": true
        },
        "[typescript]": {
          "editor.formatOnSave": false,
          "editor.codeActionsOnSave": {
            "source.fixAll.eslint": true
          }
        },
      }
  5. criada a tipagem automatizada do model com o comando:

      npx prisma generate
  6. instalada dependência para manipular o banco de dados com o comando:

      npm i @prisma/client
  7. rodando as migrations com o comando:

      npx prisma migrate dev
    
  8. rodando o Prisma Studio com o comando:

      npx prisma studio
    

Docker

  1. instalado docker desktop

  2. versão do docker informada no comando:

      docker -v
  3. imagem do Postgres da Bitname excutada com o comando:

      docker run --name api-solid-pg -e POSTGRESQL_USERNAME=docker -e POSTGRESQL_PASSWORD=docker -e POSTGRESQL_DATABASE=apisolidpg -p 5432:5432 bitnami/postgres
  4. listando todos os containers que estão em execução:

      docker ps
  5. listando todos os containers já criados:

      docker ps -a
  6. subindo o container:

      docker start api-solid-pg
  7. parando o container:

      docker stop api-solid-pg
  8. removendo o container:

      docker rm api-solid-pg
  9. visualizando os logs d container:

      docker logs api-solid-pg

Docker Compose

  1. criado na raíz do projeto o arquivo docker-compose.yml

  2. subindo container com o docker compose:

      docker compose up -d
  3. parando container com o docker compose:

      docker compose stop
  4. removendo container com o docker compose:

      docker compose down

Bcrypt

  1. instaldo com o comando:

      npm i bcryptjs
      npm i -D @types/bcryptjs

Teste

  1. instalação do Vitest:

      npm i -D vitest vite-tsconfig-paths
  2. criado na raíz do projeto o arquivo vite.config.ts

  3. criado no package.json o script:

     "test": "vitest run",
     "test:w": "vitest"
  4. instalada a lib de coverage @vitest/coverage-v8 após executar o seguinte script adicionado no package.json

      "test:c": "vitest run --coverage"

    com o comando:

      npm run test:c
  5. instalada a UI do vitest com o comando:

      npm i -D @vitest/ui
    
  6. criado no package.json o script para executar a UI:

      "test:ui": "vitest --ui"

    com o comando:

      npm run test:ui
    

Como testar essa API

  1. em uma pasta de sua preferência, faça o clone do projeto com o comando:

      git clone https://github.com/thiagosf-dev/api-rest-nodejs-solid.git
  2. abra a pasta criada após o comando acima, e digite o comando:

      npm install

About

Ignite Rocketseat

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published