fix: Idempotent cart completion (#9231)
What - Store result of cart-completion workflow for three days by default - This enables the built-in idempotency mechanism to kick-in, provided the same transaction ID is used on workflow executions - Return order from cart-completion workflow if the cart has already been completed - In case transaction ID is not used on workflow executions, we still only want to complete a cart once
This commit is contained in:
@@ -1,8 +1,16 @@
|
||||
import {
|
||||
onPaymentProcessedWorkflow,
|
||||
processPaymentWorkflow,
|
||||
} from "@medusajs/core-flows"
|
||||
import {
|
||||
IPaymentModuleService,
|
||||
ProviderWebhookPayload,
|
||||
} from "@medusajs/framework/types"
|
||||
import { Modules, PaymentWebhookEvents } from "@medusajs/framework/utils"
|
||||
import {
|
||||
Modules,
|
||||
PaymentActions,
|
||||
PaymentWebhookEvents,
|
||||
} from "@medusajs/framework/utils"
|
||||
import { SubscriberArgs, SubscriberConfig } from "../types/subscribers"
|
||||
|
||||
type SerializedBuffer = {
|
||||
@@ -27,7 +35,25 @@ export default async function paymentWebhookhandler({
|
||||
(input.payload.rawData as unknown as SerializedBuffer).data
|
||||
)
|
||||
}
|
||||
await paymentService.processEvent(input)
|
||||
|
||||
const processedEvent = await paymentService.getWebhookActionAndData(input)
|
||||
|
||||
if (processedEvent?.action === PaymentActions.NOT_SUPPORTED) {
|
||||
return
|
||||
}
|
||||
|
||||
if (!processedEvent.data) {
|
||||
return
|
||||
}
|
||||
|
||||
await processPaymentWorkflow(container).run({
|
||||
input: processedEvent,
|
||||
})
|
||||
|
||||
// We process the intended side effects of payment processing separately.
|
||||
await onPaymentProcessedWorkflow(container).run({
|
||||
input: processedEvent,
|
||||
})
|
||||
}
|
||||
|
||||
export const config: SubscriberConfig = {
|
||||
|
||||
Reference in New Issue
Block a user