From b7a7826394ecd621ca80e6d4ce445ea1c26804ac Mon Sep 17 00:00:00 2001 From: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com> Date: Tue, 2 May 2023 21:10:44 +0200 Subject: [PATCH] feat(medusa): Use query relation load strategy on Carts (#3984) --- .changeset/healthy-carpets-joke.md | 5 +++++ packages/medusa/src/loaders/database.ts | 2 +- packages/medusa/src/models/cart.ts | 14 +++----------- packages/medusa/src/models/shipping-method.ts | 10 +++++----- packages/medusa/src/models/tax-rate.ts | 4 ++-- packages/medusa/src/repositories/cart.ts | 15 +++++++++++++-- packages/medusa/src/repositories/order.ts | 4 ++-- packages/medusa/src/services/__tests__/cart.js | 1 + packages/medusa/src/services/cart.ts | 1 + 9 files changed, 33 insertions(+), 23 deletions(-) create mode 100644 .changeset/healthy-carpets-joke.md diff --git a/.changeset/healthy-carpets-joke.md b/.changeset/healthy-carpets-joke.md new file mode 100644 index 0000000000..0c1c3d9ef3 --- /dev/null +++ b/.changeset/healthy-carpets-joke.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +feat(medusa): Use query relation load strategy on Carts diff --git a/packages/medusa/src/loaders/database.ts b/packages/medusa/src/loaders/database.ts index e5003f4314..9930df2b46 100644 --- a/packages/medusa/src/loaders/database.ts +++ b/packages/medusa/src/loaders/database.ts @@ -1,10 +1,10 @@ +import { AwilixContainer } from "awilix" import { DataSource, DataSourceOptions, Repository, TreeRepository, } from "typeorm" -import { AwilixContainer } from "awilix" import { ConfigModule } from "../types/global" import "../utils/naming-strategy" diff --git a/packages/medusa/src/models/cart.ts b/packages/medusa/src/models/cart.ts index c73464b9dc..5a573c9a4e 100644 --- a/packages/medusa/src/models/cart.ts +++ b/packages/medusa/src/models/cart.ts @@ -216,7 +216,6 @@ */ import { - AfterLoad, BeforeInsert, Column, Entity, @@ -226,7 +225,7 @@ import { ManyToMany, ManyToOne, OneToMany, - OneToOne, + OneToOne } from "typeorm" import { DbAwareColumn, resolveDbType } from "../utils/db-aware-column" import { @@ -234,6 +233,8 @@ import { FeatureFlagDecorators, } from "../utils/feature-flag-decorators" +import { SoftDeletableEntity } from "../interfaces/models/soft-deletable-entity" +import { generateEntityId } from "../utils/generate-entity-id" import { Address } from "./address" import { Customer } from "./customer" import { Discount } from "./discount" @@ -244,8 +245,6 @@ import { PaymentSession } from "./payment-session" import { Region } from "./region" import { SalesChannel } from "./sales-channel" import { ShippingMethod } from "./shipping-method" -import { SoftDeletableEntity } from "../interfaces/models/soft-deletable-entity" -import { generateEntityId } from "../utils/generate-entity-id" export enum CartType { DEFAULT = "default", @@ -391,13 +390,6 @@ export class Cart extends SoftDeletableEntity { gift_card_total?: number gift_card_tax_total?: number - @AfterLoad() - private afterLoad(): void { - if (this.payment_sessions) { - this.payment_session = this.payment_sessions.find((p) => p.is_selected)! - } - } - @BeforeInsert() private beforeInsert(): void { this.id = generateEntityId(this.id, "cart") diff --git a/packages/medusa/src/models/shipping-method.ts b/packages/medusa/src/models/shipping-method.ts index 0881ad021e..273b701f19 100644 --- a/packages/medusa/src/models/shipping-method.ts +++ b/packages/medusa/src/models/shipping-method.ts @@ -11,17 +11,17 @@ import { PrimaryColumn, } from "typeorm" +import TaxInclusivePricingFeatureFlag from "../loaders/feature-flags/tax-inclusive-pricing" +import { DbAwareColumn } from "../utils/db-aware-column" +import { FeatureFlagColumn } from "../utils/feature-flag-decorators" +import { generateEntityId } from "../utils/generate-entity-id" import { Cart } from "./cart" import { ClaimOrder } from "./claim-order" -import { DbAwareColumn } from "../utils/db-aware-column" import { Order } from "./order" import { Return } from "./return" import { ShippingMethodTaxLine } from "./shipping-method-tax-line" import { ShippingOption } from "./shipping-option" import { Swap } from "./swap" -import { generateEntityId } from "../utils/generate-entity-id" -import { FeatureFlagColumn } from "../utils/feature-flag-decorators" -import TaxInclusivePricingFeatureFlag from "../loaders/feature-flags/tax-inclusive-pricing" @Check( `"claim_order_id" IS NOT NULL OR "order_id" IS NOT NULL OR "cart_id" IS NOT NULL OR "swap_id" IS NOT NULL OR "return_id" IS NOT NULL` @@ -56,7 +56,7 @@ export class ShippingMethod { @Column({ nullable: true }) cart_id: string - @ManyToOne(() => Cart) + @ManyToOne(() => Cart, (cart) => cart.shipping_methods) @JoinColumn({ name: "cart_id" }) cart: Cart diff --git a/packages/medusa/src/models/tax-rate.ts b/packages/medusa/src/models/tax-rate.ts index e892a6f210..38dcea6848 100644 --- a/packages/medusa/src/models/tax-rate.ts +++ b/packages/medusa/src/models/tax-rate.ts @@ -10,11 +10,11 @@ import { import { BaseEntity } from "../interfaces/models/base-entity" import { DbAwareColumn } from "../utils/db-aware-column" +import { generateEntityId } from "../utils/generate-entity-id" import { Product } from "./product" import { ProductType } from "./product-type" import { Region } from "./region" import { ShippingOption } from "./shipping-option" -import { generateEntityId } from "../utils/generate-entity-id" @Entity() export class TaxRate extends BaseEntity { @@ -30,7 +30,7 @@ export class TaxRate extends BaseEntity { @Column() region_id: string - @ManyToOne(() => Region) + @ManyToOne(() => Region, (region) => region.tax_rates) @JoinColumn({ name: "region_id" }) region: Region diff --git a/packages/medusa/src/repositories/cart.ts b/packages/medusa/src/repositories/cart.ts index 8ab763bee4..0e53257f86 100644 --- a/packages/medusa/src/repositories/cart.ts +++ b/packages/medusa/src/repositories/cart.ts @@ -1,5 +1,16 @@ -import { Cart } from "../models" +import { ExtendedFindConfig } from "@medusajs/types" import { dataSource } from "../loaders/database" +import { Cart } from "../models" -export const CartRepository = dataSource.getRepository(Cart) +export const CartRepository = dataSource.getRepository(Cart).extend({ + async findOne(options: ExtendedFindConfig) { + const [cart] = await this.find(options) + + if (cart?.payment_sessions?.length) { + cart.payment_session = cart.payment_sessions.find((p) => p.is_selected)! + } + + return cart + }, +}) export default CartRepository diff --git a/packages/medusa/src/repositories/order.ts b/packages/medusa/src/repositories/order.ts index 38b7cd96f6..e0e153b1fe 100644 --- a/packages/medusa/src/repositories/order.ts +++ b/packages/medusa/src/repositories/order.ts @@ -1,8 +1,8 @@ +import { objectToStringPath } from "@medusajs/utils" import { flatten, groupBy, map, merge } from "lodash" import { FindManyOptions, FindOptionsRelations, In } from "typeorm" -import { Order } from "../models" -import { objectToStringPath } from "@medusajs/utils" import { dataSource } from "../loaders/database" +import { Order } from "../models" const ITEMS_REL_NAME = "items" const REGION_REL_NAME = "region" diff --git a/packages/medusa/src/services/__tests__/cart.js b/packages/medusa/src/services/__tests__/cart.js index 20f249f061..b8d17b4af1 100644 --- a/packages/medusa/src/services/__tests__/cart.js +++ b/packages/medusa/src/services/__tests__/cart.js @@ -83,6 +83,7 @@ describe("CartService", () => { it("calls cart model functions", () => { expect(cartRepository.findOne).toHaveBeenCalledTimes(1) expect(cartRepository.findOne).toHaveBeenCalledWith({ + relationLoadStrategy: "query", where: { id: IdMap.getId("emptyCart") }, select: undefined, relations: undefined, diff --git a/packages/medusa/src/services/cart.ts b/packages/medusa/src/services/cart.ts index d0ad660249..d2f2a13045 100644 --- a/packages/medusa/src/services/cart.ts +++ b/packages/medusa/src/services/cart.ts @@ -231,6 +231,7 @@ class CartService extends TransactionBaseService { const cartRepo = this.activeManager_.withRepository(this.cartRepository_) const query = buildQuery({ id: cartId }, options) + query.relationLoadStrategy = "query" if ((options.select || []).length === 0) { query.select = undefined