I'm having difficulty creating a crud in nestjs and I need help, I bought a course and it turned out that the guy was a crook and I was scammed so I would only like some help if it's not too problematic
I would like to receive a tip or assistance in creating a crud
Top comments (4)
antes de qualquer coisa
instalar nestjs e criar a pasta do projeto (npm nest new (nome do projeto))
INÍCIO
a partir da criação de novos módulos coloquemos no app.modules.ts em impots: [*] para tudo estar em funcionamento
Criar um controller tem como responsabilidade lidar com as requisições das aplicações clientes
ex: controller courses
npm nest g controller courses
// com isso o próprio nest vai criar a pasta(courses) com o controller e lá dentro poderá ser feito o CRUD(Create, Read, Update, Delete), além disso desta forma o localhost acrescenta /(nome do controller) para obter o resultado abaixo
ex: (Não esquecer de colocar as decorators para que cada método lide com a requisição desejada)
//para listar todos os itens
@Get() findAll(){return ‘Listagem de cursos’;}
//para procurar itens específicos por um parâmetro único
@Get(‘:id’) findOne(@param(‘id’) id: number ) { return ‘Curso com ID ${+id}’; }
//para criar um item
@post() create(@Body() body){ return body; }
//patch para atualizar uma informação e Put para atualizar tudo
@Patch(‘:id’) update(@param(‘id’) id: number, @Body() body){
console.log(message: body);
return ‘Update course with ID ${+id}’;}
//Para deletar um item pelo ID
@Delete(‘:id’) remove(@param(‘id’) id: number) { return ‘Delete course with ID ${+id}’;}
SERVICE
imagina em cada um dos acima você ter que implementar a lógica de negócio deles? ficaria um monstro, para evitar isso serve o service, ai no controller eu chamo um método do service para fazer oq a rota precisa resolver:
//para poder usar as instâncias do service no controller você tem que criar um método construtor e configurar as instâncias do service
//courses.controller.ts:
export class CoursesController{
constructor(private readonly/para manter a imutabilidade/ courseService: CoursesService) {}
ex: service courses
npm nest g service courses
aproveitando já vamos criar uma entidade para definir a estrutura de um recurso do tipo course
crie um arquivo chamado courses.entity.ts e lá dentro defina as propriedades que um curso deve ter: export class Course {id: number, name: string, description: string, tags: string[]}
com isso já temos a informação que um curso deve ter então podemos defini-la no courses.service.ts: dentro do export do @Injectable()
private courses: Course[] = [{
id: 1, name: ‘NestJS’, description: ‘Curso início Nestjs’, tags: [‘nestjs’, ‘node.js’]}]
//já temos a estrutura inicial do service e agora temos um curso já registrado então vamos fazer o CRUD
findAll(){ return this.courses}
findOne(id: number) { return this.courses.find(course => course.id === id)}
create(createCourseDTO: any){ this.courses.push(createCourseDTO)}
update(id: number, updateCourseDTO: any){ const existingCourse = this.findOne(id)
if (existingCourse){ const index = this.courses.findIndex(course=> course.id === id)
this.courses[index] = {id, … updateCourseDTO,}}}
remove(id: number){ const index = this.courses.findIndex(course=> course.id === id)
if (index >= 0){ this courses.splice(index, 1)}}
//agora que já temos os métodos implementados no service podemos usá los no controller
courses.controller.ts
@Get() findAll(){return this.courseService.findAll();}
@Get(‘:id’) findOne(@param(‘id’) id: number ) { return this.courseService.findOne(+id); }
@post() create(@Body() body){ return this.courseService.create(body); }
@Put(‘:id’) update(@param(‘id’) id: number, @Body() body){
return this.courseService.update(+id, body);}
@Delete(‘:id’) remove(@param(‘id’) id: number) { return this.courseService.remove(+id);}
//agora é interessante você criar um módulo para encapsular este conjunto de recursos você pode criar um módulo usando o seguinte comando:
ex: nest g module courses
//o próprio nest já vai atualizar o seu app.module.ts então você poderá retirar as importações do CoursesService e CoursesController e deixar a CoursesModule onde está, importando estas duas para a CoursesModule
// vai ficar assim:
@Module({
controllers: [CoursesController],
providers: [CoursesService]
})
export class CoursesModule {}
//agora se vc quiser que qualquer metodo do seu service seja acessível em outro módulo você adiciona:
ex: exports: [CoursesService]
//se não houver isso o tudo aqui fica apenas acessível dentro do module
Se for em mongoose utilize schema ao inves de entity ex:
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'
import { HydratedDocument } from 'mongoose'
export type UserDocument = HydratedDocument
@Schema({timestamps: true})
export class User {
@prop({ required: true })
nome: string
}
export const UserSchema = SchemaFactory.createForClass(User)
Esqueci tambem, crie uma pasta chamada dto e lá coloque createcourse.dto.ts e updatecourse.dto.ts e lá vc vai colocar:
export class CreateCourseDto {
@IsString()
@IsNotEmpty()
@MinLength(3)
@MaxLength(50)
nome: string
...
}
e
export class UpdateCourseDto extends PartialType(CreateCourseDto) {
@IsString()
@IsNotEmpty()
@MinLength(3)
@MaxLength(50)
nome: string
...
}
*export type UserDocument = HydratedDocument