fix(medusa-payment-stripe): Missing transactions in Stripe provider (#2603)
This commit is contained in:
1 parent
d0809bdf25
commit
9e91a50df1
4 files changed
+58
-47
No files matched your search
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
"medusa-payment-stripe": patch
|
||||||
|
"@medusajs/medusa": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix(medusa-payment-stripe): missing transaction on create payment
|
||||||
@@ -12,8 +12,7 @@ class StripeBase extends AbstractPaymentService {
|
|||||||
regionService,
|
regionService,
|
||||||
manager,
|
manager,
|
||||||
},
|
},
|
||||||
options,
|
options
|
||||||
paymentMethodTypes
|
|
||||||
) {
|
) {
|
||||||
super(
|
super(
|
||||||
{
|
{
|
||||||
@@ -25,8 +24,6 @@ class StripeBase extends AbstractPaymentService {
|
|||||||
},
|
},
|
||||||
options
|
options
|
||||||
)
|
)
|
||||||
/** @private @const {string[]} */
|
|
||||||
this.paymentMethodTypes_ = paymentMethodTypes
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required Stripe options:
|
* Required Stripe options:
|
||||||
@@ -123,18 +120,19 @@ class StripeBase extends AbstractPaymentService {
|
|||||||
* @return {Promise<PaymentSessionData>} Stripe payment intent
|
* @return {Promise<PaymentSessionData>} Stripe payment intent
|
||||||
*/
|
*/
|
||||||
async createPayment(cart) {
|
async createPayment(cart) {
|
||||||
const intentRequest = this.getPaymentIntentOptions()
|
const intentRequestData = this.getPaymentIntentOptions()
|
||||||
|
|
||||||
return await this.stripeProviderService_.createPayment(cart, intentRequest)
|
return await this.stripeProviderService_
|
||||||
|
.withTransaction(this.manager_)
|
||||||
|
.createPayment(cart, intentRequestData)
|
||||||
}
|
}
|
||||||
|
|
||||||
async createPaymentNew(paymentInput) {
|
async createPaymentNew(paymentInput) {
|
||||||
const intentRequest = this.getPaymentIntentOptions()
|
const intentRequestData = this.getPaymentIntentOptions()
|
||||||
|
|
||||||
return await this.stripeProviderService_.createPaymentNew(
|
return await this.stripeProviderService_
|
||||||
paymentInput,
|
.withTransaction(this.manager_)
|
||||||
intentRequest
|
.createPaymentNew(paymentInput, intentRequestData)
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -183,17 +181,19 @@ class StripeBase extends AbstractPaymentService {
|
|||||||
* @return {Promise<PaymentSessionData>} Stripe payment intent
|
* @return {Promise<PaymentSessionData>} Stripe payment intent
|
||||||
*/
|
*/
|
||||||
async updatePayment(paymentSessionData, cart) {
|
async updatePayment(paymentSessionData, cart) {
|
||||||
return await this.stripeProviderService_.updatePayment(
|
const intentRequestData = this.getPaymentIntentOptions()
|
||||||
paymentSessionData,
|
|
||||||
cart
|
return await this.stripeProviderService_
|
||||||
)
|
.withTransaction(this.manager_)
|
||||||
|
.updatePayment(paymentSessionData, cart, intentRequestData)
|
||||||
}
|
}
|
||||||
|
|
||||||
async updatePaymentNew(paymentSessionData, paymentInput) {
|
async updatePaymentNew(paymentSessionData, paymentInput) {
|
||||||
return await this.stripeProviderService_.updatePaymentNew(
|
const intentRequestData = this.getPaymentIntentOptions()
|
||||||
paymentSessionData,
|
|
||||||
paymentInput
|
return await this.stripeProviderService_
|
||||||
)
|
.withTransaction(this.manager_)
|
||||||
|
.updatePaymentNew(paymentSessionData, paymentInput, intentRequestData)
|
||||||
}
|
}
|
||||||
|
|
||||||
async deletePayment(paymentSession) {
|
async deletePayment(paymentSession) {
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ class StripeProviderService extends AbstractPaymentService {
|
|||||||
* Creates a Stripe payment intent.
|
* Creates a Stripe payment intent.
|
||||||
* If customer is not registered in Stripe, we do so.
|
* If customer is not registered in Stripe, we do so.
|
||||||
* @param {Cart} cart - cart to create a payment for
|
* @param {Cart} cart - cart to create a payment for
|
||||||
|
* @param intentRequestData
|
||||||
* @return {Promise<PaymentSessionData>} Stripe payment intent
|
* @return {Promise<PaymentSessionData>} Stripe payment intent
|
||||||
*/
|
*/
|
||||||
async createPayment(cart, intentRequestData = {}) {
|
async createPayment(cart, intentRequestData = {}) {
|
||||||
@@ -271,20 +272,24 @@ class StripeProviderService extends AbstractPaymentService {
|
|||||||
* Updates Stripe payment intent.
|
* Updates Stripe payment intent.
|
||||||
* @param {PaymentSessionData} paymentSessionData - payment session data.
|
* @param {PaymentSessionData} paymentSessionData - payment session data.
|
||||||
* @param {Cart} cart
|
* @param {Cart} cart
|
||||||
|
* @param intentRequestData
|
||||||
* @return {Promise<PaymentSessionData>} Stripe payment intent
|
* @return {Promise<PaymentSessionData>} Stripe payment intent
|
||||||
*/
|
*/
|
||||||
async updatePayment(sessionData, cart) {
|
async updatePayment(paymentSessionData, cart, intentRequestData) {
|
||||||
try {
|
try {
|
||||||
const stripeId = cart.customer?.metadata?.stripe_id || undefined
|
const stripeId = cart.customer?.metadata?.stripe_id || undefined
|
||||||
|
|
||||||
if (stripeId !== sessionData.customer) {
|
if (stripeId !== paymentSessionData.customer) {
|
||||||
return await this.createPayment(cart)
|
return await this.createPayment(cart, intentRequestData)
|
||||||
} else {
|
} else {
|
||||||
if (cart.total && sessionData.amount === Math.round(cart.total)) {
|
if (
|
||||||
return sessionData
|
cart.total &&
|
||||||
|
paymentSessionData.amount === Math.round(cart.total)
|
||||||
|
) {
|
||||||
|
return paymentSessionData
|
||||||
}
|
}
|
||||||
|
|
||||||
return await this.stripe_.paymentIntents.update(sessionData.id, {
|
return await this.stripe_.paymentIntents.update(paymentSessionData.id, {
|
||||||
amount: Math.round(cart.total),
|
amount: Math.round(cart.total),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -293,15 +298,15 @@ class StripeProviderService extends AbstractPaymentService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async updatePaymentNew(paymentSessionData, paymentInput) {
|
async updatePaymentNew(paymentSessionData, paymentInput, intentRequestData) {
|
||||||
try {
|
try {
|
||||||
const stripeId = paymentInput.customer?.metadata?.stripe_id
|
const stripeId = paymentInput.customer?.metadata?.stripe_id
|
||||||
|
|
||||||
if (stripeId !== paymentInput.customer_id) {
|
if (stripeId !== paymentInput.customer_id) {
|
||||||
return await this.createPaymentNew(paymentInput)
|
return await this.createPaymentNew(paymentInput, intentRequestData)
|
||||||
} else {
|
} else {
|
||||||
if (paymentSessionData.amount === Math.round(paymentInput.amount)) {
|
if (paymentSessionData.amount === Math.round(paymentInput.amount)) {
|
||||||
return sessionData
|
return paymentSessionData
|
||||||
}
|
}
|
||||||
|
|
||||||
return await this.stripe_.paymentIntents.update(paymentSessionData.id, {
|
return await this.stripe_.paymentIntents.update(paymentSessionData.id, {
|
||||||
|
|||||||
@@ -27,7 +27,12 @@ import {
|
|||||||
isCart,
|
isCart,
|
||||||
LineItemUpdate,
|
LineItemUpdate,
|
||||||
} from "../types/cart"
|
} from "../types/cart"
|
||||||
import { AddressPayload, FindConfig, TotalField } from "../types/common"
|
import {
|
||||||
|
AddressPayload,
|
||||||
|
FindConfig,
|
||||||
|
TotalField,
|
||||||
|
WithRequiredProperty,
|
||||||
|
} from "../types/common"
|
||||||
import { buildQuery, isDefined, setMetadata } from "../utils"
|
import { buildQuery, isDefined, setMetadata } from "../utils"
|
||||||
import { FlagRouter } from "../utils/flag-router"
|
import { FlagRouter } from "../utils/flag-router"
|
||||||
import { validateEmail } from "../utils/is-email"
|
import { validateEmail } from "../utils/is-email"
|
||||||
@@ -281,7 +286,7 @@ class CartService extends TransactionBaseService {
|
|||||||
cartId: string,
|
cartId: string,
|
||||||
options: FindConfig<Cart> = {},
|
options: FindConfig<Cart> = {},
|
||||||
totalsConfig: TotalsConfig = {}
|
totalsConfig: TotalsConfig = {}
|
||||||
): Promise<Cart> {
|
): Promise<WithRequiredProperty<Cart, "total">> {
|
||||||
const relations = this.getTotalsRelations(options)
|
const relations = this.getTotalsRelations(options)
|
||||||
|
|
||||||
const cart = await this.retrieve(cartId, {
|
const cart = await this.retrieve(cartId, {
|
||||||
@@ -823,15 +828,14 @@ class CartService extends TransactionBaseService {
|
|||||||
relations,
|
relations,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const originalCartCustomer = { ...(cart.customer ?? {}) }
|
||||||
if (data.customer_id) {
|
if (data.customer_id) {
|
||||||
await this.updateCustomerId_(cart, data.customer_id)
|
await this.updateCustomerId_(cart, data.customer_id)
|
||||||
} else {
|
} else if (isDefined(data.email)) {
|
||||||
if (isDefined(data.email)) {
|
const customer = await this.createOrFetchUserFromEmail_(data.email)
|
||||||
const customer = await this.createOrFetchUserFromEmail_(data.email)
|
cart.customer = customer
|
||||||
cart.customer = customer
|
cart.customer_id = customer.id
|
||||||
cart.customer_id = customer.id
|
cart.email = customer.email
|
||||||
cart.email = customer.email
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDefined(data.customer_id) || isDefined(data.region_id)) {
|
if (isDefined(data.customer_id) || isDefined(data.region_id)) {
|
||||||
@@ -937,7 +941,10 @@ class CartService extends TransactionBaseService {
|
|||||||
|
|
||||||
const updatedCart = await cartRepo.save(cart)
|
const updatedCart = await cartRepo.save(cart)
|
||||||
|
|
||||||
if ("email" in data || "customer_id" in data) {
|
if (
|
||||||
|
(data.email && data.email !== originalCartCustomer.email) ||
|
||||||
|
(data.customer_id && data.customer_id !== originalCartCustomer.id)
|
||||||
|
) {
|
||||||
await this.eventBus_
|
await this.eventBus_
|
||||||
.withTransaction(transactionManager)
|
.withTransaction(transactionManager)
|
||||||
.emit(CartService.Events.CUSTOMER_UPDATED, updatedCart.id)
|
.emit(CartService.Events.CUSTOMER_UPDATED, updatedCart.id)
|
||||||
@@ -1486,13 +1493,6 @@ class CartService extends TransactionBaseService {
|
|||||||
|
|
||||||
const { total, region } = cart
|
const { total, region } = cart
|
||||||
|
|
||||||
if (typeof total === "undefined") {
|
|
||||||
throw new MedusaError(
|
|
||||||
MedusaError.Types.UNEXPECTED_STATE,
|
|
||||||
"cart.total must be defined"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there are existing payment sessions ensure that these are up to date
|
// If there are existing payment sessions ensure that these are up to date
|
||||||
const seen: string[] = []
|
const seen: string[] = []
|
||||||
if (cart.payment_sessions?.length) {
|
if (cart.payment_sessions?.length) {
|
||||||
@@ -2104,7 +2104,7 @@ class CartService extends TransactionBaseService {
|
|||||||
async decorateTotals(
|
async decorateTotals(
|
||||||
cart: Cart,
|
cart: Cart,
|
||||||
totalsConfig: TotalsConfig = {}
|
totalsConfig: TotalsConfig = {}
|
||||||
): Promise<Cart> {
|
): Promise<WithRequiredProperty<Cart, "total">> {
|
||||||
const manager = this.transactionManager_ ?? this.manager_
|
const manager = this.transactionManager_ ?? this.manager_
|
||||||
const newTotalsServiceTx = this.newTotalsService_.withTransaction(manager)
|
const newTotalsServiceTx = this.newTotalsService_.withTransaction(manager)
|
||||||
|
|
||||||
@@ -2192,7 +2192,7 @@ class CartService extends TransactionBaseService {
|
|||||||
cart.tax_total -
|
cart.tax_total -
|
||||||
(cart.gift_card_total + cart.discount_total + cart.gift_card_tax_total)
|
(cart.gift_card_total + cart.discount_total + cart.gift_card_tax_total)
|
||||||
|
|
||||||
return cart
|
return cart as Cart & { total: number }
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async refreshAdjustments_(cart: Cart): Promise<void> {
|
protected async refreshAdjustments_(cart: Cart): Promise<void> {
|
||||||
|
|||||||
Reference in new issue
Block a user