fix(pricing): events (#11742)

This commit is contained in:
Carlos R. L. Rodrigues
2025-03-05 15:35:23 -03:00
committed by GitHub
parent cc1309d370
commit 16d7294de8
4 changed files with 159 additions and 71 deletions

View File

@@ -0,0 +1,5 @@
---
"@medusajs/pricing": patch
---
fix(pricing): emit events

View File

@@ -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"] },
{

View File

@@ -40,6 +40,7 @@ import {
promiseAll,
removeNullish,
simpleHash,
upperCaseFirst,
} from "@medusajs/framework/utils"
import {
@@ -472,6 +473,7 @@ export default class PricingModuleService
): Promise<PriceSetDTO>
@InjectManager()
@EmitEvents()
async upsertPriceSets(
data: UpsertPriceSetDTO | UpsertPriceSetDTO[],
@MedusaContext() sharedContext: Context = {}
@@ -513,6 +515,7 @@ export default class PricingModuleService
): Promise<PriceSetDTO[]>
@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<PricePreferenceDTO>
@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<typeof PriceRule>[],
preferences: InferEntityType<typeof PricePreference>[],

View File

@@ -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,