Skip to content

Commit

Permalink
feat(medusa): Performance improvement of DraftOrder creation (medusaj…
Browse files Browse the repository at this point in the history
…s#3350)

* chore(medusa): Improve draft order creation

* cleanup

* fix unit tests

* fix unit tests 2

* Create beige-ties-hunt.md

* cleanup feedback

---------

Co-authored-by: Oliver Windall Juhl <[email protected]>
  • Loading branch information
adrien2p and olivermrbl authored Mar 2, 2023
1 parent f033711 commit d6b1ad1
Show file tree
Hide file tree
Showing 8 changed files with 223 additions and 113 deletions.
5 changes: 5 additions & 0 deletions .changeset/beige-ties-hunt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@medusajs/medusa": patch
---

Chores(medusa): draft order create improvement perf (first step)
32 changes: 18 additions & 14 deletions packages/medusa/src/services/__tests__/custom-shipping-option.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import CustomShippingOptionService from "../custom-shipping-option"
import { MockManager, MockRepository, IdMap } from "medusa-test-utils"
import { MockManager, MockRepository } from "medusa-test-utils"

describe("CustomShippingOptionService", () => {
describe("list", () => {
Expand Down Expand Up @@ -38,7 +38,7 @@ describe("CustomShippingOptionService", () => {
cart_id: "test-cso-cart",
},
relations: {
"shipping_option": true
shipping_option: true,
},
})
})
Expand Down Expand Up @@ -76,8 +76,8 @@ describe("CustomShippingOptionService", () => {
expect(customShippingOptionRepository.findOne).toHaveBeenCalledWith({
where: { id: "cso-test" },
relations: {
"shipping_option": true,
"cart": true,
shipping_option: true,
cart: true,
},
})
})
Expand Down Expand Up @@ -113,20 +113,24 @@ describe("CustomShippingOptionService", () => {
await customShippingOptionService.create(customShippingOption)

expect(customShippingOptionRepository.create).toHaveBeenCalledTimes(1)
expect(customShippingOptionRepository.create).toHaveBeenCalledWith({
cart_id: "test-cso-cart",
shipping_option_id: "test-so",
price: 30,
metadata: undefined,
})
expect(customShippingOptionRepository.create).toHaveBeenCalledWith([
{
cart_id: "test-cso-cart",
shipping_option_id: "test-so",
price: 30,
metadata: undefined,
},
])

expect(customShippingOptionRepository.save).toHaveBeenCalledTimes(1)
expect(customShippingOptionRepository.save).toHaveBeenCalledWith({
id: "test-cso",
cart_id: "test-cso-cart",
shipping_option_id: "test-so",
price: 30,
metadata: undefined,
0: {
cart_id: "test-cso-cart",
shipping_option_id: "test-so",
price: 30,
metadata: undefined,
},
})
})
})
Expand Down
80 changes: 54 additions & 26 deletions packages/medusa/src/services/__tests__/draft-order.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,12 @@ describe("DraftOrderService", () => {

const lineItemService = {
generate: jest.fn().mockImplementation(() =>
Promise.resolve({
title: "test-item",
variant_id: "test-variant",
})
Promise.resolve([
{
title: "test-item",
variant_id: "test-variant",
},
])
),
create: jest.fn().mockImplementation((data) => data),
withTransaction: function () {
Expand Down Expand Up @@ -88,6 +90,12 @@ describe("DraftOrderService", () => {
...testOrder,
})
),
retrieveWithTotals: jest.fn().mockReturnValue(
Promise.resolve({
id: "test-cart",
...testOrder,
})
),
update: jest.fn(),
applyDiscount: jest.fn(),
addShippingMethod: jest.fn(),
Expand Down Expand Up @@ -151,28 +159,37 @@ describe("DraftOrderService", () => {

expect(cartService.addShippingMethod).toHaveBeenCalledTimes(1)
expect(cartService.addShippingMethod).toHaveBeenCalledWith(
"test-cart",
{
id: "test-cart",
...testOrder,
},
"test-option",
{}
)

expect(lineItemService.generate).toHaveBeenCalledTimes(1)
expect(lineItemService.generate).toHaveBeenCalledWith(
"test-variant",
"test-region",
2,
[
{
variantId: "test-variant",
quantity: 2,
metadata: {},
unit_price: undefined,
},
],
{
metadata: {},
unit_price: undefined,
region_id: "test-region",
}
)

expect(lineItemService.create).toHaveBeenCalledTimes(1)
expect(lineItemService.create).toHaveBeenCalledWith({
cart_id: cartId,
title,
variant_id: "test-variant",
})
expect(lineItemService.create).toHaveBeenCalledWith([
{
cart_id: cartId,
title,
variant_id: "test-variant",
},
])

expect(cartService.applyDiscount).toHaveBeenCalledTimes(0)
})
Expand All @@ -181,6 +198,8 @@ describe("DraftOrderService", () => {
const cartId = "test-cart"
const title = "test-item"

const originalTestOrder = { ...testOrder }

testOrder["discounts"] = [{ code: "TEST" }]
await draftOrderService.create(testOrder)

Expand All @@ -200,28 +219,37 @@ describe("DraftOrderService", () => {

expect(cartService.addShippingMethod).toHaveBeenCalledTimes(1)
expect(cartService.addShippingMethod).toHaveBeenCalledWith(
"test-cart",
{
id: "test-cart",
...originalTestOrder,
},
"test-option",
{}
)

expect(lineItemService.generate).toHaveBeenCalledTimes(1)
expect(lineItemService.generate).toHaveBeenCalledWith(
"test-variant",
"test-region",
2,
[
{
variantId: "test-variant",
quantity: 2,
metadata: {},
unit_price: undefined,
},
],
{
metadata: {},
unit_price: undefined,
region_id: "test-region",
}
)

expect(lineItemService.create).toHaveBeenCalledTimes(1)
expect(lineItemService.create).toHaveBeenCalledWith({
cart_id: cartId,
title,
variant_id: "test-variant",
})
expect(lineItemService.create).toHaveBeenCalledWith([
{
cart_id: cartId,
title,
variant_id: "test-variant",
},
])

expect(cartService.update).toHaveBeenCalledTimes(1)
expect(cartService.update).toHaveBeenCalledWith(cartId, {
Expand Down
30 changes: 16 additions & 14 deletions packages/medusa/src/services/cart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import {
TotalField,
WithRequiredProperty,
} from "../types/common"
import { buildQuery, setMetadata } from "../utils"
import { buildQuery, isString, setMetadata } from "../utils"
import { FlagRouter } from "../utils/flag-router"
import { validateEmail } from "../utils/is-email"
import { PaymentSessionInput } from "../types/payment"
Expand Down Expand Up @@ -2083,28 +2083,30 @@ class CartService extends TransactionBaseService {
* Shipping Option is a possible way to ship an order. Shipping Methods may
* also have additional details in the data field such as an id for a package
* shop.
* @param cartId - the id of the cart to add shipping method to
* @param cartOrId - the id of the cart to add shipping method to
* @param optionId - id of shipping option to add as valid method
* @param data - the fulmillment data for the method
* @return the result of the update operation
*/
async addShippingMethod(
cartId: string,
cartOrId: string | Cart,
optionId: string,
data: Record<string, unknown> = {}
): Promise<Cart> {
return await this.atomicPhase_(
async (transactionManager: EntityManager) => {
const cart = await this.retrieveWithTotals(cartId, {
relations: [
"shipping_methods",
"shipping_methods.shipping_option",
"items",
"items.variant",
"items.variant.product",
"payment_sessions",
],
})
const cart = !isString(cartOrId)
? cartOrId
: await this.retrieveWithTotals(cartOrId, {
relations: [
"shipping_methods",
"shipping_methods.shipping_option",
"items",
"items.variant",
"items.variant.product",
"payment_sessions",
],
})

const cartCustomShippingOptions =
await this.customShippingOptionService_
Expand Down Expand Up @@ -2164,7 +2166,7 @@ class CartService extends TransactionBaseService {
)
}

const updatedCart = await this.retrieve(cartId, {
const updatedCart = await this.retrieve(cart.id, {
relations: ["discounts", "discounts.rule", "shipping_methods"],
})

Expand Down
32 changes: 19 additions & 13 deletions packages/medusa/src/services/custom-shipping-option.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { CustomShippingOptionRepository } from "../repositories/custom-shipping-
import { FindConfig, Selector } from "../types/common"
import { CreateCustomShippingOptionInput } from "../types/shipping-options"
import { buildQuery } from "../utils"
import { DeepPartial } from "typeorm/common/DeepPartial"

type InjectedDependencies = {
manager: EntityManager
Expand Down Expand Up @@ -75,25 +76,30 @@ class CustomShippingOptionService extends TransactionBaseService {
/**
* Creates a custom shipping option
* @param data - the custom shipping option to create
* @param config - any configurations if needed, including meta data
* @return resolves to the creation result
*/
async create(
data: CreateCustomShippingOptionInput
): Promise<CustomShippingOption> {
const { cart_id, shipping_option_id, price, metadata } = data

async create<
T = CreateCustomShippingOptionInput | CreateCustomShippingOptionInput[],
TResult = T extends CreateCustomShippingOptionInput[]
? CustomShippingOption[]
: CustomShippingOption
>(data: T): Promise<TResult> {
const customShippingOptionRepo = this.activeManager_.withRepository(
this.customShippingOptionRepository_
)

const customShippingOption = customShippingOptionRepo.create({
cart_id,
shipping_option_id,
price,
metadata,
})
return await customShippingOptionRepo.save(customShippingOption)
const data_ = (
Array.isArray(data) ? data : [data]
) as DeepPartial<CustomShippingOption>[]

const customShippingOptions = customShippingOptionRepo.create(data_)
const shippingOptions = await customShippingOptionRepo.save(
customShippingOptions
)

return (Array.isArray(data)
? shippingOptions
: shippingOptions[0]) as unknown as TResult
}
}

Expand Down
Loading

0 comments on commit d6b1ad1

Please sign in to comment.