Skip to content

Commit 16d7294

Browse files
fix(pricing): events (#11742)
1 parent cc1309d commit 16d7294

File tree

4 files changed

+159
-71
lines changed

4 files changed

+159
-71
lines changed

.changeset/tender-horses-jog.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@medusajs/pricing": patch
3+
---
4+
5+
fix(pricing): emit events

packages/modules/pricing/integration-tests/__tests__/services/pricing-module/price-list.spec.ts

+26
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,32 @@ moduleIntegrationTestRunner<IPricingModuleService>({
825825
},
826826
])
827827

828+
const events = eventBusEmitSpy.mock.calls[2][0]
829+
expect(events).toEqual(
830+
expect.arrayContaining([
831+
expect.objectContaining({
832+
name: "pricing.price-rule.created",
833+
}),
834+
expect.objectContaining({
835+
name: "pricing.price-rule.created",
836+
}),
837+
expect.objectContaining({
838+
name: "pricing.price.updated",
839+
metadata: {
840+
source: "pricing",
841+
object: "price",
842+
action: "updated",
843+
},
844+
data: {
845+
id: "test-price-id",
846+
},
847+
}),
848+
expect.objectContaining({
849+
name: "pricing.price-rule.deleted",
850+
}),
851+
])
852+
)
853+
828854
const [priceList] = await service.listPriceLists(
829855
{ id: ["price-list-1"] },
830856
{

packages/modules/pricing/src/services/pricing-module.ts

+94-67
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
promiseAll,
4141
removeNullish,
4242
simpleHash,
43+
upperCaseFirst,
4344
} from "@medusajs/framework/utils"
4445

4546
import {
@@ -472,6 +473,7 @@ export default class PricingModuleService
472473
): Promise<PriceSetDTO>
473474

474475
@InjectManager()
476+
@EmitEvents()
475477
async upsertPriceSets(
476478
data: UpsertPriceSetDTO | UpsertPriceSetDTO[],
477479
@MedusaContext() sharedContext: Context = {}
@@ -513,6 +515,7 @@ export default class PricingModuleService
513515
): Promise<PriceSetDTO[]>
514516

515517
@InjectManager()
518+
@EmitEvents()
516519
// @ts-expect-error
517520
async updatePriceSets(
518521
idOrSelector: string | PricingTypes.FilterablePriceSetProps,
@@ -563,13 +566,19 @@ export default class PricingModuleService
563566
})
564567

565568
const prices = normalizedData.flatMap((priceSet) => priceSet.prices || [])
566-
const { entities: upsertedPrices } =
569+
const { entities: upsertedPrices, performedActions } =
567570
await this.priceService_.upsertWithReplace(
568571
prices,
569572
{ relations: ["price_rules"] },
570573
sharedContext
571574
)
572575

576+
composeAllEvents({
577+
eventBuilders,
578+
performedActions,
579+
sharedContext,
580+
})
581+
573582
const priceSetsToUpsert = normalizedData.map((priceSet) => {
574583
const { prices, ...rest } = priceSet
575584
return {
@@ -594,13 +603,19 @@ export default class PricingModuleService
594603
}
595604
})
596605

597-
const { entities: priceSets } =
606+
const { entities: priceSets, performedActions: priceSetPerformedActions } =
598607
await this.priceSetService_.upsertWithReplace(
599608
priceSetsToUpsert,
600609
{ relations: ["prices"] },
601610
sharedContext
602611
)
603612

