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
+5
View File
@@ -0,0 +1,5 @@
---
"@medusajs/pricing": patch
---
fix(pricing): emit events
@@ -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( const [priceList] = await service.listPriceLists(
{ id: ["price-list-1"] }, { id: ["price-list-1"] },
{ {
@@ -40,6 +40,7 @@ import {
promiseAll, promiseAll,
removeNullish, removeNullish,
simpleHash, simpleHash,
upperCaseFirst,
} from "@medusajs/framework/utils" } from "@medusajs/framework/utils"
import { import {
@@ -472,6 +473,7 @@ export default class PricingModuleService
): Promise<PriceSetDTO> ): Promise<PriceSetDTO>
@InjectManager() @InjectManager()
@EmitEvents()
async upsertPriceSets( async upsertPriceSets(
data: UpsertPriceSetDTO | UpsertPriceSetDTO[], data: UpsertPriceSetDTO | UpsertPriceSetDTO[],
@MedusaContext() sharedContext: Context = {} @MedusaContext() sharedContext: Context = {}
@@ -513,6 +515,7 @@ export default class PricingModuleService
): Promise<PriceSetDTO[]> ): Promise<PriceSetDTO[]>
@InjectManager() @InjectManager()
@EmitEvents()
// @ts-expect-error // @ts-expect-error
async updatePriceSets( async updatePriceSets(
idOrSelector: string | PricingTypes.FilterablePriceSetProps, idOrSelector: string | PricingTypes.FilterablePriceSetProps,
@@ -563,13 +566,19 @@ export default class PricingModuleService
}) })
const prices = normalizedData.flatMap((priceSet) => priceSet.prices || []) const prices = normalizedData.flatMap((priceSet) => priceSet.prices || [])
const { entities: upsertedPrices } = const { entities: upsertedPrices, performedActions } =
await this.priceService_.upsertWithReplace( await this.priceService_.upsertWithReplace(
prices, prices,
{ relations: ["price_rules"] }, { relations: ["price_rules"] },
sharedContext sharedContext
) )
composeAllEvents({
eventBuilders,
performedActions,
sharedContext,
})
const priceSetsToUpsert = normalizedData.map((priceSet) => { const priceSetsToUpsert = normalizedData.map((priceSet) => {
const { prices, ...rest } = priceSet const { prices, ...rest } = priceSet
return { return {
@@ -594,13 +603,19 @@ export default class PricingModuleService
} }
}) })
const { entities: priceSets } = const { entities: priceSets, performedActions: priceSetPerformedActions } =
await this.priceSetService_.upsertWithReplace( await this.priceSetService_.upsertWithReplace(
priceSetsToUpsert, priceSetsToUpsert,
{ relations: ["prices"] }, { relations: ["prices"] },
sharedContext sharedContext
) )
composeAllEvents({
eventBuilders,
performedActions: priceSetPerformedActions,
sharedContext,
})
return priceSets.map((ps) => { return priceSets.map((ps) => {
if (ps.prices) { if (ps.prices) {
ps.prices = (ps.prices as any).filter((p) => !p.price_list_id) ps.prices = (ps.prices as any).filter((p) => !p.price_list_id)
@@ -747,6 +762,7 @@ export default class PricingModuleService
} }
@InjectTransactionManager() @InjectTransactionManager()
@EmitEvents()
// @ts-ignore // @ts-ignore
async updatePriceLists( async updatePriceLists(
data: PricingTypes.UpdatePriceListDTO[], data: PricingTypes.UpdatePriceListDTO[],
@@ -760,6 +776,7 @@ export default class PricingModuleService
} }
@InjectManager() @InjectManager()
@EmitEvents()
async updatePriceListPrices( async updatePriceListPrices(
data: PricingTypes.UpdatePriceListPricesDTO[], data: PricingTypes.UpdatePriceListPricesDTO[],
@MedusaContext() sharedContext: Context = {} @MedusaContext() sharedContext: Context = {}
@@ -770,6 +787,7 @@ export default class PricingModuleService
} }
@InjectManager() @InjectManager()
@EmitEvents()
async removePrices( async removePrices(
ids: string[], ids: string[],
@MedusaContext() sharedContext: Context = {} @MedusaContext() sharedContext: Context = {}
@@ -789,6 +807,7 @@ export default class PricingModuleService
} }
@InjectManager() @InjectManager()
@EmitEvents()
async setPriceListRules( async setPriceListRules(
data: PricingTypes.SetPriceListRulesDTO, data: PricingTypes.SetPriceListRulesDTO,
@MedusaContext() sharedContext: Context = {} @MedusaContext() sharedContext: Context = {}
@@ -801,6 +820,7 @@ export default class PricingModuleService
} }
@InjectManager() @InjectManager()
@EmitEvents()
async removePriceListRules( async removePriceListRules(
data: PricingTypes.RemovePriceListRulesDTO, data: PricingTypes.RemovePriceListRulesDTO,
@MedusaContext() sharedContext: Context = {} @MedusaContext() sharedContext: Context = {}
@@ -852,6 +872,7 @@ export default class PricingModuleService
): Promise<PricePreferenceDTO> ): Promise<PricePreferenceDTO>
@InjectManager() @InjectManager()
@EmitEvents()
async upsertPricePreferences( async upsertPricePreferences(
data: UpsertPricePreferenceDTO | UpsertPricePreferenceDTO[], data: UpsertPricePreferenceDTO | UpsertPricePreferenceDTO[],
@MedusaContext() sharedContext: Context = {} @MedusaContext() sharedContext: Context = {}
@@ -1081,29 +1102,10 @@ export default class PricingModuleService
{ relations: ["price_rules"] }, { relations: ["price_rules"] },
sharedContext 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({ composeAllEvents({
data: performedActions.created[PriceRule.name] ?? [], eventBuilders,
sharedContext, performedActions,
})
eventBuilders.updatedPriceRule({
data: performedActions.updated[PriceRule.name] ?? [],
sharedContext,
})
eventBuilders.deletedPriceRule({
data: performedActions.deleted[PriceRule.name] ?? [],
sharedContext, sharedContext,
}) })
@@ -1277,12 +1279,16 @@ export default class PricingModuleService
} }
) )
const { entities } = await this.priceListService_.upsertWithReplace( const { entities, performedActions } =
normalizedData, await this.priceListService_.upsertWithReplace(normalizedData, {
{
relations: ["price_list_rules"], relations: ["price_list_rules"],
} })
)
composeAllEvents({
eventBuilders,
performedActions,
sharedContext,
})
return entities return entities
} }
@@ -1326,11 +1332,18 @@ export default class PricingModuleService
} }
} }
const { entities } = await this.priceService_.upsertWithReplace( const { entities, performedActions } =
pricesToUpsert, await this.priceService_.upsertWithReplace(
{ relations: ["price_rules"] }, pricesToUpsert,
sharedContext { relations: ["price_rules"] },
) sharedContext
)
composeAllEvents({
eventBuilders,
performedActions,
sharedContext,
})
return entities return entities
} }
@@ -1388,29 +1401,9 @@ export default class PricingModuleService
sharedContext sharedContext
) )
eventBuilders.createdPrice({ composeAllEvents({
data: performedActions.created[Price.name] ?? [], eventBuilders,
sharedContext, performedActions,
})
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] ?? [],
sharedContext, sharedContext,
}) })
@@ -1472,11 +1465,18 @@ export default class PricingModuleService
}) })
.filter(Boolean) .filter(Boolean)
const { entities } = await this.priceListService_.upsertWithReplace( const { entities, performedActions } =
priceListsUpsert, await this.priceListService_.upsertWithReplace(
{ relations: ["price_list_rules"] }, priceListsUpsert,
sharedContext { relations: ["price_list_rules"] },
) sharedContext
)
composeAllEvents({
eventBuilders,
performedActions,
sharedContext,
})
return entities return entities
} }
@@ -1539,11 +1539,18 @@ export default class PricingModuleService
}) })
.filter(Boolean) .filter(Boolean)
const { entities } = await this.priceListService_.upsertWithReplace( const { entities, performedActions } =
priceListsUpsert, await this.priceListService_.upsertWithReplace(
{ relations: ["price_list_rules"] }, priceListsUpsert,
sharedContext { relations: ["price_list_rules"] },
) sharedContext
)
composeAllEvents({
eventBuilders,
performedActions,
sharedContext,
})
return entities 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 = ( const isTaxInclusive = (
priceRules: InferEntityType<typeof PriceRule>[], priceRules: InferEntityType<typeof PriceRule>[],
preferences: InferEntityType<typeof PricePreference>[], preferences: InferEntityType<typeof PricePreference>[],
+34 -4
View File
@@ -36,11 +36,11 @@ export const eventBuilders = {
object: "price_list_rule", object: "price_list_rule",
eventName: PricingEvents.PRICE_LIST_RULE_CREATED, eventName: PricingEvents.PRICE_LIST_RULE_CREATED,
}), }),
attachedPriceListRule: moduleEventBuilderFactory({ updatedPriceSet: moduleEventBuilderFactory({
source: Modules.PRICING, source: Modules.PRICING,
action: CommonEvents.ATTACHED, action: CommonEvents.UPDATED,
object: "price_list_rule", object: "price_set",
eventName: PricingEvents.PRICE_LIST_RULE_ATTACHED, eventName: PricingEvents.PRICE_SET_UPDATED,
}), }),
updatedPrice: moduleEventBuilderFactory({ updatedPrice: moduleEventBuilderFactory({
source: Modules.PRICING, source: Modules.PRICING,
@@ -48,18 +48,48 @@ export const eventBuilders = {
object: "price", object: "price",
eventName: PricingEvents.PRICE_UPDATED, 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({ updatedPriceRule: moduleEventBuilderFactory({
source: Modules.PRICING, source: Modules.PRICING,
action: CommonEvents.UPDATED, action: CommonEvents.UPDATED,
object: "price_rule", object: "price_rule",
eventName: PricingEvents.PRICE_RULE_UPDATED, eventName: PricingEvents.PRICE_RULE_UPDATED,
}), }),
deletedPriceSet: moduleEventBuilderFactory({
source: Modules.PRICING,
action: CommonEvents.DELETED,
object: "price_set",
eventName: PricingEvents.PRICE_SET_DELETED,
}),
deletedPrice: moduleEventBuilderFactory({ deletedPrice: moduleEventBuilderFactory({
source: Modules.PRICING, source: Modules.PRICING,
action: CommonEvents.DELETED, action: CommonEvents.DELETED,
object: "price", object: "price",
eventName: PricingEvents.PRICE_DELETED, 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({ deletedPriceRule: moduleEventBuilderFactory({
source: Modules.PRICING, source: Modules.PRICING,
action: CommonEvents.DELETED, action: CommonEvents.DELETED,