CRUD de órdenes de compra y gestión de ítems en NestJS
Clase 26 de 36 • Curso de NestJS: Persistencia de Datos con TypeORM
Contenido del curso
- 3
Instalación de Docker en Windows, macOS y Ubuntu
01:35 - 4

Configuración de Postgres en Docker Compose
09:18 - 5

Conexión a Postgres en Docker: Terminal y PgAdmin
15:16 - 6

Conexión de NestJS a Postgres con Node Postgres
07:28 - 7

Inyección de Dependencias en NETJS: Conexión a PostgreSQL
10:49 - 8

Conexión a Bases de Datos con Variables de Entorno en Node.js
13:49
- 9

Implementación de TypeORM con NestJS en Proyectos Node.js
09:14 - 10

Creación de Entidades en ORM para Tiendas Virtuales
07:46 - 11

Implementación del Patrón Repository en NestJS con TypeORM
13:31 - 12

Operaciones CRUD en ProductService usando TypeORM y Postgres
13:35 - 13

Cambio de Postgres a MySQL en Docker para CRUD de Productos
17:28
- 18

Relaciones 1 a 1 en Bases de Datos con TimeORM
18:58 - 19

Manipulación de Relaciones Uno a Uno en Controladores y Servicios
10:28 - 20

Relaciones Uno a Muchos en Bases de Datos con TypeORM
10:36 - 21

Gestión de Relaciones Uno a Muchos en Controladores de API
10:27 - 22

Relaciones Muchos a Muchos en Time1M: Creación y Manejo Práctico
08:38 - 23

Manipulación de Relaciones Muchos a Muchos en Controladores
15:08 - 24

Manipulación de Relaciones Muchos a Muchos con TimeORM en JavaScript
19:09 - 25

Relaciones Muchos a Muchos con Campos Agregados en TimeWareM
16:41 - 26

CRUD de órdenes de compra y gestión de ítems en NestJS
30:07
- 27

Paginación de Productos con Limit y Offset en Controladores API
10:37 - 28

Filtrado de Precios con Rango Usando Between en Time Wareham
10:17 - 29

Indexación de Parámetros en Bases de Datos: Uso y Precauciones
02:56 - 30

Buenas prácticas de nombramiento en JavaScript y bases de datos
17:52 - 31

Serialización y Transformación de Datos en APIs con ClassTransformer
16:55
¿Cómo gestionar la agregación de órdenes en NestJS?
En el desarrollo de aplicaciones con NestJS, la gestión de órdenes de compra puede simplificarse creando un servicio y un controlador dedicados. Este proceso se inicia utilizando el Nest CLI para generar los componentes necesarios. Vamos a explorar cómo se hace.
¿Cómo generamos el servicio y el controlador?
Para iniciar, en la terminal empleamos el comando nest generate, especificando que queremos un servicio (s) y un controlador. La estructura se ubicará bajo el módulo de usuarios, dado su contexto en la aplicación:
nest generate service users/service/ordered --flat
nest generate controller users/controllers/ordered --flat
Con estos pasos se crean los archivos básicos y se agregan al UserModule sin necesidad de ningún ajusto adicional.
¿Qué es un DTO y cómo se crea?
El DTO (Data Transfer Object) delimita los datos que serán transferidos al momento de crear una orden. Creamos una clase CreateOrderDTO:
export class CreateOrderDTO {
@IsPositive()
@IsNotEmpty()
@ApiProperty()
readonly customerId: number;
}
Este DTO identifica al cliente relacionado, validando que la información sea positiva y no vacía, integrándose con la documentación Swagger.
¿Cómo desarrollamos las funciones CRUD?
En el OrderedService, implementamos las funciones básicas CRUD: "crear", "actualizar" y "eliminar", apoyándonos en dos repositorios: OrderRepo y CustomerRepo. Utilizamos InjectRepository:
@Injectable()
export class OrderedService {
constructor(
@InjectRepository(Order) private orderRepo: Repository<Order>,
@InjectRepository(Customer) private customerRepo: Repository<Customer>
) {}
// Funciones CRUD aquí...
}
Para crear una orden, solo es necesario el CustomerID, y la instancia de la orden se guarda en el repositorio correspondiente.
Incorporación de ítems en la orden
Una vez establecida la orden de compra, el siguiente paso es gestionar la inclusión de productos, tratados como ítems en una entidad ternaria. Esta sección detalla cómo se procede.
¿Cómo creamos el DTO para los ítems?
Para gestionar los ítems, creamos un DTO OrderItemDTO que detalla los elementos necesarios:
export class CreateOrderItemDTO {
@IsPositive()
@IsNotEmpty()
@ApiProperty()
readonly orderId: number;
@IsPositive()
@IsNotEmpty()
@ApiProperty()
readonly productId: number;
@IsPositive()
@IsNotEmpty()
@ApiProperty()
readonly quantity: number;
}
Este DTO especifica la orden y el producto a los que se añaden los ítems, incluyendo la cantidad.
¿Cómo se estructura el servicio y controlador para los ítems de la orden?
Al crear ítems, se replican el servicio y controlador, asegurando que el servicio maneje la lógica de negocio:
@Injectable()
export class OrderItemService {
constructor(
@InjectRepository(OrderItem) private itemsRepo: Repository<OrderItem>,
@InjectRepository(Order) private orderRepo: Repository<Order>,
@InjectRepository(Product) private productRepo: Repository<Product>
) {}
async createItem(data: CreateOrderItemDTO): Promise<OrderItem> {
const { orderId, productId, quantity } = data;
const order = await this.orderRepo.findOne(orderId);
const product = await this.productRepo.findOne(productId);
const item = this.itemsRepo.create({ order, product, quantity });
return this.itemsRepo.save(item);
}
}
Además, en el OrdersController se implementa un POST para agregar ítems:
@Post('/order-items')
async addItem(@Body() dto: CreateOrderItemDTO): Promise<OrderItem> {
return this.orderItemService.createItem(dto);
}
Comprobación y optimización
Finalmente, revisamos la gestión mediante herramientas como Insomnia y pgAdmin para verificar la correcta inserción de datos y resolver inconvenientes de inyección de dependencias mediante la exportación correcta de módulos. Validamos las relaciones complejas en entidades y garantizamos que los endpoints expongan toda la información necesaria.
Este enfoque facilita el manejar relaciones muchos a muchos en bases de datos utilizando una estructura de módulos bien definida, inyecciones de dependencias y validaciones de DTO que protegen y estructuran la integridad de nuestros datos, ofreciendo una manera eficiente de administrar las operaciones de la aplicación.