613+
composeAllEvents({
614+
eventBuilders,
615+
performedActions: priceSetPerformedActions,
616+
sharedContext,
617+
})
618+
604619
return priceSets.map((ps) => {
605620
if (ps.prices) {
606621
ps.prices = (ps.prices as any).filter((p) => !p.price_list_id)
@@ -747,6 +762,7 @@ export default class PricingModuleService
747762
}
748763

749764
@InjectTransactionManager()
765+
@EmitEvents()
750766
// @ts-ignore
751767
async updatePriceLists(
752768
data: PricingTypes.UpdatePriceListDTO[],
@@ -760,6 +776,7 @@ export default class PricingModuleService
760776
}
761777

762778
@InjectManager()
779+
@EmitEvents()
763780
async updatePriceListPrices(
764781
data: PricingTypes.UpdatePriceListPricesDTO[],
765782
@MedusaContext() sharedContext: Context = {}
@@ -770,6 +787,7 @@ export default class PricingModuleService
770787
}
771788

772789
@InjectManager()
790+
@EmitEvents()
773791
async removePrices(
774792
ids: string[],
775793
@MedusaContext() sharedContext: Context = {}
@@ -789,6 +807,7 @@ export default class PricingModuleService
789807
}
790808

791809
@InjectManager()
810+
@EmitEvents()
792811
async setPriceListRules(
793812
data: PricingTypes.SetPriceListRulesDTO,
794813
@MedusaContext() sharedContext: Context = {}
@@ -801,6 +820,7 @@ export default class PricingModuleService
801820
}
802821

803822
@InjectManager()
823+
@EmitEvents()
804824
async removePriceListRules(
805825
data: PricingTypes.RemovePriceListRulesDTO,
806826
@MedusaContext() sharedContext: Context = {}
@@ -852,6 +872,7 @@ export default class PricingModuleService
852872
): Promise<PricePreferenceDTO>
853873

854874
@InjectManager()
875+
@EmitEvents()
855876
async upsertPricePreferences(
856877
data: UpsertPricePreferenceDTO | UpsertPricePreferenceDTO[],
857878
@MedusaContext() sharedContext: Context = {}
@@ -1081,29 +1102,10 @@ export default class PricingModuleService
10811102
{ relations: ["price_rules"] },
10821103
sharedContext
10831104
)
1084-
eventBuilders.createdPrice({
1085-
data: performedActions.created[Price.name] ?? [],
1086-
sharedContext,
1087-
})
1088-
eventBuilders.updatedPrice({
1089-
data: performedActions.updated[Price.name] ?? [],
1090-
sharedContext,
1091-
})
1092-
eventBuilders.deletedPrice({
1093-
data: performedActions.deleted[Price.name] ?? [],
1094-
sharedContext,
1095-
})
10961105

1097-
eventBuilders.createdPriceRule({
1098-
data: performedActions.created[PriceRule.name] ?? [],
1099-
sharedContext,
1100-
})
1101-
eventBuilders.updatedPriceRule({
1102-
data: performedActions.updated[PriceRule.name] ?? [],
1103-
sharedContext,
1104-
})
1105-
eventBuilders.deletedPriceRule({
1106-
data: performedActions.deleted[PriceRule.name] ?? [],
1106+
composeAllEvents({
1107+
eventBuilders,
1108+
performedActions,
11071109
sharedContext,
11081110
})
11091111

@@ -1277,12 +1279,16 @@ export default class PricingModuleService
12771279
}
12781280
)
12791281

1280-
const { entities } = await this.priceListService_.upsertWithReplace(
1281-
normalizedData,
1282-
{
1282+
const { entities, performedActions } =
1283+
await this.priceListService_.upsertWithReplace(normalizedData, {
12831284
relations: ["price_list_rules"],
1284-
}
1285-
)
1285+
})
1286+
1287+
composeAllEvents({
1288+
eventBuilders,
1289+
performedActions,
1290+
sharedContext,
1291+
})
12861292

12871293
return entities
12881294
}
@@ -1326,11 +1332,18 @@ export default class PricingModuleService
13261332
}
13271333
}
13281334

1329-
const { entities } = await this.priceService_.upsertWithReplace(
1330-
pricesToUpsert,
1331-
{ relations: ["price_rules"] },
1332-
sharedContext
1333-
)
1335+
const { entities, performedActions } =
1336+
await this.priceService_.upsertWithReplace(
1337+
pricesToUpsert,
1338+
{ relations: ["price_rules"] },
1339+
sharedContext
1340+
)
1341+
1342+
composeAllEvents({
1343+
eventBuilders,
1344+
performedActions,
1345+
sharedContext,
1346+
})
13341347

