Skip to content

Commit

Permalink
fix(pricing): events (#11742)
Browse files Browse the repository at this point in the history
  • Loading branch information
carlos-r-l-rodrigues authored Mar 5, 2025
1 parent cc1309d commit 16d7294
Show file tree
Hide file tree
Showing 4 changed files with 159 additions and 71 deletions.
5 changes: 5 additions & 0 deletions .changeset/tender-horses-jog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@medusajs/pricing": patch
---

fix(pricing): emit events
Original file line number Diff line number Diff line change
Expand Up @@ -825,6 +825,32 @@ moduleIntegrationTestRunner<IPricingModuleService>({
},
])

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"] },
{
Expand Down
161 changes: 94 additions & 67 deletions packages/modules/pricing/src/services/pricing-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import {
promiseAll,
removeNullish,
simpleHash,
upperCaseFirst,
} from "@medusajs/framework/utils"

import {
Expand Down Expand Up @@ -472,6 +473,7 @@ export default class PricingModuleService
): Promise<PriceSetDTO>

@InjectManager()
@EmitEvents()
async upsertPriceSets(
data: UpsertPriceSetDTO | UpsertPriceSetDTO[],
@MedusaContext() sharedContext: Context = {}
Expand Down Expand Up @@ -513,6 +515,7 @@ export default class PricingModuleService
): Promise<PriceSetDTO[]>

@InjectManager()
@EmitEvents()
// @ts-expect-error
async updatePriceSets(
idOrSelector: string | PricingTypes.FilterablePriceSetProps,
Expand Down Expand Up @@ -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 {
Expand All @@ -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)
Expand Down Expand Up @@ -747,6 +762,7 @@ export default class PricingModuleService
}

@InjectTransactionManager()
@EmitEvents()
// @ts-ignore
async updatePriceLists(
data: PricingTypes.UpdatePriceListDTO[],
Expand All @@ -760,6 +776,7 @@ export default class PricingModuleService
}

@InjectManager()
@EmitEvents()
async updatePriceListPrices(
data: PricingTypes.UpdatePriceListPricesDTO[],
@MedusaContext() sharedContext: Context = {}
Expand All @@ -770,6 +787,7 @@ export default class PricingModuleService
}

@InjectManager()
@EmitEvents()
async removePrices(
ids: string[],
@MedusaContext() sharedContext: Context = {}
Expand All @@ -789,6 +807,7 @@ export default class PricingModuleService
}

@InjectManager()
@EmitEvents()
async setPriceListRules(
data: PricingTypes.SetPriceListRulesDTO,
@MedusaContext() sharedContext: Context = {}
Expand All @@ -801,6 +820,7 @@ export default class PricingModuleService
}

@InjectManager()
@EmitEvents()
async removePriceListRules(
data: PricingTypes.RemovePriceListRulesDTO,
@MedusaContext() sharedContext: Context = {}
Expand Down Expand Up @@ -852,6 +872,7 @@ export default class PricingModuleService
): Promise<PricePreferenceDTO>

@InjectManager()
@EmitEvents()
async upsertPricePreferences(
data: UpsertPricePreferenceDTO | UpsertPricePreferenceDTO[],
@MedusaContext() sharedContext: Context = {}
Expand Down Expand Up @@ -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,
})

Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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,
})

Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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<typeof PriceRule>[],
preferences: InferEntityType<typeof PricePreference>[],
Expand Down
Loading

0 comments on commit 16d7294

Please sign in to comment.