From 3d3d04f95123698b4ac07a89e60d5cebb952e373 Mon Sep 17 00:00:00 2001 From: casperiv <53900565+casperiv0@users.noreply.github.com> Date: Wed, 6 May 2026 14:27:28 +0200 Subject: [PATCH 1/3] fix(mollie-payments): wrap addPayment in transaction --- packages/mollie-plugin/src/mollie.service.ts | 60 +++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/packages/mollie-plugin/src/mollie.service.ts b/packages/mollie-plugin/src/mollie.service.ts index 4ec6728..c35a990 100644 --- a/packages/mollie-plugin/src/mollie.service.ts +++ b/packages/mollie-plugin/src/mollie.service.ts @@ -29,6 +29,7 @@ import { PaymentMethod, PaymentMethodService, RequestContext, + TransactionalConnection, } from '@vendure/core'; import { totalCoveredByPayments } from '@vendure/core/dist/service/helpers/utils/order-utils'; @@ -82,6 +83,7 @@ export class MollieService { @Inject(PLUGIN_INIT_OPTIONS) private options: MolliePluginOptions, private activeOrderService: ActiveOrderService, private orderService: OrderService, + private connection: TransactionalConnection, private entityHydrator: EntityHydrator, private moduleRef: ModuleRef, private configService: ConfigService, @@ -375,37 +377,39 @@ export class MollieService { paymentMethodCode: string, status: 'Authorized' | 'Settled', ): Promise { - if (order.state !== 'ArrangingPayment' && order.state !== 'ArrangingAdditionalPayment') { - const transitionToStateResult = await this.orderService.transitionToState( - ctx, - order.id, - 'ArrangingPayment', - ); - if (transitionToStateResult instanceof OrderStateTransitionError) { - throw Error( - `Error transitioning order ${order.code} from ${transitionToStateResult.fromState} ` + - `to ${transitionToStateResult.toState}: ${transitionToStateResult.message}`, + return this.connection.withTransaction(ctx, async txCtx => { + if (order.state !== 'ArrangingPayment' && order.state !== 'ArrangingAdditionalPayment') { + const transitionToStateResult = await this.orderService.transitionToState( + txCtx, + order.id, + 'ArrangingPayment', ); + if (transitionToStateResult instanceof OrderStateTransitionError) { + throw Error( + `Error transitioning order ${order.code} from ${transitionToStateResult.fromState} ` + + `to ${transitionToStateResult.toState}: ${transitionToStateResult.message}`, + ); + } } - } - const metadata: MolliePaymentMetadata = { - amount, - status, - paymentId: mollieMetadata.paymentId, - mode: mollieMetadata.mode, - method: mollieMetadata.method, - profileId: mollieMetadata.profileId, - authorizedAt: mollieMetadata.authorizedAt, - paidAt: mollieMetadata.paidAt, - }; - const addPaymentToOrderResult = await this.orderService.addPaymentToOrder(ctx, order.id, { - method: paymentMethodCode, - metadata, + const metadata: MolliePaymentMetadata = { + amount, + status, + paymentId: mollieMetadata.paymentId, + mode: mollieMetadata.mode, + method: mollieMetadata.method, + profileId: mollieMetadata.profileId, + authorizedAt: mollieMetadata.authorizedAt, + paidAt: mollieMetadata.paidAt, + }; + const addPaymentToOrderResult = await this.orderService.addPaymentToOrder(txCtx, order.id, { + method: paymentMethodCode, + metadata, + }); + if (!(addPaymentToOrderResult instanceof Order)) { + throw Error(`Error adding payment to order ${order.code}: ${addPaymentToOrderResult.message}`); + } + return addPaymentToOrderResult; }); - if (!(addPaymentToOrderResult instanceof Order)) { - throw Error(`Error adding payment to order ${order.code}: ${addPaymentToOrderResult.message}`); - } - return addPaymentToOrderResult; } /** From deb6d991f67b1c36ac99d3e16d4d377b54f7e42f Mon Sep 17 00:00:00 2001 From: casperiv <53900565+casperiv0@users.noreply.github.com> Date: Thu, 7 May 2026 09:43:31 +0200 Subject: [PATCH 2/3] chore: apply feedback --- packages/mollie-plugin/src/mollie.service.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/mollie-plugin/src/mollie.service.ts b/packages/mollie-plugin/src/mollie.service.ts index c35a990..8dc7230 100644 --- a/packages/mollie-plugin/src/mollie.service.ts +++ b/packages/mollie-plugin/src/mollie.service.ts @@ -370,17 +370,17 @@ export class MollieService { * Add payment to order. Can be settled or authorized depending on the payment method. */ async addPayment( - ctx: RequestContext, + _ctx: RequestContext, order: Order, amount: number, mollieMetadata: Omit, paymentMethodCode: string, status: 'Authorized' | 'Settled', ): Promise { - return this.connection.withTransaction(ctx, async txCtx => { + return this.connection.withTransaction(_ctx, async ctx => { if (order.state !== 'ArrangingPayment' && order.state !== 'ArrangingAdditionalPayment') { const transitionToStateResult = await this.orderService.transitionToState( - txCtx, + ctx, order.id, 'ArrangingPayment', ); @@ -401,7 +401,7 @@ export class MollieService { authorizedAt: mollieMetadata.authorizedAt, paidAt: mollieMetadata.paidAt, }; - const addPaymentToOrderResult = await this.orderService.addPaymentToOrder(txCtx, order.id, { + const addPaymentToOrderResult = await this.orderService.addPaymentToOrder(ctx, order.id, { method: paymentMethodCode, metadata, }); From 54125e2e6ffb69a8b5009f9efb13fc0566bc8d90 Mon Sep 17 00:00:00 2001 From: casperiv <53900565+casperiv0@users.noreply.github.com> Date: Thu, 7 May 2026 10:33:33 +0200 Subject: [PATCH 3/3] chore: add comment --- packages/mollie-plugin/src/mollie.service.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/mollie-plugin/src/mollie.service.ts b/packages/mollie-plugin/src/mollie.service.ts index 8dc7230..b45d6e4 100644 --- a/packages/mollie-plugin/src/mollie.service.ts +++ b/packages/mollie-plugin/src/mollie.service.ts @@ -377,6 +377,8 @@ export class MollieService { paymentMethodCode: string, status: 'Authorized' | 'Settled', ): Promise { + // `addPaymentToOrder` requires a db transaction. Free orders use a new + // admin `RequestContext` in `createPaymentIntent`, which does not keep the transaction. return this.connection.withTransaction(_ctx, async ctx => { if (order.state !== 'ArrangingPayment' && order.state !== 'ArrangingAdditionalPayment') { const transitionToStateResult = await this.orderService.transitionToState(