13351348
return entities
13361349
}
@@ -1388,29 +1401,9 @@ export default class PricingModuleService
13881401
sharedContext
13891402
)
13901403

1391-
eventBuilders.createdPrice({
1392-
data: performedActions.created[Price.name] ?? [],
1393-
sharedContext,
1394-
})
1395-
eventBuilders.updatedPrice({
1396-
data: performedActions.updated[Price.name] ?? [],
1397-
sharedContext,
1398-
})
1399-
eventBuilders.deletedPrice({
1400-
data: performedActions.deleted[Price.name] ?? [],
1401-
sharedContext,
1402-
})
1403-
1404-
eventBuilders.createdPriceRule({
1405-
data: performedActions.created[PriceRule.name] ?? [],
1406-
sharedContext,
1407-
})
1408-
eventBuilders.updatedPriceRule({
1409-
data: performedActions.updated[PriceRule.name] ?? [],
1410-
sharedContext,
1411-
})
1412-
eventBuilders.deletedPriceRule({
1413-
data: performedActions.deleted[PriceRule.name] ?? [],
1404+
composeAllEvents({
1405+
eventBuilders,
1406+
performedActions,
14141407
sharedContext,
14151408
})
14161409

@@ -1472,11 +1465,18 @@ export default class PricingModuleService
14721465
})
14731466
.filter(Boolean)
14741467

1475-
const { entities } = await this.priceListService_.upsertWithReplace(
1476-
priceListsUpsert,
1477-
{ relations: ["price_list_rules"] },
1478-
sharedContext
1479-
)
1468+
const { entities, performedActions } =
1469+
await this.priceListService_.upsertWithReplace(
1470+
priceListsUpsert,
1471+
{ relations: ["price_list_rules"] },
1472+
sharedContext
1473+
)
1474+
1475+
composeAllEvents({
1476+
eventBuilders,
1477+
performedActions,
1478+
sharedContext,
1479+
})
14801480

14811481
return entities
14821482
}
@@ -1539,11 +1539,18 @@ export default class PricingModuleService
15391539
})
15401540
.filter(Boolean)
15411541

1542-
const { entities } = await this.priceListService_.upsertWithReplace(
1543-
priceListsUpsert,
1544-
{ relations: ["price_list_rules"] },
1545-
sharedContext
1546-
)
1542+
const { entities, performedActions } =
1543+
await this.priceListService_.upsertWithReplace(
1544+
priceListsUpsert,
1545+
{ relations: ["price_list_rules"] },
1546+
sharedContext
1547+
)
1548+
1549+
composeAllEvents({
1550+
eventBuilders,
1551+
performedActions,
1552+
sharedContext,
1553+
})
15471554

15481555
return entities
15491556
}
@@ -1582,6 +1589,26 @@ export default class PricingModuleService
15821589
}
15831590
}
15841591

1592+
const composeAllEvents = ({
1593+
eventBuilders,
1594+
performedActions,
1595+
sharedContext,
1596+
}) => {
1597+
for (const action of Object.keys(performedActions)) {
1598+
for (const entity of Object.keys(performedActions[action])) {
1599+
const eventName = action + upperCaseFirst(entity)
1600+
if (!eventBuilders[eventName]) {
1601+
continue
1602+
}
1603+
1604+
eventBuilders[eventName]({
1605+
data: performedActions[action][entity] ?? [],
1606+
sharedContext,
1607+
})
1608+
}
1609+
}
1610+
}
1611+
15851612
const isTaxInclusive = (
15861613
priceRules: InferEntityType<typeof PriceRule>[],
15871614
preferences: InferEntityType<typeof PricePreference>[],

0 commit comments

Comments
 (0)