diff --git a/.changeset/tender-horses-jog.md b/.changeset/tender-horses-jog.md new file mode 100644 index 0000000000..96ce6c7714 --- /dev/null +++ b/.changeset/tender-horses-jog.md @@ -0,0 +1,5 @@ +--- +"@medusajs/pricing": patch +--- + +fix(pricing): emit events diff --git a/packages/modules/pricing/integration-tests/__tests__/services/pricing-module/price-list.spec.ts b/packages/modules/pricing/integration-tests/__tests__/services/pricing-module/price-list.spec.ts index 8b3ecf89dd..0ccd07305c 100644 --- a/packages/modules/pricing/integration-tests/__tests__/services/pricing-module/price-list.spec.ts +++ b/packages/modules/pricing/integration-tests/__tests__/services/pricing-module/price-list.spec.ts @@ -825,6 +825,32 @@ moduleIntegrationTestRunner({ }, ]) + const events = eventBusEmitSpy.mock.calls[2][0] + expect(events).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + name: "pricing.price-rule.created", + }), + expect.objectContaining({ + name: "pricing.price-rule.created", + }), + expect.objectContaining({ + name: "pricing.price.updated", + metadata: { + source: "pricing", + object: "price", + action: "updated", + }, + data: { + id: "test-price-id", + }, + }), + expect.objectContaining({ + name: "pricing.price-rule.deleted", + }), + ]) + ) + const [priceList] = await service.listPriceLists( { id: ["price-list-1"] }, { diff --git a/packages/modules/pricing/src/services/pricing-module.ts b/packages/modules/pricing/src/services/pricing-module.ts index 2905da23d9..b1d6896360 100644 --- a/packages/modules/pricing/src/services/pricing-module.ts +++ b/packages/modules/pricing/src/services/pricing-module.ts @@ -40,6 +40,7 @@ import { promiseAll, removeNullish, simpleHash, + upperCaseFirst, } from "@medusajs/framework/utils" import { @@ -472,6 +473,7 @@ export default class PricingModuleService ): Promise @InjectManager() + @EmitEvents() async upsertPriceSets( data: UpsertPriceSetDTO | UpsertPriceSetDTO[], @MedusaContext() sharedContext: Context = {} @@ -513,6 +515,7 @@ export default class PricingModuleService ): Promise @InjectManager() + @EmitEvents() // @ts-expect-error async updatePriceSets( idOrSelector: string | PricingTypes.FilterablePriceSetProps, @@ -563,13 +566,19 @@ export default class PricingModuleService }) const prices = normalizedData.flatMap((priceSet) => priceSet.prices || []) - const { entities: upsertedPrices } = + const { entities: upsertedPrices, performedActions } = await this.priceService_.upsertWithReplace( prices, { relations: ["price_rules"] }, sharedContext ) + composeAllEvents({ + eventBuilders, + performedActions, + sharedContext, + }) + const priceSetsToUpsert = normalizedData.map((priceSet) => { const { prices, ...rest } = priceSet return { @@ -594,13 +603,19 @@ export default class PricingModuleService } }) - const { entities: priceSets } = + const { entities: priceSets, performedActions: priceSetPerformedActions } = await this.priceSetService_.upsertWithReplace( priceSetsToUpsert, { relations: ["prices"] }, sharedContext ) + composeAllEvents({ + eventBuilders, + performedActions: priceSetPerformedActions, + sharedContext, + }) + return priceSets.map((ps) => { if (ps.prices) { ps.prices = (ps.prices as any).filter((p) => !p.price_list_id) @@ -747,6 +762,7 @@ export default class PricingModuleService } @InjectTransactionManager() + @EmitEvents() // @ts-ignore async updatePriceLists( data: PricingTypes.UpdatePriceListDTO[], @@ -760,6 +776,7 @@ export default class PricingModuleService } @InjectManager() + @EmitEvents() async updatePriceListPrices( data: PricingTypes.UpdatePriceListPricesDTO[], @MedusaContext() sharedContext: Context = {} @@ -770,6 +787,7 @@ export default class PricingModuleService } @InjectManager() + @EmitEvents() async removePrices( ids: string[], @MedusaContext() sharedContext: Context = {} @@ -789,6 +807,7 @@ export default class PricingModuleService } @InjectManager() + @EmitEvents() async setPriceListRules( data: PricingTypes.SetPriceListRulesDTO, @MedusaContext() sharedContext: Context = {} @@ -801,6 +820,7 @@ export default class PricingModuleService } @InjectManager() + @EmitEvents() async removePriceListRules( data: PricingTypes.RemovePriceListRulesDTO, @MedusaContext() sharedContext: Context = {} @@ -852,6 +872,7 @@ export default class PricingModuleService ): Promise @InjectManager() + @EmitEvents() async upsertPricePreferences( data: UpsertPricePreferenceDTO | UpsertPricePreferenceDTO[], @MedusaContext() sharedContext: Context = {} @@ -1081,29 +1102,10 @@ export default class PricingModuleService { relations: ["price_rules"] }, sharedContext ) - eventBuilders.createdPrice({ - data: performedActions.created[Price.name] ?? [], - sharedContext, - }) - eventBuilders.updatedPrice({ - data: performedActions.updated[Price.name] ?? [], - sharedContext, - }) - eventBuilders.deletedPrice({ - data: performedActions.deleted[Price.name] ?? [], - sharedContext, - }) - eventBuilders.createdPriceRule({ - data: performedActions.created[PriceRule.name] ?? [], - sharedContext, - }) - eventBuilders.updatedPriceRule({ - data: performedActions.updated[PriceRule.name] ?? [], - sharedContext, - }) - eventBuilders.deletedPriceRule({ - data: performedActions.deleted[PriceRule.name] ?? [], + composeAllEvents({ + eventBuilders, + performedActions, sharedContext, }) @@ -1277,12 +1279,16 @@ export default class PricingModuleService } ) - const { entities } = await this.priceListService_.upsertWithReplace( - normalizedData, - { + const { entities, performedActions } = + await this.priceListService_.upsertWithReplace(normalizedData, { relations: ["price_list_rules"], - } - ) + }) + + composeAllEvents({ + eventBuilders, + performedActions, + sharedContext, + }) return entities } @@ -1326,11 +1332,18 @@ export default class PricingModuleService } } - const { entities } = await this.priceService_.upsertWithReplace( - pricesToUpsert, - { relations: ["price_rules"] }, - sharedContext - ) + const { entities, performedActions } = + await this.priceService_.upsertWithReplace( + pricesToUpsert, + { relations: ["price_rules"] }, + sharedContext + ) + + composeAllEvents({ + eventBuilders, + performedActions, + sharedContext, + }) return entities } @@ -1388,29 +1401,9 @@ export default class PricingModuleService sharedContext ) - eventBuilders.createdPrice({ - data: performedActions.created[Price.name] ?? [], - sharedContext, - }) - eventBuilders.updatedPrice({ - data: performedActions.updated[Price.name] ?? [], - sharedContext, - }) - eventBuilders.deletedPrice({ - data: performedActions.deleted[Price.name] ?? [], - sharedContext, - }) - - eventBuilders.createdPriceRule({ - data: performedActions.created[PriceRule.name] ?? [], - sharedContext, - }) - eventBuilders.updatedPriceRule({ - data: performedActions.updated[PriceRule.name] ?? [], - sharedContext, - }) - eventBuilders.deletedPriceRule({ - data: performedActions.deleted[PriceRule.name] ?? [], + composeAllEvents({ + eventBuilders, + performedActions, sharedContext, }) @@ -1472,11 +1465,18 @@ export default class PricingModuleService }) .filter(Boolean) - const { entities } = await this.priceListService_.upsertWithReplace( - priceListsUpsert, - { relations: ["price_list_rules"] }, - sharedContext - ) + const { entities, performedActions } = + await this.priceListService_.upsertWithReplace( + priceListsUpsert, + { relations: ["price_list_rules"] }, + sharedContext + ) + + composeAllEvents({ + eventBuilders, + performedActions, + sharedContext, + }) return entities } @@ -1539,11 +1539,18 @@ export default class PricingModuleService }) .filter(Boolean) - const { entities } = await this.priceListService_.upsertWithReplace( - priceListsUpsert, - { relations: ["price_list_rules"] }, - sharedContext - ) + const { entities, performedActions } = + await this.priceListService_.upsertWithReplace( + priceListsUpsert, + { relations: ["price_list_rules"] }, + sharedContext + ) + + composeAllEvents({ + eventBuilders, + performedActions, + sharedContext, + }) return entities } @@ -1582,6 +1589,26 @@ export default class PricingModuleService } } +const composeAllEvents = ({ + eventBuilders, + performedActions, + sharedContext, +}) => { + for (const action of Object.keys(performedActions)) { + for (const entity of Object.keys(performedActions[action])) { + const eventName = action + upperCaseFirst(entity) + if (!eventBuilders[eventName]) { + continue + } + + eventBuilders[eventName]({ + data: performedActions[action][entity] ?? [], + sharedContext, + }) + } + } +} + const isTaxInclusive = ( priceRules: InferEntityType[], preferences: InferEntityType[], diff --git a/packages/modules/pricing/src/utils/events.ts b/packages/modules/pricing/src/utils/events.ts index 57d8b2f90b..3d9a8b398d 100644 --- a/packages/modules/pricing/src/utils/events.ts +++ b/packages/modules/pricing/src/utils/events.ts @@ -36,11 +36,11 @@ export const eventBuilders = { object: "price_list_rule", eventName: PricingEvents.PRICE_LIST_RULE_CREATED, }), - attachedPriceListRule: moduleEventBuilderFactory({ + updatedPriceSet: moduleEventBuilderFactory({ source: Modules.PRICING, - action: CommonEvents.ATTACHED, - object: "price_list_rule", - eventName: PricingEvents.PRICE_LIST_RULE_ATTACHED, + action: CommonEvents.UPDATED, + object: "price_set", + eventName: PricingEvents.PRICE_SET_UPDATED, }), updatedPrice: moduleEventBuilderFactory({ source: Modules.PRICING, @@ -48,18 +48,48 @@ export const eventBuilders = { object: "price", eventName: PricingEvents.PRICE_UPDATED, }), + updatedPriceList: moduleEventBuilderFactory({ + source: Modules.PRICING, + action: CommonEvents.UPDATED, + object: "price_list", + eventName: PricingEvents.PRICE_LIST_UPDATED, + }), + updatedPriceListRule: moduleEventBuilderFactory({ + source: Modules.PRICING, + action: CommonEvents.UPDATED, + object: "price_list_rule", + eventName: PricingEvents.PRICE_LIST_RULE_UPDATED, + }), updatedPriceRule: moduleEventBuilderFactory({ source: Modules.PRICING, action: CommonEvents.UPDATED, object: "price_rule", eventName: PricingEvents.PRICE_RULE_UPDATED, }), + deletedPriceSet: moduleEventBuilderFactory({ + source: Modules.PRICING, + action: CommonEvents.DELETED, + object: "price_set", + eventName: PricingEvents.PRICE_SET_DELETED, + }), deletedPrice: moduleEventBuilderFactory({ source: Modules.PRICING, action: CommonEvents.DELETED, object: "price", eventName: PricingEvents.PRICE_DELETED, }), + deletedPriceList: moduleEventBuilderFactory({ + source: Modules.PRICING, + action: CommonEvents.DELETED, + object: "price_list", + eventName: PricingEvents.PRICE_LIST_DELETED, + }), + deletedPriceListRule: moduleEventBuilderFactory({ + source: Modules.PRICING, + action: CommonEvents.DELETED, + object: "price_list_rule", + eventName: PricingEvents.PRICE_LIST_RULE_DELETED, + }), deletedPriceRule: moduleEventBuilderFactory({ source: Modules.PRICING, action: CommonEvents.DELETED,