Operaciones CRUD en ProductService usando TypeORM y Postgres

Clase 12 de 36Curso de NestJS: Persistencia de Datos con TypeORM

Resumen

¿Cómo crear, actualizar y eliminar productos en una base de datos utilizando TypeORM?

Al trabajar con bases de datos, uno de los aspectos fundamentales es poder realizar operaciones CRUD (crear, leer, actualizar, eliminar). En este artículo te guiaré a través del proceso de implementación de estas operaciones utilizando TypeORM, un ORM popular para Node.js y TypeScript.

¿Cómo crear un nuevo producto?

La creación de un producto en la base de datos implica generar una nueva instancia de la entidad Product y asignar atributos apropiadamente antes de guardarla. Actualmente, algunos métodos en ProductService necesitan ajustes para trabajar con persistencia de datos en PostgreSQL en lugar de un arreglo en memoria.

Primero, eliminamos el contador innecesario ya que el ID es autoincremental. Usamos el método save del repositorio para guardar la instancia del producto en la base de datos. Aquí un ejemplo del código utilizado:

let newProduct = new Product();
newProduct.image = dto.image;
newProduct.name = dto.name;
newProduct.description = dto.description;
newProduct.price = dto.price;
newProduct.stock = dto.stock;

// Guardar el nuevo producto en el repositorio
await this.productRepository.save(newProduct);

TypeORM ofrece un método más eficiente utilizando create junto con save para manejar múltiples atributos sin necesidad de asignarlos uno por uno:

const newProduct = this.productRepository.create(dto);
await this.productRepository.save(newProduct);

¿Cómo actualizar un producto existente?

Para actualizar un producto existente, primero se busca el producto en la base de datos para modificar sus atributos según el DTO recibido. El método merge de TypeORM es útil para fusionar los cambios y luego guardarlos con save:

const productToUpdate = await this.productRepository.findOne(id);
if (productToUpdate) {
  this.productRepository.merge(productToUpdate, dto);
  await this.productRepository.save(productToUpdate);
}

¿Cómo eliminar un producto de la base de datos?

Eliminar un producto es sencillo gracias al método delete proporcionado por el repositorio. Es aconsejable verificar que el producto existe antes de intentar eliminarlo para evitar errores:

const productToDelete = await this.productRepository.findOne(id);
if (productToDelete) {
  await this.productRepository.delete(id);
}

¿Cómo manejar errores en las operaciones CRUD?

Al implementar las operaciones CRUD, un aspecto importante es el manejo de errores y la validación de datos. Por ejemplo, al intentar obtener un producto que no existe, podemos lanzar una excepción adecuada:

const product = await this.productRepository.findOne(id);
if (!product) {
  throw new NotFoundException('Product not found');
}

Para resolver promesas de manera eficiente se recomienda siempre usar async y await en las funciones asincrónicas para manejar las respuestas adecuadamente antes de que el controlador procese las solicitudes.

¿Cómo probar las operaciones usando Insomnia?

Una vez implementadas las operaciones CRUD, podemos utilizar herramientas como Insomnia para probarlas. En Insomnia, podemos enviar solicitudes (requests) a endpoints específicos y verificar que las respuestas sean las esperadas. Por ejemplo, al crear un nuevo producto, deberíamos ver reflejados todos sus atributos en la base de datos, y al actualizar el precio de un producto, confirmar que los cambios se han guardado correctamente.

¿Cuáles son los siguientes pasos?

¡El reto ahora es tuyo! Intenta replicar estos procedimientos en las demás entidades de tu proyecto, como marcas, categorías, usuarios y clientes. Este ejercicio te permitirá afianzar tus habilidades y avanzar en el desarrollo de aplicaciones robustas utilizando TypeORM. La práctica y la experimentación constante son el camino hacia el dominio de cualquier herramienta. ¡Adelante!