Просмотр исходного кода

fix(dev-server): Fix multivendor plugin setting aggregate order state

Fixes #2227
Michael Bromley 2 лет назад
Родитель
Сommit
adca2ddffc

+ 32 - 4
packages/dev-server/example-plugins/multivendor-plugin/config/mv-order-process.ts

@@ -1,6 +1,7 @@
 import { OrderType } from '@vendure/common/lib/generated-types';
 import { ID } from '@vendure/common/lib/shared-types';
 import {
+    ChannelService,
     CustomOrderProcess,
     idsAreEqual,
     Order,
@@ -10,16 +11,22 @@ import {
     orderItemsAreShipped,
     OrderService,
     RequestContext,
+    RequestContextService,
     TransactionalConnection,
+    User,
 } from '@vendure/core';
 
 let connection: TransactionalConnection;
 let orderService: OrderService;
+let channelService: ChannelService;
+let requestContextService: RequestContextService;
 
 export const multivendorOrderProcess: CustomOrderProcess<any> = {
     init(injector) {
         connection = injector.get(TransactionalConnection);
         orderService = injector.get(OrderService);
+        channelService = injector.get(ChannelService);
+        requestContextService = injector.get(RequestContextService);
     },
 
     async onTransitionStart(fromState, toState, data) {
@@ -67,20 +74,41 @@ export const multivendorOrderProcess: CustomOrderProcess<any> = {
         if (order.type === OrderType.Seller) {
             const aggregateOrder = await orderService.getAggregateOrder(ctx, order);
             if (aggregateOrder) {
+                // Create a new RequestContext on the default Channel, since the current
+                // RequestContext may be scoped to the Seller channel, and will not be able to
+                // update the AggregateOrder.
+                const defaultChannel = await channelService.getDefaultChannel();
+                const defaultChannelCtx = await requestContextService.create({
+                    apiType: 'admin',
+                    channelOrToken: defaultChannel,
+                    req: ctx.req,
+                    languageCode: ctx.languageCode,
+                    user: ctx.activeUserId ? new User({ id: ctx.activeUserId }) : undefined,
+                });
+
                 // This part is responsible for automatically updating the state of the aggregate Order
                 // based on the fulfillment state of all the associated seller Orders.
                 const otherSellerOrders = (await orderService.getSellerOrders(ctx, aggregateOrder)).filter(
                     so => !idsAreEqual(so.id, order.id),
                 );
+
                 const sellerOrderStates = [...otherSellerOrders.map(so => so.state), toState];
                 if (sellerOrderStates.every(state => state === 'Shipped')) {
-                    await orderService.transitionToState(data.ctx, aggregateOrder.id, 'Shipped');
+                    await orderService.transitionToState(defaultChannelCtx, aggregateOrder.id, 'Shipped');
                 } else if (sellerOrderStates.every(state => state === 'Delivered')) {
-                    await orderService.transitionToState(data.ctx, aggregateOrder.id, 'Delivered');
+                    await orderService.transitionToState(defaultChannelCtx, aggregateOrder.id, 'Delivered');
                 } else if (sellerOrderStates.some(state => state === 'Delivered')) {
-                    await orderService.transitionToState(data.ctx, aggregateOrder.id, 'PartiallyDelivered');
+                    await orderService.transitionToState(
+                        defaultChannelCtx,
+                        aggregateOrder.id,
+                        'PartiallyDelivered',
+                    );
                 } else if (sellerOrderStates.some(state => state === 'Shipped')) {
-                    await orderService.transitionToState(data.ctx, aggregateOrder.id, 'PartiallyShipped');
+                    await orderService.transitionToState(
+                        defaultChannelCtx,
+                        aggregateOrder.id,
+                        'PartiallyShipped',
+                    );
                 }
             }
         }