{"id":249,"date":"2026-06-06T23:31:25","date_gmt":"2026-06-07T04:31:25","guid":{"rendered":"https:\/\/jeffsantillan.com\/blog\/?p=249"},"modified":"2026-06-07T00:03:43","modified_gmt":"2026-06-07T05:03:43","slug":"nestjs-aplicacion-de-matricula-a-curso-parte-ii","status":"publish","type":"post","link":"https:\/\/jeffsantillan.com\/blog\/nestjs-aplicacion-de-matricula-a-curso-parte-ii\/","title":{"rendered":"Nestjs aplicaci\u00f3n de matricula a curso &#8211; Parte II"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Toca escribir la funcionalidad del c\u00f3digo de servicios y controladores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Considera que la tablas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alumno = No depende de nadie<\/li>\n\n\n\n<li>Docente = No depende de nadie<\/li>\n\n\n\n<li>Curso = Depende de Docente<\/li>\n\n\n\n<li>Matricula = Depende de Alumno y Curso.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">As\u00ed que lo mejor es empezar con alumno<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Empezamos por Entities y los DTOs, <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Entities:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>export class Alumno {\n    id!: number;\n    nombre!: string;\n    apellido!: string;\n    dni!: string;\n    email!: string;\n    createdAt!: Date;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">DTOs<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>export class CreateAlumnoDto {\n    nombre!: string;\n    apellido!: string;\n    dni!: string;\n    email!: string;    \n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Actualizar extiende parcial (PartialType) as\u00ed que no es necesario definir, ya que incluye los datos de CreateAlumnoDto.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>import { PartialType } from '@nestjs\/mapped-types';\nimport { CreateAlumnoDto } from '.\/create-alumno.dto';\n\nexport class UpdateAlumnoDto extends PartialType(CreateAlumnoDto) {  \n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora si hay que elaborar el servicio.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>import { Injectable, NotFoundException } from '@nestjs\/common';\nimport { CreateAlumnoDto } from '.\/dto\/create-alumno.dto';\nimport { UpdateAlumnoDto } from '.\/dto\/update-alumno.dto';\n\nimport { PrismaService } from '..\/prisma\/prisma.service';\n\n@Injectable()\nexport class AlumnoService {\n\n  constructor(private prisma: PrismaService){}\n\n  create(data: CreateAlumnoDto) {\n    return this.prisma.alumno.create({ data })\n  }\n\n  findAll() {\n    return this.prisma.alumno.findMany();\n  }\n\n  async findOne(id: number) {\n    const alumno = await this.prisma.alumno.findUnique({ where: {id} });\n    if (!alumno) throw new NotFoundException('Alumno ${id} no fue encontrado');\n    return alumno;\n  }\n\n  async update(id: number, data: UpdateAlumnoDto) {\n    await this.findOne(id);\n    return this.prisma.alumno.update({where: {id}, data});\n  }\n\n  async remove(id: number) {\n    await this.findOne(id);\n    return this.prisma.alumno.delete({where: {id} });\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">finalmente, el controlador practicamente, ya viene implementado.<\/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 { AlumnoService } from '.\/alumno.service';\nimport { CreateAlumnoDto } from '.\/dto\/create-alumno.dto';\nimport { UpdateAlumnoDto } from '.\/dto\/update-alumno.dto';\n\n@Controller('alumno')\nexport class AlumnoController {\n  constructor(private readonly alumnoService: AlumnoService) {}\n\n  @Post()\n  create(@Body() createAlumnoDto: CreateAlumnoDto) {\n    return this.alumnoService.create(createAlumnoDto);\n  }\n\n  @Get()\n  findAll() {\n    return this.alumnoService.findAll();\n  }\n\n  @Get(':id')\n  findOne(@Param('id') id: string) {\n    return this.alumnoService.findOne(+id);\n  }\n\n  @Patch(':id')\n  update(@Param('id') id: string, @Body() updateAlumnoDto: UpdateAlumnoDto) {\n    return this.alumnoService.update(+id, updateAlumnoDto);\n  }\n\n  @Delete(':id')\n  remove(@Param('id') id: string) {\n    return this.alumnoService.remove(+id);\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ejecutemos el proyecto.<\/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\">Registro un alumno con el Invoke-WebRequest<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>Invoke-WebRequest -Uri http:\/\/localhost:3000\/alumno -Method POST -Headers @{\"Content-Type\"=\"application\/json\"} -Body '{\"nombre\":\"Jeff\",\"apellido\":\"Santillan\",\"dni\":\"12345678\",\"email\":\"jeff@gmail.com\"}'<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"429\" src=\"https:\/\/jeffsantillan.com\/blog\/wp-content\/uploads\/2026\/06\/image-41-1024x429.png\" alt=\"\" class=\"wp-image-261\" srcset=\"https:\/\/jeffsantillan.com\/blog\/wp-content\/uploads\/2026\/06\/image-41-1024x429.png 1024w, https:\/\/jeffsantillan.com\/blog\/wp-content\/uploads\/2026\/06\/image-41-300x126.png 300w, https:\/\/jeffsantillan.com\/blog\/wp-content\/uploads\/2026\/06\/image-41-768x321.png 768w, https:\/\/jeffsantillan.com\/blog\/wp-content\/uploads\/2026\/06\/image-41.png 1173w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Recuperamos los alumnos registrados.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Invoke-WebRequest -Uri http:\/\/localhost:3000\/alumno -Method GET<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"391\" src=\"https:\/\/jeffsantillan.com\/blog\/wp-content\/uploads\/2026\/06\/image-43-1024x391.png\" alt=\"\" class=\"wp-image-263\" srcset=\"https:\/\/jeffsantillan.com\/blog\/wp-content\/uploads\/2026\/06\/image-43-1024x391.png 1024w, https:\/\/jeffsantillan.com\/blog\/wp-content\/uploads\/2026\/06\/image-43-300x115.png 300w, https:\/\/jeffsantillan.com\/blog\/wp-content\/uploads\/2026\/06\/image-43-768x293.png 768w, https:\/\/jeffsantillan.com\/blog\/wp-content\/uploads\/2026\/06\/image-43.png 1168w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ya estamos haciendo uso de nuestra base de datos sqlite con prisma.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a1Saludos!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Toca escribir la funcionalidad del c\u00f3digo de servicios y controladores. Considera que la tablas: As\u00ed que &hellip; <a title=\"Nestjs aplicaci\u00f3n de matricula a curso &#8211; Parte II\" class=\"hm-read-more\" href=\"https:\/\/jeffsantillan.com\/blog\/nestjs-aplicacion-de-matricula-a-curso-parte-ii\/\"><span class=\"screen-reader-text\">Nestjs aplicaci\u00f3n de matricula a curso &#8211; Parte II<\/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-249","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\/249","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=249"}],"version-history":[{"count":4,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/posts\/249\/revisions"}],"predecessor-version":[{"id":264,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/posts\/249\/revisions\/264"}],"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=249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/categories?post=249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jeffsantillan.com\/blog\/wp-json\/wp\/v2\/tags?post=249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}