Publicado en

Nestjs aplicación de matricula a curso – Parte III

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!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *