Vamos a continuar con la creacion del proyecto, para esta ocasion vamos a crear la sección de docente.
Definimos las entidades y los DTOs.
Entities (Entidades):
docente.entity.ts
export class Docente {
id!: number;
nombre!: string;
apellido!: string;
dni!: string;
email!: string;
}
DTOs (Data Transfer Object)
create-docente.dto.ts
export class CreateDocenteDto {
nombre!: string;
apellido!: string;
dni!: string;
email!: string;
}
Para actualizar se entiende que extiende de Create
update-docente.dto.ts
import { PartialType } from '@nestjs/mapped-types';
import { CreateDocenteDto } from './create-docente.dto';
export class UpdateDocenteDto extends PartialType(CreateDocenteDto) {}
Ahora si empezamos con el servicio.
docente.service.ts
import { Injectable, NotFoundException } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { CreateDocenteDto } from './dto/create-docente.dto';
import { UpdateDocenteDto } from './dto/update-docente.dto';
@Injectable()
export class DocenteService {
constructor(private prisma: PrismaService){}
create(data: CreateDocenteDto) {
return this.prisma.docente.create({ data })
}
findAll() {
return this.prisma.docente.findMany({
include: { cursos: true }
});
}
async findOne(id: number) {
const docente = await this.prisma.docente.findUnique({
where: { id },
include: { cursos: true }
});
if (!docente) throw new NotFoundException('Docente ${id} no ha sido encontrado');
return docente;
}
async update(id: number, data: UpdateDocenteDto) {
await this.findOne(id);
return this.prisma.docente.update({
where: { id },
data
});
}
async remove(id: number) {
await this.findOne(id);
return this.prisma.docente.delete({ where: { id }});
}
}
Finalmente, creamos o si utilizamos los generadores, solo tendríamos que adecuar el Controller por que ya viene todo pre hecho.
docente.controller.ts
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { DocenteService } from './docente.service';
import { CreateDocenteDto } from './dto/create-docente.dto';
import { UpdateDocenteDto } from './dto/update-docente.dto';
@Controller('docente')
export class DocenteController {
constructor(private readonly docenteService: DocenteService) {}
@Post()
create(@Body() body: CreateDocenteDto) {
return this.docenteService.create(body);
}
@Get()
findAll() {
return this.docenteService.findAll();
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.docenteService.findOne(+id);
}
@Patch(':id')
update(@Param('id') id: string, @Body() body: UpdateDocenteDto) {
return this.docenteService.update(+id, body);
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.docenteService.remove(+id);
}
}
Para este caso utilizamos el método PATCH en lugar de PUT, así tendremos que enviar el cambio o el body del cambio puntual y no toda la estructura.
Modulo. Realmente, no hay nada que modificar aquí si fue creado con los generadores.
docente.module.ts
import { Module } from '@nestjs/common';
import { DocenteService } from './docente.service';
import { DocenteController } from './docente.controller';
@Module({
controllers: [DocenteController],
providers: [DocenteService],
})
export class DocenteModule {}
Bien, vamos a probar con PowerShell.
Levantamos el servicio con:
npm run start:dev
Los comandos para crear, listar, consultar único registro, actualizar y eliminar.
Utilizaremos el comando : Select-Object -ExpandProperty Content para que solo se muestra la respuesta en formato json.
| Select-Object -ExpandProperty Content
Se puede complementar con:
| ConvertFrom-Json
Considera también incluir el parámetro -UseBasicParsing
-UseBasicParsing
Crear
Invoke-WebRequest -Uri http://localhost:3000/docente -Method POST -Headers @{"Content-Type"="application/json"} -Body '{"nombre":"Carlos","apellido":"Perez","dni":"12345678","email":"carlos@edu.pe"}' | Select-Object -ExpandProperty Content
Listar
Invoke-WebRequest -Uri http://localhost:3000/docente -Method GET | Select-Object -ExpandProperty Content
Obtener un registro por ID
Invoke-WebRequest -Uri http://localhost:3000/docente/1 -Method GET | Select-Object -ExpandProperty Content
Actualizar
Invoke-WebRequest -Uri http://localhost:3000/docente/1 -Method PUT -Headers @{"Content-Type"="application/json"} -Body '{"nombre":"Carlos Alberto"}' | Select-Object -ExpandProperty Content
Eliminar
Invoke-WebRequest -Uri http://localhost:3000/docente/1 -Method DELETE | Select-Object -ExpandProperty Content
Ya tenemos las funciones hacia la tabla operando.
¡Saludos!