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

  1. 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 -v

  2. Instalaçã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.

    commands
    npm install -g @nestjs/cli
    nest new api-restful

  3. Instalaçã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.

    commands
    npm install prisma --save-dev
    npx prisma init --datasource-provider sqlite

  4. Definiçã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_prisma
    model Produto {
      id    Int     @id @default(autoincrement())
      nome  String
      preco Float
    }
    

    commands
    npx prisma migrate dev --name init

  5. 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.

    commands
    nest generate module produto
    nest generate controller produto
    nest generate service produto

  6. Implementaçã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.ts
    import { 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 } });
      }
    }
    

  7. 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.ts
    import { 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);
      }
    }
    

  8. 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.ts
    import { Injectable } from '@nestjs/common';
    import { PrismaClient } from '@prisma/client';
    
    @Injectable()
    export class PrismaService extends PrismaClient {
      constructor() {
        super();
      }
    }
    

  9. 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.

    commands
    npm 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.

Hashtags

#TypeScript #NestJS #Prisma #APIs #DesenvolvimentoDeSoftware