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.