fix(pricing): events (#11742)
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/pricing": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix(pricing): emit events
|
||||||
+26
@@ -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>[],
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user