Introdução
Neste tutorial, vamos explorar como maximizar a produtividade no desenvolvimento de APIs RESTful utilizando TypeScript, NestJS e Prisma. NestJS é um poderoso framework para construção de aplicações do lado do servidor que aproveita as vantagens do TypeScript, oferecendo uma arquitetura modular que facilita a escalabilidade e a manutenção. Por outro lado, Prisma é um ORM moderno que simplifica a manipulação do banco de dados, permitindo que você escreva consultas em alta produtividade. Neste guia, abordaremos passo a passo a criação de uma API RESTful funcional, desde a configuração do ambiente até a implementação e teste final da aplicação, proporcionando uma base sólida para desenvolvedores que desejam aprofundar seus conhecimentos nesse ecossistema.
Etapas
Configuração do Ambiente de Desenvolvimento
Para iniciar, você precisará ter Node.js e npm (Node Package Manager) instalados em sua máquina. Verifique as versões instaladas com os comandos `node -v` e `npm -v`. Caso não as tenha, faça o download do Node.js a partir do site oficial.
commands# Verificar versões instaladas
node -v
npm -vInstalação do NestJS CLI e Criação do Projeto
Instale o NestJS CLI globalmente utilizando npm. Em seguida, crie um novo projeto NestJS com o comando indicado. Durante a criação, escolha TypeScript como a linguagem.
commandsnpm install -g @nestjs/cli
nest new api-restfulInstalação do Prisma e Configuração do Banco de Dados
Inicie o Prisma no seu projeto e adicione um banco de dados. Neste exemplo, utilizaremos o SQLite para simplicidade. Executar o comando a seguir também irá gerar o arquivo `schema.prisma` onde podemos definir nosso modelo de dados.
commandsnpm install prisma --save-dev
npx prisma init --datasource-provider sqliteDefinição do Modelo de Dados
Abra o arquivo `schema.prisma` e defina o modelo de dados para um `Produto`, que incluirá propriedades como `id`, `nome` e `preco`. Depois, migre o banco de dados para refletir as mudanças.
schema_prismamodel Produto { id Int @id @default(autoincrement()) nome String preco Float }
commandsnpx prisma migrate dev --name init
Criação do Módulo `Produto`
Crie um módulo `Produto`, que inclui controlador e serviço. O controlador gerencia as rotas, enquanto o serviço contém a lógica de acesso ao banco de dados usando Prisma.
commandsnest generate module produto
nest generate controller produto
nest generate service produtoImplementação do Serviço `ProdutoService`
No arquivo `produto.service.ts`, implemente a lógica para interagir com o banco de dados usando Prisma, incluindo métodos para criar, listar, atualizar e deletar produtos.
produto_service.tsimport { Injectable } from '@nestjs/common'; import { PrismaService } from 'src/prisma.service'; import { Produto } from '@prisma/client'; @Injectable() export class ProdutoService { constructor(private readonly prisma: PrismaService) {} async create(produtoData: Omit<Produto, 'id'>): Promise<Produto> { return this.prisma.produto.create({ data: produtoData }); } async findAll(): Promise<Produto[]> { return this.prisma.produto.findMany(); } async findOne(id: number): Promise<Produto> { return this.prisma.produto.findUnique({ where: { id } }); } async update(id: number, data: Partial<Produto>): Promise<Produto> { return this.prisma.produto.update({ where: { id }, data }); } async delete(id: number): Promise<Produto> { return this.prisma.produto.delete({ where: { id } }); } }
Implementação do Controlador `ProdutoController`
Implemente o controlador `ProdutoController` para definir os endpoints da API que responderão às requisições HTTP. Adicione métodos para cada operação CRUD sobre produtos.
produto_controller.tsimport { Controller, Get, Post, Body, Param, Patch, Delete } from '@nestjs/common'; import { ProdutoService } from './produto.service'; import { Produto } from '@prisma/client'; @Controller('produtos') export class ProdutoController { constructor(private readonly produtoService: ProdutoService) {} @Post() create(@Body() produtoData: Omit<Produto, 'id'>) { return this.produtoService.create(produtoData); } @Get() findAll() { return this.produtoService.findAll(); } @Get(':id') findOne(@Param('id') id: number) { return this.produtoService.findOne(id); } @Patch(':id') update(@Param('id') id: number, @Body() data: Partial<Produto>) { return this.produtoService.update(id, data); } @Delete(':id') delete(@Param('id') id: number) { return this.produtoService.delete(id); } }
Configurando o Prisma Service
Crie um serviço Prisma para encapsular a lógica de acesso ao banco de dados e importá-lo no módulo principal e no módulo de produto. Isso permitirá que você se conecte ao banco de dados onde quer que precise.
prisma_service.tsimport { Injectable } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; @Injectable() export class PrismaService extends PrismaClient { constructor() { super(); } }
Executando a Aplicação e Testes
Execute a aplicação utilizando o comando a seguir. Você pode testar os endpoints utilizando ferramentas como Postman ou Insomnia para fazer chamadas HTTP e verificar a funcionalidade da sua API.
commandsnpm run start
# Exemplo de chamada com cURL
curl -X GET http://localhost:3000/produtos
Conclusão
Neste tutorial, você aprendeu a criar uma API RESTful utilizando TypeScript, NestJS e Prisma. Seguindo as etapas, você configurou o ambiente, definiu modelos de dados, implementou serviços, controladores, e testou a aplicação. Com essa compreensão, você está preparado para construir aplicações mais complexas e robustas, utilizando o potencial total do TypeScript e suas tipagens estáticas.