{"id":267,"date":"2026-06-18T00:04:23","date_gmt":"2026-06-18T05:04:23","guid":{"rendered":"https:\/\/jeffsantillan.com\/blog\/?p=267"},"modified":"2026-06-18T15:07:41","modified_gmt":"2026-06-18T20:07:41","slug":"nestjs-aplicacion-de-matricula-a-curso-parte-iii","status":"publish","type":"post","link":"https:\/\/jeffsantillan.com\/blog\/nestjs-aplicacion-de-matricula-a-curso-parte-iii\/","title":{"rendered":"Nestjs aplicaci\u00f3n de matricula a curso &#8211; Parte III"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Vamos a continuar con la creacion del proyecto, para esta ocasion vamos a crear la secci\u00f3n de docente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Definimos las entidades y los DTOs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Entities (Entidades):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>docente.entity.ts<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>export class Docente {\n    id!: number;\n    nombre!: string;\n    apellido!: string;\n    dni!: string;\n    email!: string;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">DTOs (Data Transfer Object)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>create-docente.dto.ts<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>export class CreateDocenteDto {\n    nombre!: string;\n    apellido!: string;\n    dni!: string;\n    email!: string;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para actualizar se entiende que extiende de Create<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>update-docente.dto.ts<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>import { PartialType } from '@nestjs\/mapped-types';\nimport { CreateDocenteDto } from '.\/create-docente.dto';\n\nexport class UpdateDocenteDto extends PartialType(CreateDocenteDto) {}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora si empezamos con el servicio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>docente.service.ts<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>import { Injectable, NotFoundException } from '@nestjs\/common';\nimport { PrismaService } from '..\/prisma\/prisma.service';\nimport { CreateDocenteDto } from '.\/dto\/create-docente.dto';\nimport { UpdateDocenteDto } from '.\/dto\/update-docente.dto';\n\n@Injectable()\nexport class DocenteService {\n\n  constructor(private prisma: PrismaService){}\n\n  create(data: CreateDocenteDto) {\n    return this.prisma.docente.create({ data })\n  }\n\n  findAll() {\n    return this.prisma.docente.findMany({\n      include: { cursos: true }\n    });\n  }\n\n  async findOne(id: number) {\n    const docente = await this.prisma.docente.findUnique({\n      where: { id },\n      include: { cursos: true }\n    });\n    if (!docente) throw new NotFoundException('Docente ${id} no ha sido encontrado');\n    return docente;\n  }\n\n  async update(id: number, data: UpdateDocenteDto) {\n    await this.findOne(id);\n    return this.prisma.docente.update({\n      where: { id },\n      data\n    });\n  }\n\n  async remove(id: number) {\n    await this.findOne(id);\n    return this.prisma.docente.delete({ where: { id }});\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente, creamos o si utilizamos los generadores, solo tendr\u00edamos que adecuar el Controller por que ya viene todo pre hecho.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>docente.controller.ts<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs\/common';\nimport { DocenteService } from '.\/docente.service';\nimport { CreateDocenteDto } from '.\/dto\/create-docente.dto';\nimport { UpdateDocenteDto } from '.\/dto\/update-docente.dto';\n\n@Controller('docente')\nexport class DocenteController {\n  constructor(private readonly docenteService: DocenteService) {}\n\n  @Post()\n  create(@Body() body: CreateDocenteDto) {\n    return this.docenteService.create(body);\n  }\n\n  @Get()\n  findAll() {\n    return this.docenteService.findAll();\n  }\n\n  @Get(':id')\n  findOne(@Param('id') id: string) {\n    return this.docenteService.findOne(+id);\n  }\n\n  @<strong>Patch<\/strong>(':id')\n  update(@Param('id') id: string, @Body() body: UpdateDocenteDto) {\n    return this.docenteService.update(+id, body);\n  }\n\n  @Delete(':id')\n  remove(@Param('id') id: string) {\n    return this.docenteService.remove(+id);\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para este caso utilizamos el m\u00e9todo PATCH en lugar de PUT, as\u00ed tendremos que enviar el cambio o el body del cambio puntual y no toda la estructura.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Modulo. Realmente, no hay nada que modificar aqu\u00ed si fue creado con los generadores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>docente.module.ts<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>import { Module } from '@nestjs\/common';\nimport { DocenteService } from '.\/docente.service';\nimport { DocenteController } from '.\/docente.controller';\n\n@Module({\n  controllers: &#91;DocenteController],\n  providers: &#91;DocenteService],\n})\nexport class DocenteModule {}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bien, vamos a probar con PowerShell.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Levantamos el servicio con:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm run start:dev<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Los comandos para crear, listar, consultar \u00fanico registro, actualizar y eliminar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Utilizaremos el comando : Select-Object -ExpandProperty Content para que solo se muestra la respuesta en formato json.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>| Select-Object -ExpandProperty Content<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Se puede complementar con:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>| ConvertFrom-Json<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Considera tambi\u00e9n incluir el par\u00e1metro -UseBasicParsing<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-UseBasicParsing<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Crear<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>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<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Listar<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>Invoke-WebRequest -Uri http:\/\/localhost:3000\/docente -Method GET | Select-Object -ExpandProperty Content<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Obtener un registro por ID<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>Invoke-WebRequest -Uri http:\/\/localhost:3000\/docente\/1 -Method GET | Select-Object -ExpandProperty Content<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Actualizar <\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>Invoke-WebRequest -Uri http:\/\/localhost:3000\/docente\/1 -Method PUT -Headers @{\"Content-Type\"=\"application\/json\"} -Body '{\"nombre\":\"Carlos Alberto\"}' | Select-Object -ExpandProperty Content<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Eliminar<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>Invoke-WebRequest -Uri http:\/\/localhost:3000\/docente\/1 -Method DELETE | Select-Object -ExpandProperty Content<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ya tenemos las funciones hacia la tabla operando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a1Saludos!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos a continuar con la creacion del proyecto, para esta ocasion vamos a crear la secci\u00f3n &hellip; <a title=\"Nestjs aplicaci\u00f3n de matricula a curso &#8211; Parte III\" class=\"hm-read-more\" href=\"https:\/\/jeffsantillan.com\/blog\/nestjs-aplicacion-de-matricula-a-curso-parte-iii\/\"><span class=\"screen-reader-text\">Nestjs aplicaci\u00f3n de matricula a curso &#8211; Parte III<\/span>Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":2,"featured_media":211,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[49],"class_list":["post-267","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-nestjs","tag-nestjs"],"_links":{"self":[{"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/posts\/267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/comments?post=267"}],"version-history":[{"count":4,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/posts\/267\/revisions"}],"predecessor-version":[{"id":271,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/posts\/267\/revisions\/271"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/media\/211"}],"wp:attachment":[{"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/media?parent=267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/categories?post=267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/tags?post=267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}