Przeglądaj źródła

fix: Execute insert query and update if exists

Thomas Blommaert 4 lat temu
rodzic
commit
940201bee0

+ 3 - 0
packages/core/src/entity/order-item/order-item.entity.ts

@@ -27,6 +27,9 @@ export class OrderItem extends VendureEntity {
     @ManyToOne(type => OrderLine, line => line.items, { onDelete: 'CASCADE' })
     line: OrderLine;
 
+    @EntityId()
+    lineId: ID;
+
     /**
      * @description
      * The price as calculated when the OrderItem was first added to the Order. Usually will be identical to the

+ 17 - 3
packages/core/src/service/helpers/order-modifier/order-modifier.ts

@@ -150,8 +150,9 @@ export class OrderModifier {
             if (!orderLine.items) {
                 orderLine.items = [];
             }
+            const newOrderItems = [];
             for (let i = currentQuantity; i < quantity; i++) {
-                const orderItem = await this.connection.getRepository(ctx, OrderItem).save(
+                newOrderItems.push(
                     new OrderItem({
                         listPrice: orderLine.productVariant.price,
                         listPriceIncludesTax: orderLine.productVariant.priceIncludesTax,
@@ -160,8 +161,16 @@ export class OrderModifier {
                         line: orderLine,
                     }),
                 );
-                orderLine.items.push(orderItem);
             }
+            const { identifiers } = await this.connection
+                .getRepository(ctx, OrderItem)
+                .createQueryBuilder()
+                .insert()
+                .into(OrderItem)
+                .values(newOrderItems)
+                .execute();
+            newOrderItems.forEach((item, i) => (item.id = identifiers[i].id));
+            orderLine.items.push(...newOrderItems);
         } else if (quantity < currentQuantity) {
             if (order.active) {
                 // When an Order is still active, it is fine to just delete
@@ -169,7 +178,12 @@ export class OrderModifier {
                 const keepItems = orderLine.items.slice(0, quantity);
                 const removeItems = orderLine.items.slice(quantity);
                 orderLine.items = keepItems;
-                await this.connection.getRepository(ctx, OrderItem).remove(removeItems);
+                await this.connection
+                    .getRepository(ctx, OrderItem)
+                    .createQueryBuilder()
+                    .delete()
+                    .whereInIds(removeItems.map(i => i.id))
+                    .execute();
             } else {
                 // When an Order is not active (i.e. Customer checked out), then we don't want to just
                 // delete the OrderItems - instead we will cancel them

+ 18 - 1
packages/core/src/service/services/order.service.ts

@@ -1328,8 +1328,25 @@ export class OrderService {
             promotions,
             updatedOrderLine ? [updatedOrderLine] : [],
         );
+        // await this.connection.getRepository(ctx, OrderItem).save(updatedItems, { reload: false });
+        await this.connection
+            .getRepository(ctx, OrderItem)
+            .createQueryBuilder()
+            .insert()
+            .values(updatedItems)
+            .orUpdate({
+                conflict_target: ['id'],
+                overwrite: [
+                    'initialListPrice',
+                    'listPrice',
+                    'listPriceIncludesTax',
+                    'adjustments',
+                    'taxLines',
+                ],
+            })
+            .updateEntity(false)
+            .execute();
         await this.connection.getRepository(ctx, Order).save(order, { reload: false });
-        await this.connection.getRepository(ctx, OrderItem).save(updatedItems, { reload: false });
         await this.connection.getRepository(ctx, ShippingLine).save(order.shippingLines, { reload: false });
         return order;
     }