Creación de entidad Category con relaciones many-to-many en NestJS

Clase 19 de 35Curso de Backend con NestJS

Resumen

Al integrar una nueva funcionalidad en plataformas modernas, la gestión adecuada de entidades y sus relaciones es esencial para la escalabilidad. En este caso, te mostraremos cómo agregar la entidad Category a un proyecto usando las mejores prácticas en NestJS, enfocándonos en una arquitectura fácil de mantener y expandir.

¿Cómo definir la relación many to many entre posts y categories en una arquitectura de blog?

El objetivo es que una categoría pueda estar asociada a múltiples posts y, al mismo tiempo, un post pueda pertenecer a varias categorías. Este paradigma many to many permite máxima flexibilidad. Así, por ejemplo, un blog post puede clasificarse en DevOps, NestJS y otras categorías, mientras una sola categoría agrupa muchos artículos relacionados.

¿Por qué es importante la estructura modular y cómo deberías organizar los controladores y servicios?

En vez de crear un módulo por cada entidad, se recomienda encapsular entidades relacionadas dentro del mismo módulo. Por ejemplo, tanto post como category viven en el módulo de artículos. Esto promueve una arquitectura más limpia, escalable y manejable.

Sigue el ejemplo de user y profile: aunque son dos entidades distintas, están alojadas en un solo módulo. Para la entidad Category, sí habrá controladores y servicios propios debido a su funcionalidad y autonomía.

  • Crea carpetas separadas para controllers y servicios dentro del módulo.
  • Coloca todos los archivos relacionados con categories en las carpetas correspondientes.
  • Ajusta las rutas de importación tras reorganizar archivos.
  • Esto permite que diversos controladores y servicios convivan bajo un mismo módulo.

¿Cuáles son las mejores prácticas al crear la entidad category y sus DTOs?

  • Define la entidad category con una columna primaria generada automáticamente y un campo de nombre único, limitado a 255 caracteres.
  • Usa nombres en minúsculas y en plural para las tablas según la convención de bases de datos.
  • Crea DTOs como create-category.dto, validando el campo name (obligatorio, no vacío y con máximo permitido).
  • Crea update-category.dto usando PartialType para mantener la coherencia y reutilización de lógica en las actualizaciones.

¿Cómo utilizar AI y prompts para acelerar la generación de CRUD y componentes?

Aprovecha herramientas de AI como Cursor para - Autogenerar controladores, servicios y DTOs tomando como referencia la entidad y otros archivos ya existentes. - Usa prompts en los que referencies archivos clave (post.service.ts, post.controller.ts) y defines la estructura actual de tu módulo usando el comando tree para mostrar la organización de carpetas y archivos. - Ejecuta el prompt desde la entity para asegurar que la AI tenga el contexto correcto. - Así podrás obtener la generación automática de archivos y la inclusión directa de cada controlador y servicio en el módulo correspondiente.

¿Qué soluciones aplicar ante problemas de rutas y organización tras refactorizar carpetas?

Si tras mover archivos aparecen errores de importación, simplemente: - Ajusta las rutas en los archivos afectados (service, DTO, entity) para que reflejen la nueva ubicación. - Verifica que en el módulo se estén importando correctamente los controladores y servicios.

¿Cómo validar que el CRUD de categories funciona correctamente con Postman?

  • Duplica una carpeta de endpoints en Postman y renómbrala para categories.
  • Prueba el endpoint GET: al principio estará vacío, si aún no hay categorías creadas.
  • El endpoint GET /:id debe devolver mensaje si la categoría no existe.
  • Usa CREATE para probar restricciones (name es obligatorio; no se permite un campo "title").
  • Verifica las respuestas y mensajes al eliminar y actualizar categorías. Por ejemplo, puedes cambiar el nombre de una categoría y recibir su estado actualizado.

¿Tienes dudas sobre cómo organizar entidades o probar APIs? Comparte tu experiencia con la arquitectura de módulos y el uso de IA en el desarrollo backend.