Skip to content

tpaphysics/nestjs-graphql-jwt

Repository files navigation

yarn NestJs Graphql Prisma.io Docker Postgres Prisma

💻 Projeto

Criamos uma API GraphQL com autenticação JWT utilizando o framework Nest. Assim um usuário autenticado poderá criar, deletar, pesquisar e atualizar uma tabela de usuários no banco de dados. Usamos também o Prisma como ORM e criamos um container com o banco de dados postgres usando o Docker Compose.

🚀 Get Started

# Dependências
$ yarn
  
# Container com banco de dados postgress.
$ yarn up:db
  
# Migração dos models definidos no schema.prisma
$ yarn prisma migrate dev

# watch mode
$ yarn start:dev

Para remover o container com o postgres:

$ yarn rm:db

🛣️ Rotas

Acesse o playground:

http://localhost:3000/graphql

No playgorund temos um cliente http e a documentação da API gerada automaticamente.

🔎 Observações

Somente as mutations authenticate e createUsers são públicas. Para tornar todas as querys e mutations públicas basta colocar o decorator @IsPublicRoute() no UsersResolver como no exemplo abaixo:

@IsPublicRoute()

export class UsersResolver {
  constructor(private readonly usersService: UsersService) {}
  ...//more
}

🔒 Login

Usando o playground:

http://localhost:3000/graphql

Você deve criar um novo usuário.

mutation {
  createUser(
    createUserInput: {
      name: "R2D2"
      email: "[email protected]"
      password: "r2d2"
    }
  ) {
    id
    name
    email
  }
}

Após criar o novo usuário, realize a mutation:

mutation {
  authenticate(authInput: { email: "[email protected]", password: "r2d2" }) {
    user {
      id
      email
      name
    }
    access_token
  }
}

Como resposta, receberá algo do tipo:

{
  "data": {
    "authenticate": {
      "user": {
        "id": "cl2vf150x0007qvqm2m15wf5f",
        "email": "[email protected]",
        "name": "R2D2"
      },
      "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbDJ2ZjE1MHgwMDA3cXZxbTJtMTV3ZjVmIiwiZW1haWwiOiJkYXJ0aEB2YWRlci5jb20iLCJuYW1lIjoiZGFydCIsImlhdCI6MTY1MTkwMDg1NiwiZXhwIjoxNjU0NDkyODU2fQ.6MdzP1bktgtIL0xWqiPDl0NtP6g69u1cjnjYIH3aOzI"
    }
  }
}

Copie e cole o access_token conforme a figura abaixo:

📁 Upload de arquivos

Faça login, obtenha um token valido e execute o script abaixo que esta no diretorio corrente do projeto, uploadRequest.sh:

token="seu_token"
path="./README.md"

curl http://localhost:3000/graphql \
    -H "Authorization: Bearer $token" \
    -H 'connection: keep-alive' \
    -F 'operations="{\"query\":\"mutation($file: Upload!){\n\tuploadFile(file:$file)\n} \",\"variables\":{\"file\":null}}"' \
    -F 'map={ "nFile": ["variables.file"] }' \
    -F nFile=@$path

Após a execução do script o arquivo README.md estará na pasta uploads.

💥 Considerações

A arbodagem das APIs GraphQL é bem diferente do padrão REST. No padrão REST temos os métodos GET, POST, PUT, DELETE, UPDATE. Enquanto que no padrão GraphQL existe somente o método POST com o conceito de QUERY e MUTATION. O GraphQL se destaca em resover os problemas de over-fetching e under-fetching recocorrente em grandes projetos, com um número muito grande de usuários, quando comparado ao padrão REST. Na minha opiniçao não devemos ser amantes de tecnologias, pois elas sempre mudam com o tempo. Devemos escolher a tecnologia que melhor se adapta ao nosso problema.

👨‍🚀 Autor

Thiago Pacheco
Thiago Pacheco de Andrade

👋 Meus contatos!

Linkedin Badge Gmail Badge

Licença

Veja o arquivo MIT license.