Node

Criando CRUD com Prisma ORM e NestJS

Neste artigo vamos implementar um CRUD com Prisma ORM e NestJS, abordando as principais operações básicas com o banco de dados.

há 6 meses 2 semanas

Formação Desenvolvedor Node Full-Stack
Conheça a formação em detalhes

No artigo Trabalhando com Prisma ORM e NestJS criamos uma aplicação base para demonstrar como utilizar o Prisma junto ao NestJS, agora vamos dar continuidade nesta aplicação e implementar um CRUD (Create, Read, Update, Delete) completo.

Node.js - Fundamentos
Curso Node.js - Fundamentos
Conhecer o curso

Base do projeto

Conforme citado no artigo anterior, configuramos a base de um projeto com NestJS e o Prisma ORM, a aplicação base pode ser baixada neste repositório do github.

Vale salientar dois pontos, neste projeto base há um banco de dados configurado no arquivo schema.prisma e o model User, lembrando que o banco app-prisma já deve existir.

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = "mysql://root:treinaweb@localhost:3306/app-prisma" // Obs: ao configurar o Prisma, ele irá gerar um arquivo .env, neste arquivo estará a string de conexão.
}

model User {
  id Int @id @default(autoincrement())
  name String
  email String @unique
  description String 

  @@map("users")
}

A migration respectiva a criação da tabela User também já foi criada, gerando o seguinte arquivo .sql:

-- CreateTable
CREATE TABLE `users` (
    `id` INTEGER NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(191) NOT NULL,
    `email` VARCHAR(191) NOT NULL,
    `description` VARCHAR(191) NOT NULL,

    UNIQUE INDEX `users_email_key`(`email`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Para rodar a migration, é necessário executar o comando XPTO

Implementando o CRUD com o Prisma ORM

Com o banco de dados e o model User configurados, precisamos dar continuidade na implementação das operações básicas do CRUD na camada de serviço, havíamos implementado o método create(). responsável por criar um registro de usuário. Agora vamos implementar as outras operações, relacionadas a leitura dos registros, atualização e exclusão.

//user.service.ts
import { Injectable } from '@nestjs/common';
import { Prisma } from '@prisma/client';
import { PrismaService } from 'src/prisma.servce';

@Injectable()
export class UserService {
  constructor(private prisma: PrismaService) {}

  async create(user: Prisma.UserCreateInput) {
    return await this.prisma.user.create({ data: user });
  }

  async findAll() {
    return await this.prisma.user.findMany();
  }

  async findOne(id: number) {
    return await this.prisma.user.findUnique({ where: { id: Number(id) } });
  }

  async update(id: number, user: Prisma.UserCreateInput) {
    return await this.prisma.user.update({
      where: { id: Number(id) },
      data: {
        name: user.name,
        email: user.email,
        description: user.description,
      },
    });
  }

  async delete(id: number) {
    return await this.prisma.user.delete({ where: { id: Number(id) } });
  }
}

Utilizando os métodos do Prisma

Nest.js - Fundamentos
Curso Nest.js - Fundamentos
Conhecer o curso

Veja que utilizamos o PrismaService com injeção de dependências, ele irá prover uma série de métodos que irão nos auxiliar na execução das operações com banco de dados.

  • create: conforme visto anteriormente, este é o método responsável por criar um novo registro no banco, neste caso estamos passando como parâmetro um user. do tipo Prisma.UserCreateInput, como o nome diz, que possuí as propriedades do model respectivo. Lembrando que o Prisma cria esse tipo automaticamente.
  • findAll: este método é responsável por retornar todos os registros, não recebe parâmetros. Utilizamos o método findMany() do Prisma para retornar todos os registros, também poderíamos utilizar uma busca com where via parâmetro para filtrar os resultados.
  • findOne: este método é responsável por retornar somente um registro, recebe um parâmetro que será utilizado para filtrar o resultado. Utilizamos o método findUnique() do Prisma, que retorna o primeiro registro encontrado conforme o filtro utilizado, diferente do findMany(), neste caso, passamos o where como parâmetro, para retornar somente o registro que tinha a propriedade id correspondente.
  • update: este método é responsável por atualizar um registro do banco, recebendo um parâmetro para filtrar o registro que será atualizado e outro parâmetro com as informações de atualização. Utilizamos o método update() do Prisma e passamos como parâmetro a condição where para filtrar o registro e a propriedade data para acessar e atualizar os dados do registro.
  • delete: este método é responsável por excluir um registro, recebe um parâmetro que será utilizado para selecionar o registro a ser excluído. Utilizamos o método delete() do Prisma, passando como parâmetro a condição where.

Perfeito, perceba que o Prisma provê os métodos necessários para a implementação das operações básicas com o Banco de Dados. De forma prática, podemos utilizar condições como parâmetros para buscar, excluir e atualizar estes registros.

Implementando rotas

Agora precisamos criar a rota respectiva para cada operação do CRUD, o arquivo ficará da seguinte maneira:

import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Post,
  Put,
} from '@nestjs/common';
import { UserService } from './user.service';
import { Prisma } from '@prisma/client';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post()
  async create(@Body() user: Prisma.UserCreateInput) {
    return this.userService.create(user);
  }

  @Get()
  async findAll() {
    return this.userService.findAll();
  }

  @Get(':id')
  async findOne(@Param('id') id: number) {
    return this.userService.findOne(id);
  }

  @Put(':id')
  async update(@Param('id') id: number, @Body() user: Prisma.UserCreateInput) {
    return this.userService.update(id, user);
  }

  @Delete('id')
  async delete(@Param('id') id: number) {
    return this.userService.delete(id);
  }
}

Veja que agora configuramos as rotas utilizando os métodos implementados com o Prisma que estão na camada de serviço aplicando a injeção de dependências.

Testando a aplicação

Agora vamos usar o insomnia para testar a rotas:

  • Cadastro de usuário

Cadastro de usuário

  • Buscar usuário por id

Buscar usuário por ID

  • Buscar todos os usuários

Buscar todos os usuários

  • Atualizar usuário

Atualizar dados do usuário

  • Excluir usuário

Excluir usuário

Nest.js  - Banco de dados com TypeORM
Curso Nest.js - Banco de dados com TypeORM
Conhecer o curso

Conclusão

Continuamos o artigo Trabalhando com Prisma ORM e NestJS, implementando todas as rotas relacionadas a um CRUD básico, utilizando os métodos providos pelo Prisma, que permite essa implementação de forma prática e simples.

Por fim, caso queira aprender mais sobre NestJS saiba que aqui na TreinaWeb temos o curso Nest.js - Fundamentos que possui 02h07 de vídeos e um total de 18 exercícios. Conheça também nossos outros cursos de TypeScript.

Veja quais são os tópicos abordados durante o curso de Nest.js - Fundamentos:

  • Conhecendo a estrutura;
  • Utilizando Nest CLI
  • Entendendo Rotas, Controllers e Views;;
  • Conexão com banco de dados;
  • Usando TypeORM;
  • Template Engine.

Autor(a) do artigo

Wesley Gado
Wesley Gado

Formado em Análise e Desenvolvimento de Sistemas pelo Instituto Federal de São Paulo, atuou em projetos como desenvolvedor Front-End. Nas horas vagas grava Podcast e arrisca uns três acordes no violão.

Todos os artigos

Artigos relacionados Ver todos