feat(medusa): Use query relation load strategy on Carts (#3984)
This commit is contained in:
1 parent
4e8045a0ac
commit
b7a7826394
9 files changed
+33
-23
No files matched your search
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/medusa": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
feat(medusa): Use query relation load strategy on Carts
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
|
import { AwilixContainer } from "awilix"
|
||||||
import {
|
import {
|
||||||
DataSource,
|
DataSource,
|
||||||
DataSourceOptions,
|
DataSourceOptions,
|
||||||
Repository,
|
Repository,
|
||||||
TreeRepository,
|
TreeRepository,
|
||||||
} from "typeorm"
|
} from "typeorm"
|
||||||
import { AwilixContainer } from "awilix"
|
|
||||||
import { ConfigModule } from "../types/global"
|
import { ConfigModule } from "../types/global"
|
||||||
import "../utils/naming-strategy"
|
import "../utils/naming-strategy"
|
||||||
|
|
||||||
|
|||||||
@@ -216,7 +216,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import {
|
import {
|
||||||
AfterLoad,
|
|
||||||
BeforeInsert,
|
BeforeInsert,
|
||||||
Column,
|
Column,
|
||||||
Entity,
|
Entity,
|
||||||
@@ -226,7 +225,7 @@ import {
|
|||||||
ManyToMany,
|
ManyToMany,
|
||||||
ManyToOne,
|
ManyToOne,
|
||||||
OneToMany,
|
OneToMany,
|
||||||
OneToOne,
|
OneToOne
|
||||||
} from "typeorm"
|
} from "typeorm"
|
||||||
import { DbAwareColumn, resolveDbType } from "../utils/db-aware-column"
|
import { DbAwareColumn, resolveDbType } from "../utils/db-aware-column"
|
||||||
import {
|
import {
|
||||||
@@ -234,6 +233,8 @@ import {
|
|||||||
FeatureFlagDecorators,
|
FeatureFlagDecorators,
|
||||||
} from "../utils/feature-flag-decorators"
|
} 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 { Address } from "./address"
|
||||||
import { Customer } from "./customer"
|
import { Customer } from "./customer"
|
||||||
import { Discount } from "./discount"
|
import { Discount } from "./discount"
|
||||||
@@ -244,8 +245,6 @@ import { PaymentSession } from "./payment-session"
|
|||||||
import { Region } from "./region"
|
import { Region } from "./region"
|
||||||
import { SalesChannel } from "./sales-channel"
|
import { SalesChannel } from "./sales-channel"
|
||||||
import { ShippingMethod } from "./shipping-method"
|
import { ShippingMethod } from "./shipping-method"
|
||||||
import { SoftDeletableEntity } from "../interfaces/models/soft-deletable-entity"
|
|
||||||
import { generateEntityId } from "../utils/generate-entity-id"
|
|
||||||
|
|
||||||
export enum CartType {
|
export enum CartType {
|
||||||
DEFAULT = "default",
|
DEFAULT = "default",
|
||||||
@@ -391,13 +390,6 @@ export class Cart extends SoftDeletableEntity {
|
|||||||
gift_card_total?: number
|
gift_card_total?: number
|
||||||
gift_card_tax_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()
|
@BeforeInsert()
|
||||||
private beforeInsert(): void {
|
private beforeInsert(): void {
|
||||||
this.id = generateEntityId(this.id, "cart")
|
this.id = generateEntityId(this.id, "cart")
|
||||||
|
|||||||
@@ -11,17 +11,17 @@ import {
|
|||||||
PrimaryColumn,
|
PrimaryColumn,
|
||||||
} from "typeorm"
|
} 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 { Cart } from "./cart"
|
||||||
import { ClaimOrder } from "./claim-order"
|
import { ClaimOrder } from "./claim-order"
|
||||||
import { DbAwareColumn } from "../utils/db-aware-column"
|
|
||||||
import { Order } from "./order"
|
import { Order } from "./order"
|
||||||
import { Return } from "./return"
|
import { Return } from "./return"
|
||||||
import { ShippingMethodTaxLine } from "./shipping-method-tax-line"
|
import { ShippingMethodTaxLine } from "./shipping-method-tax-line"
|
||||||
import { ShippingOption } from "./shipping-option"
|
import { ShippingOption } from "./shipping-option"
|
||||||
import { Swap } from "./swap"
|
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(
|
@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`
|
`"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 })
|
@Column({ nullable: true })
|
||||||
cart_id: string
|
cart_id: string
|
||||||
|
|
||||||
@ManyToOne(() => Cart)
|
@ManyToOne(() => Cart, (cart) => cart.shipping_methods)
|
||||||
@JoinColumn({ name: "cart_id" })
|
@JoinColumn({ name: "cart_id" })
|
||||||
cart: Cart
|
cart: Cart
|
||||||
|
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ import {
|
|||||||
|
|
||||||
import { BaseEntity } from "../interfaces/models/base-entity"
|
import { BaseEntity } from "../interfaces/models/base-entity"
|
||||||
import { DbAwareColumn } from "../utils/db-aware-column"
|
import { DbAwareColumn } from "../utils/db-aware-column"
|
||||||
|
import { generateEntityId } from "../utils/generate-entity-id"
|
||||||
import { Product } from "./product"
|
import { Product } from "./product"
|
||||||
import { ProductType } from "./product-type"
|
import { ProductType } from "./product-type"
|
||||||
import { Region } from "./region"
|
import { Region } from "./region"
|
||||||
import { ShippingOption } from "./shipping-option"
|
import { ShippingOption } from "./shipping-option"
|
||||||
import { generateEntityId } from "../utils/generate-entity-id"
|
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class TaxRate extends BaseEntity {
|
export class TaxRate extends BaseEntity {
|
||||||
@@ -30,7 +30,7 @@ export class TaxRate extends BaseEntity {
|
|||||||
@Column()
|
@Column()
|
||||||
region_id: string
|
region_id: string
|
||||||
|
|
||||||
@ManyToOne(() => Region)
|
@ManyToOne(() => Region, (region) => region.tax_rates)
|
||||||
@JoinColumn({ name: "region_id" })
|
@JoinColumn({ name: "region_id" })
|
||||||
region: Region
|
region: Region
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
import { Cart } from "../models"
|
import { ExtendedFindConfig } from "@medusajs/types"
|
||||||
import { dataSource } from "../loaders/database"
|
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<Cart>) {
|
||||||
|
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
|
export default CartRepository
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
|
import { objectToStringPath } from "@medusajs/utils"
|
||||||
import { flatten, groupBy, map, merge } from "lodash"
|
import { flatten, groupBy, map, merge } from "lodash"
|
||||||
import { FindManyOptions, FindOptionsRelations, In } from "typeorm"
|
import { FindManyOptions, FindOptionsRelations, In } from "typeorm"
|
||||||
import { Order } from "../models"
|
|
||||||
import { objectToStringPath } from "@medusajs/utils"
|
|
||||||
import { dataSource } from "../loaders/database"
|
import { dataSource } from "../loaders/database"
|
||||||
|
import { Order } from "../models"
|
||||||
|
|
||||||
const ITEMS_REL_NAME = "items"
|
const ITEMS_REL_NAME = "items"
|
||||||
const REGION_REL_NAME = "region"
|
const REGION_REL_NAME = "region"
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ describe("CartService", () => {
|
|||||||
it("calls cart model functions", () => {
|
it("calls cart model functions", () => {
|
||||||
expect(cartRepository.findOne).toHaveBeenCalledTimes(1)
|
expect(cartRepository.findOne).toHaveBeenCalledTimes(1)
|
||||||
expect(cartRepository.findOne).toHaveBeenCalledWith({
|
expect(cartRepository.findOne).toHaveBeenCalledWith({
|
||||||
|
relationLoadStrategy: "query",
|
||||||
where: { id: IdMap.getId("emptyCart") },
|
where: { id: IdMap.getId("emptyCart") },
|
||||||
select: undefined,
|
select: undefined,
|
||||||
relations: undefined,
|
relations: undefined,
|
||||||
|
|||||||
@@ -231,6 +231,7 @@ class CartService extends TransactionBaseService {
|
|||||||
const cartRepo = this.activeManager_.withRepository(this.cartRepository_)
|
const cartRepo = this.activeManager_.withRepository(this.cartRepository_)
|
||||||
|
|
||||||
const query = buildQuery({ id: cartId }, options)
|
const query = buildQuery({ id: cartId }, options)
|
||||||
|
query.relationLoadStrategy = "query"
|
||||||
|
|
||||||
if ((options.select || []).length === 0) {
|
if ((options.select || []).length === 0) {
|
||||||
query.select = undefined
|
query.select = undefined
|
||||||
|
|||||||
Reference in new issue
Block a user