Actualización de DTOs con mapped types en NestJS para perfil y usuario
Clase 16 de 35 • Curso de Backend con NestJS
Resumen
Optimizar el proceso de actualización en NestJS es fundamental para mantener el código limpio y eficiente, especialmente cuando gestionamos relaciones uno a uno entre entidades como usuario y perfil. Esta técnica evita la repetición, facilita la validación y mejora la escalabilidad del proyecto.
¿Qué problema resuelve mapped types en la actualización de usuarios y perfiles?
Al trabajar con perfiles conectados a usuarios, surge la necesidad de actualizar datos sin replicar estructuras ni validaciones. Usar mapped types permite convertir campos obligatorios en opcionales sin perder las validaciones originales, ahorrando tiempo y esfuerzo. Así, tanto el create como el update de DTO se logran a partir de una sola definición base, reduciendo el riesgo de inconsistencias.
¿Cómo se implementa partial type para actualizar datos en DTOs?
La función partial type tomada del paquete @nestjs/mapped-types
convierte todos los campos requeridos en opcionales. De esta forma:
- El DTO de actualización hereda todas las reglas y decoradores del de creación.
- Los campos se vuelven opcionales automáticamente con una simple extensión.
- Permite agregar validaciones extra o sobrescribir campos si algún dato debe seguir siendo requerido al actualizar.
Por ejemplo:
import { PartialType } from '@nestjs/mapped-types';
export class UpdateProfileDto extends PartialType(CreateProfileDto) {}
Esto mantiene el código consistente y fácil de mantener incluso cuando los DTO crecen en complejidad.
¿Qué ventajas hay al separar y organizar DTOs por entidad?
Separar los DTO en diferentes carpetas y archivos según entidad (usuario, perfil, etc.) ayuda a:
- Mantener la claridad en el proyecto.
- Facilitar la importación y reutilización en distintos endpoints.
- Hacer más fácil el rastreo de validaciones específicas y anidadas.
¿Cómo evitar errores típicos al heredar DTOs en cascada?
Si el DTO de actualización de usuario sigue heredando el create profile DTO al momento de actualizar perfiles, podría requerir campos no opcionales por error. La clave es asegurarse de heredar el DTO correcto:
- Utilizar el update profile DTO para actualizar únicamente los campos elegidos.
- Usar utilidades como OmitType si es necesario definir excepciones o eliminar campos al extender.
Código ejemplo utilizando ambos:
import { OmitType, PartialType } from '@nestjs/mapped-types';
export class UpdateUserDto extends PartialType(OmitType(CreateUserDto, ['profile'] as const)) {
profile?: UpdateProfileDto;
}
Así se logran extensiones precisas y flexibles.
¿Cómo manejar validación estricta y parámetros adicionales en DTOs?
NestJS permite personalizar cuánto aceptar del objeto enviado por la petición. Puedes dejar pasar atributos no definidos o lanzar un error explícito. Activando la validación estricta, solo se aceptan los parámetros definidos en el DTO, alertando si el cliente envía datos extras o erróneos.
¿Qué impacto tiene la carga de relaciones en consultas y rendimiento?
Traer relaciones anidadas con findOne resulta útil para retornar datos completos en endpoints como get por usuario, o lista de usuarios. Sin embargo, - Si la consulta es para eliminar, lo más eficiente es evitar cargar relaciones innecesarias. - Para actualizar, traer la relación solo si realmente se necesita. - Considerar el tamaño y tráfico de la base de datos antes de optimizar por rendimiento excesivo.
¿Cómo crear endpoints flexibles para obtener el profile de un usuario?
Puedes optar por: - Un endpoint general que incluya los perfiles anidados en la respuesta de usuario. - Un endpoint específico que devuelva exclusivamente el profile asociado a un user ID, solo cuando sea necesario.
Así, el sistema se adapta tanto a vistas agregadas (tablas, listados) como a necesidades específicas de front-end o apps.
¿Te gustaría compartir tu experiencia creando DTOs flexibles en tus proyectos o tienes alguna duda puntual sobre la estructura de validaciones en NestJS? ¡Comparte tu opinión y retroalimentación en los comentarios!