From 84341115ae55032a567e6419eeacde432b7f4ff8 Mon Sep 17 00:00:00 2001 From: Yasser <2945770+yasserlens@users.noreply.github.com> Date: Thu, 26 Sep 2024 15:48:33 +0100 Subject: [PATCH] fix(payments-plugin): Use default channel in Stripe webhook calls to reach all orders (#3076) --- .../payments-plugin/src/stripe/stripe.controller.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/payments-plugin/src/stripe/stripe.controller.ts b/packages/payments-plugin/src/stripe/stripe.controller.ts index 0c80a5d512..2b59cc7c5f 100644 --- a/packages/payments-plugin/src/stripe/stripe.controller.ts +++ b/packages/payments-plugin/src/stripe/stripe.controller.ts @@ -1,5 +1,6 @@ import { Controller, Headers, HttpStatus, Post, Req, Res } from '@nestjs/common'; import type { PaymentMethod, RequestContext } from '@vendure/core'; +import { ChannelService } from '@vendure/core'; import { InternalServerError, LanguageCode, @@ -31,6 +32,7 @@ export class StripeController { private stripeService: StripeService, private requestContextService: RequestContextService, private connection: TransactionalConnection, + private channelService: ChannelService, ) {} @Post('stripe') @@ -57,7 +59,7 @@ export class StripeController { const { metadata: { channelToken, orderCode, orderId } = {} } = paymentIntent; const outerCtx = await this.createContext(channelToken, request); - await this.connection.withTransaction(outerCtx, async ctx => { + await this.connection.withTransaction(outerCtx, async (ctx: RequestContext) => { const order = await this.orderService.findOneByCode(ctx, orderCode); if (!order) { @@ -90,8 +92,13 @@ export class StripeController { } if (order.state !== 'ArrangingPayment') { + // Orders can switch channels (e.g., global to UK store), causing lookups by the original + // channel to fail. Using a default channel avoids "entity-with-id-not-found" errors. + // See https://github.com/vendure-ecommerce/vendure/issues/3072 + const defaultChannel = await this.channelService.getDefaultChannel(ctx); + const ctxWithDefaultChannel = await this.createContext(defaultChannel.token, request); const transitionToStateResult = await this.orderService.transitionToState( - ctx, + ctxWithDefaultChannel, orderId, 'ArrangingPayment', );