Browse Source

feat(core): Pass RequestContext to OrderMergeStrategy functions

BREAKING CHANGE: The OrderMergeStrategy `merge()`
function signature has changed: the first argument is now the
RequestContext of the current request.
Michael Bromley 5 years ago
parent
commit
eae71f0662

+ 8 - 6
packages/core/src/config/order/merge-orders-strategy.spec.ts

@@ -1,3 +1,4 @@
+import { RequestContext } from '../../api/common/request-context';
 import { Order } from '../../entity/order/order.entity';
 import { createOrderFromLines, parseLines } from '../../testing/order-test-utils';
 
@@ -5,12 +6,13 @@ import { MergeOrdersStrategy } from './merge-orders-strategy';
 
 describe('MergeOrdersStrategy', () => {
     const strategy = new MergeOrdersStrategy();
+    const ctx = RequestContext.empty();
 
     it('both orders empty', () => {
         const guestOrder = new Order({ lines: [] });
         const existingOrder = new Order({ lines: [] });
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(result).toEqual([]);
     });
@@ -20,7 +22,7 @@ describe('MergeOrdersStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = new Order({ lines: [] });
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(guestLines);
     });
@@ -30,7 +32,7 @@ describe('MergeOrdersStrategy', () => {
         const guestOrder = new Order({ lines: [] });
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(existingLines);
     });
@@ -48,7 +50,7 @@ describe('MergeOrdersStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual([
             { lineId: 21, quantity: 2, productVariantId: 201 },
@@ -72,7 +74,7 @@ describe('MergeOrdersStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual([
             { lineId: 22, quantity: 1, productVariantId: 202 },
@@ -88,7 +90,7 @@ describe('MergeOrdersStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(result).not.toBe(guestOrder.lines);
         expect(result).not.toBe(existingOrder.lines);

+ 3 - 2
packages/core/src/config/order/merge-orders-strategy.ts

@@ -1,3 +1,4 @@
+import { RequestContext } from '../../api/common/request-context';
 import { OrderLine } from '../../entity/order-line/order-line.entity';
 import { Order } from '../../entity/order/order.entity';
 
@@ -12,7 +13,7 @@ import { OrderMergeStrategy } from './order-merge-strategy';
  * @docsPage Merge Strategies
  */
 export class MergeOrdersStrategy implements OrderMergeStrategy {
-    merge(guestOrder: Order, existingOrder: Order): OrderLine[] {
+    merge(ctx: RequestContext, guestOrder: Order, existingOrder: Order): OrderLine[] {
         const mergedLines = existingOrder.lines.slice();
         const guestLines = guestOrder.lines.slice();
         for (const guestLine of guestLines.reverse()) {
@@ -25,6 +26,6 @@ export class MergeOrdersStrategy implements OrderMergeStrategy {
     }
 
     private findCorrespondingLine(existingOrder: Order, guestLine: OrderLine): OrderLine | undefined {
-        return existingOrder.lines.find((line) => line.productVariant.id === guestLine.productVariant.id);
+        return existingOrder.lines.find(line => line.productVariant.id === guestLine.productVariant.id);
     }
 }

+ 2 - 1
packages/core/src/config/order/order-merge-strategy.ts

@@ -1,3 +1,4 @@
+import { RequestContext } from '../../api/common/request-context';
 import { InjectableStrategy } from '../../common/types/injectable-strategy';
 import { OrderLine } from '../../entity/order-line/order-line.entity';
 import { Order } from '../../entity/order/order.entity';
@@ -18,5 +19,5 @@ export interface OrderMergeStrategy extends InjectableStrategy {
      * Merges the lines of the guest Order with those of the existing Order which is associated
      * with the active customer.
      */
-    merge(guestOrder: Order, existingOrder: Order): OrderLine[];
+    merge(ctx: RequestContext, guestOrder: Order, existingOrder: Order): OrderLine[];
 }

+ 8 - 6
packages/core/src/config/order/use-existing-strategy.spec.ts

@@ -1,3 +1,4 @@
+import { RequestContext } from '../../api/common/request-context';
 import { Order } from '../../entity/order/order.entity';
 import { createOrderFromLines, parseLines } from '../../testing/order-test-utils';
 
@@ -5,12 +6,13 @@ import { UseExistingStrategy } from './use-existing-strategy';
 
 describe('UseExistingStrategy', () => {
     const strategy = new UseExistingStrategy();
+    const ctx = RequestContext.empty();
 
     it('both orders empty', () => {
         const guestOrder = new Order({ lines: [] });
         const existingOrder = new Order({ lines: [] });
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(result).toEqual([]);
     });
@@ -20,7 +22,7 @@ describe('UseExistingStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = new Order({ lines: [] });
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual([]);
     });
@@ -30,7 +32,7 @@ describe('UseExistingStrategy', () => {
         const guestOrder = new Order({ lines: [] });
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(existingLines);
     });
@@ -48,7 +50,7 @@ describe('UseExistingStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(existingLines);
     });
@@ -66,7 +68,7 @@ describe('UseExistingStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(existingLines);
     });
@@ -77,7 +79,7 @@ describe('UseExistingStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(result).not.toBe(guestOrder.lines);
         expect(result).not.toBe(existingOrder.lines);

+ 2 - 1
packages/core/src/config/order/use-existing-strategy.ts

@@ -1,3 +1,4 @@
+import { RequestContext } from '../../api/common/request-context';
 import { OrderLine } from '../../entity/order-line/order-line.entity';
 import { Order } from '../../entity/order/order.entity';
 
@@ -11,7 +12,7 @@ import { OrderMergeStrategy } from './order-merge-strategy';
  * @docsPage Merge Strategies
  */
 export class UseExistingStrategy implements OrderMergeStrategy {
-    merge(guestOrder: Order, existingOrder: Order): OrderLine[] {
+    merge(ctx: RequestContext, guestOrder: Order, existingOrder: Order): OrderLine[] {
         return existingOrder.lines.slice();
     }
 }

+ 8 - 6
packages/core/src/config/order/use-guest-if-existing-empty-strategy.spec.ts

@@ -1,3 +1,4 @@
+import { RequestContext } from '../../api/common/request-context';
 import { Order } from '../../entity/order/order.entity';
 import { createOrderFromLines, parseLines } from '../../testing/order-test-utils';
 
@@ -5,12 +6,13 @@ import { UseGuestIfExistingEmptyStrategy } from './use-guest-if-existing-empty-s
 
 describe('UseGuestIfExistingEmptyStrategy', () => {
     const strategy = new UseGuestIfExistingEmptyStrategy();
+    const ctx = RequestContext.empty();
 
     it('both orders empty', () => {
         const guestOrder = new Order({ lines: [] });
         const existingOrder = new Order({ lines: [] });
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(result).toEqual([]);
     });
@@ -20,7 +22,7 @@ describe('UseGuestIfExistingEmptyStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = new Order({ lines: [] });
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(guestLines);
     });
@@ -30,7 +32,7 @@ describe('UseGuestIfExistingEmptyStrategy', () => {
         const guestOrder = new Order({ lines: [] });
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(existingLines);
     });
@@ -48,7 +50,7 @@ describe('UseGuestIfExistingEmptyStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(existingLines);
     });
@@ -66,7 +68,7 @@ describe('UseGuestIfExistingEmptyStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(existingLines);
     });
@@ -77,7 +79,7 @@ describe('UseGuestIfExistingEmptyStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(result).not.toBe(guestOrder.lines);
         expect(result).not.toBe(existingOrder.lines);

+ 2 - 1
packages/core/src/config/order/use-guest-if-existing-empty-strategy.ts

@@ -1,3 +1,4 @@
+import { RequestContext } from '../../api/common/request-context';
 import { OrderLine } from '../../entity/order-line/order-line.entity';
 import { Order } from '../../entity/order/order.entity';
 
@@ -11,7 +12,7 @@ import { OrderMergeStrategy } from './order-merge-strategy';
  * @docsPage Merge Strategies
  */
 export class UseGuestIfExistingEmptyStrategy implements OrderMergeStrategy {
-    merge(guestOrder: Order, existingOrder: Order): OrderLine[] {
+    merge(ctx: RequestContext, guestOrder: Order, existingOrder: Order): OrderLine[] {
         return existingOrder.lines.length ? existingOrder.lines.slice() : guestOrder.lines.slice();
     }
 }

+ 8 - 6
packages/core/src/config/order/use-guest-strategy.spec.ts

@@ -1,3 +1,4 @@
+import { RequestContext } from '../../api/common/request-context';
 import { Order } from '../../entity/order/order.entity';
 import { createOrderFromLines, parseLines } from '../../testing/order-test-utils';
 
@@ -5,12 +6,13 @@ import { UseGuestStrategy } from './use-guest-strategy';
 
 describe('UseGuestStrategy', () => {
     const strategy = new UseGuestStrategy();
+    const ctx = RequestContext.empty();
 
     it('both orders empty', () => {
         const guestOrder = new Order({ lines: [] });
         const existingOrder = new Order({ lines: [] });
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(result).toEqual([]);
     });
@@ -20,7 +22,7 @@ describe('UseGuestStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = new Order({ lines: [] });
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(guestLines);
     });
@@ -30,7 +32,7 @@ describe('UseGuestStrategy', () => {
         const guestOrder = new Order({ lines: [] });
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual([]);
     });
@@ -48,7 +50,7 @@ describe('UseGuestStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(guestLines);
     });
@@ -66,7 +68,7 @@ describe('UseGuestStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(parseLines(result)).toEqual(guestLines);
     });
@@ -77,7 +79,7 @@ describe('UseGuestStrategy', () => {
         const guestOrder = createOrderFromLines(guestLines);
         const existingOrder = createOrderFromLines(existingLines);
 
-        const result = strategy.merge(guestOrder, existingOrder);
+        const result = strategy.merge(ctx, guestOrder, existingOrder);
 
         expect(result).not.toBe(guestOrder.lines);
         expect(result).not.toBe(existingOrder.lines);

+ 2 - 1
packages/core/src/config/order/use-guest-strategy.ts

@@ -1,3 +1,4 @@
+import { RequestContext } from '../../api/common/request-context';
 import { OrderLine } from '../../entity/order-line/order-line.entity';
 import { Order } from '../../entity/order/order.entity';
 
@@ -11,7 +12,7 @@ import { OrderMergeStrategy } from './order-merge-strategy';
  * @docsPage Merge Strategies
  */
 export class UseGuestStrategy implements OrderMergeStrategy {
-    merge(guestOrder: Order, existingOrder: Order): OrderLine[] {
+    merge(ctx: RequestContext, guestOrder: Order, existingOrder: Order): OrderLine[] {
         return guestOrder.lines.slice();
     }
 }

+ 8 - 6
packages/core/src/service/helpers/order-merger/order-merger.spec.ts

@@ -1,5 +1,6 @@
 import { Test } from '@nestjs/testing';
 
+import { RequestContext } from '../../../api/common/request-context';
 import { ConfigService } from '../../../config/config.service';
 import { MockConfigService } from '../../../config/config.service.mock';
 import { MergeOrdersStrategy } from '../../../config/order/merge-orders-strategy';
@@ -10,6 +11,7 @@ import { OrderMerger } from './order-merger';
 
 describe('OrderMerger', () => {
     let orderMerger: OrderMerger;
+    const ctx = RequestContext.empty();
 
     beforeEach(async () => {
         const module = await Test.createTestingModule({
@@ -26,7 +28,7 @@ describe('OrderMerger', () => {
         const guestOrder = new Order({ lines: [] });
         const existingOrder = new Order({ lines: [] });
 
-        const result = orderMerger.merge();
+        const result = orderMerger.merge(ctx);
 
         expect(result.order).toBeUndefined();
         expect(result.linesToInsert).toBeUndefined();
@@ -36,7 +38,7 @@ describe('OrderMerger', () => {
     it('guestOrder undefined', () => {
         const existingOrder = createOrderFromLines([{ lineId: 1, quantity: 2, productVariantId: 100 }]);
 
-        const result = orderMerger.merge(undefined, existingOrder);
+        const result = orderMerger.merge(ctx, undefined, existingOrder);
 
         expect(result.order).toBe(existingOrder);
         expect(result.linesToInsert).toBeUndefined();
@@ -46,7 +48,7 @@ describe('OrderMerger', () => {
     it('existingOrder undefined', () => {
         const guestOrder = createOrderFromLines([{ lineId: 1, quantity: 2, productVariantId: 100 }]);
 
-        const result = orderMerger.merge(guestOrder, undefined);
+        const result = orderMerger.merge(ctx, guestOrder, undefined);
 
         expect(result.order).toBe(guestOrder);
         expect(result.linesToInsert).toBeUndefined();
@@ -58,7 +60,7 @@ describe('OrderMerger', () => {
         guestOrder.id = 42;
         const existingOrder = createOrderFromLines([{ lineId: 1, quantity: 2, productVariantId: 100 }]);
 
-        const result = orderMerger.merge(guestOrder, existingOrder);
+        const result = orderMerger.merge(ctx, guestOrder, existingOrder);
 
         expect(result.order).toBe(existingOrder);
         expect(result.linesToInsert).toBeUndefined();
@@ -70,7 +72,7 @@ describe('OrderMerger', () => {
         const existingOrder = createOrderFromLines([]);
         existingOrder.id = 42;
 
-        const result = orderMerger.merge(guestOrder, existingOrder);
+        const result = orderMerger.merge(ctx, guestOrder, existingOrder);
 
         expect(result.order).toBe(guestOrder);
         expect(result.linesToInsert).toBeUndefined();
@@ -82,7 +84,7 @@ describe('OrderMerger', () => {
         guestOrder.id = 42;
         const existingOrder = createOrderFromLines([{ lineId: 1, quantity: 2, productVariantId: 100 }]);
 
-        const result = orderMerger.merge(guestOrder, existingOrder);
+        const result = orderMerger.merge(ctx, guestOrder, existingOrder);
 
         expect(result.order).toBe(existingOrder);
         expect(result.linesToInsert).toEqual([{ productVariantId: 200, quantity: 2 }]);

+ 3 - 2
packages/core/src/service/helpers/order-merger/order-merger.ts

@@ -1,6 +1,7 @@
 import { Injectable } from '@nestjs/common';
 import { ID } from '@vendure/common/lib/shared-types';
 
+import { RequestContext } from '../../../api/common/request-context';
 import { ConfigService } from '../../../config/config.service';
 import { OrderLine } from '../../../entity/order-line/order-line.entity';
 import { Order } from '../../../entity/order/order.entity';
@@ -22,10 +23,10 @@ export class OrderMerger {
      * Applies the configured OrderMergeStrategy to the supplied guestOrder and existingOrder. Returns an object
      * containing entities which then need to be persisted to the database by the OrderService methods.
      */
-    merge(guestOrder?: Order, existingOrder?: Order): MergeResult {
+    merge(ctx: RequestContext, guestOrder?: Order, existingOrder?: Order): MergeResult {
         if (guestOrder && !this.orderEmpty(guestOrder) && existingOrder && !this.orderEmpty(existingOrder)) {
             const { mergeStrategy } = this.configService.orderOptions;
-            const mergedLines = mergeStrategy.merge(guestOrder, existingOrder);
+            const mergedLines = mergeStrategy.merge(ctx, guestOrder, existingOrder);
             return {
                 order: existingOrder,
                 linesToInsert: this.getLinesToInsert(guestOrder, existingOrder, mergedLines),

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

@@ -1008,7 +1008,7 @@ export class OrderService {
             // so we do not want to merge at all. See https://github.com/vendure-ecommerce/vendure/issues/263
             return existingOrder;
         }
-        const mergeResult = await this.orderMerger.merge(guestOrder, existingOrder);
+        const mergeResult = await this.orderMerger.merge(ctx, guestOrder, existingOrder);
         const { orderToDelete, linesToInsert } = mergeResult;
         let { order } = mergeResult;
         if (orderToDelete) {