fix(medusa-payment-stripe): Missing transactions in Stripe provider (#2603)

This commit is contained in:
Adrien de Peretti authored and GitHub committed 2022-11-14 20:03:06 +01:00
1 parent d0809bdf25
commit 9e91a50df1
4 files changed
+58 -47

No files matched your search

+6
View File
@@ -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, {
+19 -19
View File
@@ -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> {