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.
# 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
Acesse o playground:
http://localhost:3000/graphql
No playgorund temos um cliente http e a documentação da API gerada automaticamente.
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
}
Usando o playground:
http://localhost:3000/graphql
Você deve criar um novo usuário.
mutation {
createUser(
createUserInput: {
name: "R2D2"
email: "r2d2@star.com"
password: "r2d2"
}
) {
id
name
email
}
}
Após criar o novo usuário, realize a mutation:
mutation {
authenticate(authInput: { email: "r2d2@star.com", password: "r2d2" }) {
user {
id
email
name
}
access_token
}
}
Como resposta, receberá algo do tipo:
{
"data": {
"authenticate": {
"user": {
"id": "cl2vf150x0007qvqm2m15wf5f",
"email": "r2d2@star.com",
"name": "R2D2"
},
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjbDJ2ZjE1MHgwMDA3cXZxbTJtMTV3ZjVmIiwiZW1haWwiOiJkYXJ0aEB2YWRlci5jb20iLCJuYW1lIjoiZGFydCIsImlhdCI6MTY1MTkwMDg1NiwiZXhwIjoxNjU0NDkyODU2fQ.6MdzP1bktgtIL0xWqiPDl0NtP6g69u1cjnjYIH3aOzI"
}
}
}
Copie e cole o access_token conforme a figura abaixo:
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
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.
Thiago Pacheco de Andrade
👋 Meus contatos!
Veja o arquivo MIT license.