diff --git a/.changeset/hot-cougars-speak.md b/.changeset/hot-cougars-speak.md new file mode 100644 index 0000000000..874a727b59 --- /dev/null +++ b/.changeset/hot-cougars-speak.md @@ -0,0 +1,7 @@ +--- +"@medusajs/inventory": patch +"@medusajs/medusa": patch +"@medusajs/types": patch +--- + +fix(medusa): Order edit missing transaction when consuming the inventory module diff --git a/packages/inventory/src/services/inventory.ts b/packages/inventory/src/services/inventory.ts index 66543e8dee..33c03a284c 100644 --- a/packages/inventory/src/services/inventory.ts +++ b/packages/inventory/src/services/inventory.ts @@ -441,7 +441,7 @@ export default class InventoryService implements IInventoryService { target.moduleDeclaration?.resources === MODULE_RESOURCE_TYPE.ISOLATED ) async deleteReservationItemsByLineItem( - lineItemId: string, + lineItemId: string | string[], @MedusaContext() context: SharedContext = {} ): Promise { return await this.reservationItemService_.deleteByLineItem( diff --git a/packages/inventory/src/services/reservation-item.ts b/packages/inventory/src/services/reservation-item.ts index 0dec2de6f6..61743a15df 100644 --- a/packages/inventory/src/services/reservation-item.ts +++ b/packages/inventory/src/services/reservation-item.ts @@ -8,11 +8,11 @@ import { } from "@medusajs/types" import { InjectEntityManager, + isDefined, MedusaContext, MedusaError, - isDefined, } from "@medusajs/utils" -import { EntityManager, FindManyOptions } from "typeorm" +import { EntityManager, FindManyOptions, In } from "typeorm" import { InventoryLevelService } from "." import { ReservationItem } from "../models" import { buildQuery } from "../utils/build-query" @@ -235,21 +235,24 @@ export default class ReservationItemService { */ @InjectEntityManager() async deleteByLineItem( - lineItemId: string, + lineItemId: string | string[], @MedusaContext() context: SharedContext = {} ): Promise { const manager = context.transactionManager! const itemRepository = manager.getRepository(ReservationItem) + const itemsIds = Array.isArray(lineItemId) ? lineItemId : [lineItemId] + const items = await this.list( - { line_item_id: lineItemId }, + { line_item_id: itemsIds }, undefined, context ) const ops: Promise[] = [ - itemRepository.softDelete({ line_item_id: lineItemId }), + itemRepository.softDelete({ line_item_id: In(itemsIds) }), ] + for (const item of items) { ops.push( this.inventoryLevelService_.adjustReservedQuantity( @@ -260,6 +263,7 @@ export default class ReservationItemService { ) ) } + await Promise.all(ops) await this.eventBusService_?.emit?.(ReservationItemService.Events.DELETED, { diff --git a/packages/medusa/src/services/order-edit.ts b/packages/medusa/src/services/order-edit.ts index 9391b19c88..8280931ca2 100644 --- a/packages/medusa/src/services/order-edit.ts +++ b/packages/medusa/src/services/order-edit.ts @@ -26,7 +26,7 @@ import { TaxProviderService, TotalsService, } from "./index" -import { MedusaError, isDefined } from "medusa-core-utils" +import { isDefined, MedusaError } from "medusa-core-utils" import { buildQuery, isString } from "../utils" import EventBusService from "./event-bus" @@ -767,13 +767,12 @@ export default class OrderEditService extends TransactionBaseService { orderEdit = await orderEditRepository.save(orderEdit) if (this.inventoryService_) { - await Promise.all( - lineItems.map( - async (lineItem) => - await this.inventoryService_!.deleteReservationItemsByLineItem( - lineItem.id - ) - ) + const itemsIds = lineItems.map((i) => i.id) + await this.inventoryService_!.deleteReservationItemsByLineItem( + itemsIds, + { + transactionManager: manager, + } ) } diff --git a/packages/medusa/src/services/product-variant-inventory.ts b/packages/medusa/src/services/product-variant-inventory.ts index c12fbf33e6..5d138d4208 100644 --- a/packages/medusa/src/services/product-variant-inventory.ts +++ b/packages/medusa/src/services/product-variant-inventory.ts @@ -3,14 +3,14 @@ import { ICacheService, IEventBusService, IInventoryService, - IStockLocationService, InventoryItemDTO, InventoryLevelDTO, + IStockLocationService, ReservationItemDTO, ReserveQuantityContext, } from "@medusajs/types" import { LineItem, Product, ProductVariant } from "../models" -import { MedusaError, isDefined } from "@medusajs/utils" +import { isDefined, MedusaError } from "@medusajs/utils" import { PricedProduct, PricedVariant } from "../types/pricing" import { TransactionBaseService } from "../interfaces" @@ -584,7 +584,7 @@ class ProductVariantInventoryService extends TransactionBaseService { * @param quantity quantity to release */ async deleteReservationsByLineItem( - lineItemId: string, + lineItemId: string | string[], variantId: string, quantity: number ): Promise { @@ -606,7 +606,10 @@ class ProductVariantInventoryService extends TransactionBaseService { }) } - await this.inventoryService_.deleteReservationItemsByLineItem(lineItemId) + const itemIds = Array.isArray(lineItemId) ? lineItemId : [lineItemId] + await this.inventoryService_.deleteReservationItemsByLineItem(itemIds, { + transactionManager: this.activeManager_, + }) } /** diff --git a/packages/types/src/inventory/inventory.ts b/packages/types/src/inventory/inventory.ts index bba326378e..d5ae199874 100644 --- a/packages/types/src/inventory/inventory.ts +++ b/packages/types/src/inventory/inventory.ts @@ -86,7 +86,7 @@ export interface IInventoryService { ): Promise deleteReservationItemsByLineItem( - lineItemId: string, + lineItemId: string | string[], context?: SharedContext ): Promise