Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(medusa): ensure transaction is reused when service calls itself #6089

Merged
merged 7 commits into from
Jan 19, 2024
23 changes: 13 additions & 10 deletions packages/medusa/src/services/product.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { RemoteQueryFunction } from "@medusajs/types"
import {
buildRelations,
buildSelects,
FlagRouter,
MedusaV2Flag,
objectToStringPath,
promiseAll, selectorConstraintsToString,
promiseAll,
selectorConstraintsToString,
} from "@medusajs/utils"
import { RemoteQueryFunction } from "@medusajs/types"
import { isDefined, MedusaError } from "medusa-core-utils"
import { EntityManager, In } from "typeorm"

Expand Down Expand Up @@ -42,9 +43,9 @@ import {
ProductSelector,
UpdateProductInput,
} from "../types/product"
import { CreateProductVariantInput } from "../types/product-variant"
import { buildQuery, isString, setMetadata } from "../utils"
import EventBusService from "./event-bus"
import { CreateProductVariantInput } from "../types/product-variant"
import SalesChannelService from "./sales-channel"

type InjectedDependencies = {
Expand Down Expand Up @@ -594,7 +595,7 @@ class ProductService extends TransactionBaseService {
)
}

const result = await this.retrieve(product.id, {
const result = await this.withTransaction(manager).retrieve(product.id, {
Copy link
Member

@adrien2p adrien2p Jan 18, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

todo: line 559 is missing. maybe we can do something like productServiceTx = this.withTransaction(manager) and then use it in both places?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@srindom I ve seen that you have merged but there is still a missing transaction here

relations: ["options"],
})

Expand Down Expand Up @@ -645,7 +646,7 @@ class ProductService extends TransactionBaseService {
}
}

const product = await this.retrieve(productId, {
const product = await this.withTransaction(manager).retrieve(productId, {
relations,
})

Expand Down Expand Up @@ -805,7 +806,7 @@ class ProductService extends TransactionBaseService {
this.productOptionRepository_
)

const product = await this.retrieve(productId, {
const product = await this.withTransaction(manager).retrieve(productId, {
relations: ["options", "variants"],
})

Expand Down Expand Up @@ -833,7 +834,7 @@ class ProductService extends TransactionBaseService {
)
}

const result = await this.retrieve(productId)
const result = await this.withTransaction(manager).retrieve(productId)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: same as the previous one to not recreate the instance multiple times everytime


await this.eventBus_
.withTransaction(manager)
Expand All @@ -849,7 +850,7 @@ class ProductService extends TransactionBaseService {
return await this.atomicPhase_(async (manager) => {
const productRepo = manager.withRepository(this.productRepository_)

const product = await this.retrieve(productId, {
const product = await this.withTransaction(manager).retrieve(productId, {
relations: ["variants"],
})

Expand Down Expand Up @@ -898,7 +899,9 @@ class ProductService extends TransactionBaseService {
this.productOptionRepository_
)

const product = await this.retrieve(productId, { relations: ["options"] })
const product = await this.withTransaction(manager).retrieve(productId, {
relations: ["options"],
})

const { title, values } = data

Expand Down Expand Up @@ -973,7 +976,7 @@ class ProductService extends TransactionBaseService {
this.productOptionRepository_
)

const product = await this.retrieve(productId, {
const product = await this.withTransaction(manager).retrieve(productId, {
relations: ["variants", "variants.options"],
})

Expand Down