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.
Curso Node.js - Fundamentos
Conhecer o cursoBase 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
Curso Nest.js - Fundamentos
Conhecer o cursoVeja 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 tipoPrisma.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 comwhere
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 dofindMany()
, neste caso, passamos owhere
como parâmetro, para retornar somente o registro que tinha a propriedadeid
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çãowhere
para filtrar o registro e a propriedadedata
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çãowhere
.
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.
- create: Rota POST para cadastrar novo usuário, sendo acessado pera url http://localhost:3000/user.
- findOne: Rota GET passando o parâmetro id para buscar um registro, sendo acessado pela url http://localhost:3000/user/[id]
- findAll: Rota Get para retornar todos os registros, sendo acessado pela url http://localhost:3000/user.
- update: Rota PUT passando o parâmetro id para atualizar o registro, sendo acessado pela url http://localhost:3000/user/[id]
- delete: Rota DELETE passando o parâmetro id para excluir o registro, sendo acessado pela url http://localhost:3000/user/[id]
Testando a aplicação
Agora vamos usar o insomnia para testar a rotas:
- Cadastro de usuário
- Buscar usuário por id
- Buscar todos os usuários
- Atualizar usuário
- Excluir usuário
Curso Next.js - Fundamentos
Conhecer o cursoConclusã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.