Arquitetura de APIs GraphQL com NestJS e Prisma: Guia Prático

Introdução ao Stack Tecnológico

A combinação de NestJS, Prisma ORM e GraphQL oferece uma base sólida para o desenvolvimento de backensd moedrnos e escaláveis. Esta abordagem permite tipagem forte, autogeração de documentação e uma gestão eficiente de banco de dados. Ao utilizar um template inicial configurado, é possível focar na lógica de negócio enquanot se beneficia de autenticação JWT, integração com Swagger e containerização pronta para uso.

Configuração do Ambiente de Desenvolvimento

Para iniciar, certifique-se de que o Node.js e o gerenciador de pacotes npm estejam instalados na máquina local. O próximo passo consiste em obter o código base e instalar as dependências necessárias. Execute os seguintes comandos no terminal:

git clone https://github.com/exemplo/nestjs-graphql-base.git
cd nestjs-graphql-base
npm install

Após a instalação, é crucial configurar a conexão com o banco de dados. Localize o arquivo prisma/schema.prisma e ajuste o bloco datasource conforme o provedor escolhido. Para um ambiente PostgreSQL, a configuração da variável de ambiente deve ser semelhante a:

datasource database {
  provider = "postgresql"
  url      = env("DB_CONNECTION_STRING")
}

Definição do Modelo de Dados

O coração do GraphQL reside em seu sistema de tipos. No contexto deste projeto, os tipos são definidos para refletir as entidades do banco de dados. Considere o arquivo graphql/article.graphql, que estrutura o tipo Article:

type Article {
  id: ID!
  headline: String!
  body: String!
  isPublic: Boolean!
  writer: User!
  createdat: DateTime!
  modifiedat: DateTime!
}

Esta definição encapsula os atributos essenciais de um artigo, incluindo identificação, título, conteúdo, status de visibilidade e relações com o autor. Os campos de data registram automaticamente a criação e a última modificação do registro.

Implementando Consultas (Queries)

Para recuperar informações do servidor, utilizamos operações de leitura definidas no tipo Query dentro do schema principal. Exemplos de operações disponíveis incluem:

type Query {
  articles(filter: ArticleFilterInput): ArticleList!
  article(id: ID!): Article
  members(limit: Int): UserList!
  member(id: ID!): User
  currentProfile: User
}

Essas resolvers permitem a busca por listagens paginadas, itens individuais e dados do usuário autenticado. Um exemplo de requisição para listar artigos publicados seria:

query {
  articles {
    items {
      id
      headline
      isPublic
    }
  }
}

Operações de Escrita (Mutations)

A modificação do estado da aplicação é realizada através de Mutations. O schema define métodos para gestão de usuários e conteúdo, como criação, atualização e exclusão. Exemplo de definição:

type Mutation {
  register(input: RegisterInput!): AuthPayload!
  authenticate(input: LoginInput!): AuthPayload!
  draftArticle(input: CreateArticleInput!): Article!
  editArticle(id: ID!, input: UpdateArticleInput!): Article!
  removeArticle(id: ID!): Boolean!
  modifyCredentials(input: PasswordChangeInput!): Boolean!
}

Para publicar novo conteúdo, o cliente envia uma mutation específica com os dados necessários:

mutation {
  draftArticle(input: {
    headline: "Primeiro Artigo"
    body: "Conteúdo inicial do projeto"
    isPublic: true
  }) {
    id
    headline
    isPublic
  }
}

Segurança e Controle de Acesso

A proteção dos endpoints é garantida através de autenticação baseada em tokens JWT. O fluxo inicia com o registro ou login, retornando um token de acesso. Para operações restritas, como acessar o perfil atual, o token deve ser incluído no cabeçalho da requisição HTTP:

Authorization: Bearer <seu_token_jwt>

Com o token válido, a query currentProfile retorna os dados seguros do usuário logado:

query {
  currentProfile {
    id
    email
    name
  }
}

Containerização e Deploy

O projeto inclui configurações para Docker, facilitando a execução isolada dos serviços. Utilizando o docker-compose, é possível subir a aplicação e o banco de dados simultaneamente com o comando:

docker-compose up -d

Após a inicialização dos containers, a interface GraphQL Playground estará disponível para testes e validação das consultas no endereço http://localhost:3000/graphql.

Tags: NestJS Prisma ORM GraphQL API JWT Auth Docker Compose

Publicado em 9-9 10:46