Skip to content

Commit e8822f3

Browse files
adrien2polivermrbl
andauthored
chore(): Module Internal Events (medusajs#13296)
* chore(): Ensure the product module emits all necessary events * chore(): Ensure the product module emits all necessary events * Update events tests * more events and fixes * more tests and category fixes * more tests and category fixes * Add todo * update updateProduct_ event emitting and adjust test * Adjust update products implementation to rely on already computed events * rm unnecessary update variants events * Fix formatting in changeset for product events * refactor: Manage event emitting automatically (WIP) * refactor: Manage event emitting automatically (WIP) * chore(api-key): Add missing emit events and refactoring * chore(cart): Add missing emit events and refactoring * chore(customer): Add missing emit events and refactoring * chore(fufillment, utils): Add missing emit events and refactoring * chore(fufillment, utils): Add missing emit events and refactoring * chore(inventory): Add missing emit events and refactoring * chore(notification): Add missing emit events and refactoring * chore(utils): Remove medusa service event handling legacy * chore(product): Add missing emit events and refactoring * chore(order): Add missing emit events and refactoring * chore(payment): Add missing emit events and refactoring * chore(pricing, util): Add missing emit events and refactoring, fix internal service upsertWithReplace event dispatching * chore(promotions): Add missing emit events and refactoring * chore(region): Add missing emit events and refactoring * chore(sales-channel): Add missing emit events and refactoring * chore(settings): Add missing emit events and refactoring * chore(stock-location): Add missing emit events and refactoring * chore(store): Add missing emit events and refactoring * chore(taxes): Add missing emit events and refactoring * chore(user): Add missing emit events and refactoring * fix unit tests * rm changeset for regeneration * Create changeset for Medusa.js patch updates Add a changeset for patch updates to multiple Medusa.js modules. * rm unused product event builders * address feedback * remove old changeset * fix event action for token generated * fix user module events * fix import * fix promotion events * add new module integration tests shard * fix medusa service * revert shard * fix event action * fix pipeline * fix pipeline --------- Co-authored-by: Oli Juhl <[email protected]>
1 parent afe2174 commit e8822f3

File tree

55 files changed

+3618
-2357
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+3618
-2357
lines changed

.changeset/angry-bikes-perform.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
"@medusajs/api-key": patch
3+
"@medusajs/cart": patch
4+
"@medusajs/customer": patch
5+
"@medusajs/fulfillment": patch
6+
"@medusajs/inventory": patch
7+
"@medusajs/notification": patch
8+
"@medusajs/order": patch
9+
"@medusajs/payment": patch
10+
"@medusajs/pricing": patch
11+
"@medusajs/product": patch
12+
"@medusajs/utils": patch
13+
---
14+
15+
chore(): Module Internal Events

packages/core/utils/src/event-bus/message-aggregator.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ import {
99
import { composeMessage } from "./build-event-messages"
1010

1111
export class MessageAggregator implements IMessageAggregator {
12-
private messages: Message[] = []
12+
#messagesHash: Set<string> = new Set()
13+
#messages: Message[] = []
1314

1415
constructor() {}
1516

1617
count(): number {
17-
return this.messages.length
18+
return this.#messages.length
1819
}
1920

2021
save(msg: Message | Message[]): void {
@@ -23,7 +24,19 @@ export class MessageAggregator implements IMessageAggregator {
2324
return
2425
}
2526

26-
this.messages.push(...messages)
27+
for (const message of messages) {
28+
try {
29+
const hash = JSON.stringify(message)
30+
if (!this.#messagesHash.has(hash)) {
31+
this.#messagesHash.add(hash)
32+
this.#messages.push(message)
33+
}
34+
} catch (e) {
35+
// noop: if the message is not serializable, we don't want to deduplicate it
36+
// It should not happen, but we don't want to fail the whole process
37+
this.#messages.push(message)
38+
}
39+
}
2740
}
2841

2942
saveRawMessageData<T>(
@@ -55,15 +68,15 @@ export class MessageAggregator implements IMessageAggregator {
5568
const { groupBy, sortBy } = format ?? {}
5669

5770
if (sortBy) {
58-
this.messages.sort((a, b) => this.compareMessages(a, b, sortBy))
71+
this.#messages.sort((a, b) => this.compareMessages(a, b, sortBy))
5972
}
6073

6174
let messages: { [group: string]: Message[] } = {
62-
default: [...this.messages],
75+
default: [...this.#messages],
6376
}
6477

6578
if (groupBy) {
66-
messages = this.messages.reduce<{
79+
messages = this.#messages.reduce<{
6780
[key: string]: Message[]
6881
}>((acc, msg) => {
6982
const key = groupBy
@@ -91,7 +104,8 @@ export class MessageAggregator implements IMessageAggregator {
91104

92105
clearMessages(): void {
93106
// Ensure no references are left over in case something rely on messages
94-
this.messages.length = 0
107+
this.#messages.length = 0
108+
this.#messagesHash.clear()
95109
}
96110

97111
private getValueFromPath(obj: any, path: string): any {

packages/core/utils/src/modules-sdk/__tests__/medusa-internal-service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ describe("Internal Module Service Factory", () => {
2020
findAndCount: jest.fn(),
2121
create: jest.fn(),
2222
update: jest.fn(),
23-
delete: jest.fn(),
23+
delete: jest.fn().mockImplementation((ids) => Promise.resolve(ids)),
2424
softDelete: jest.fn(),
2525
restore: jest.fn(),
2626
upsert: jest.fn(),
@@ -32,7 +32,7 @@ describe("Internal Module Service Factory", () => {
3232
findAndCount: jest.fn(),
3333
create: jest.fn(),
3434
update: jest.fn(),
35-
delete: jest.fn(),
35+
delete: jest.fn().mockImplementation((ids) => Promise.resolve(ids)),
3636
softDelete: jest.fn(),
3737
restore: jest.fn(),
3838
upsert: jest.fn(),
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { Context } from "@medusajs/types"
2+
import { EventArgs, EventSubscriber } from "@mikro-orm/core"
3+
type Service = {
4+
interceptEntityMutationEvents: (
5+
event: "afterCreate" | "afterUpdate" | "afterUpsert" | "afterDelete",
6+
args: EventArgs<any>,
7+
context: Context
8+
) => void
9+
}
10+
11+
export type MedusaMikroOrmEventSubscriber = {
12+
new (context: Context): EventSubscriber
13+
}
14+
15+
/**
16+
* Build a new mikro orm event subscriber for the given models
17+
* @param models
18+
* @returns
19+
*/
20+
export function createMedusaMikroOrmEventSubscriber(
21+
keys: string[],
22+
service: Service
23+
): MedusaMikroOrmEventSubscriber {
24+
const klass = class MikroOrmEventSubscriber implements EventSubscriber {
25+
#context: Context
26+
#service: Service = service
27+
28+
constructor(context: Context) {
29+
this.#context = context
30+
}
31+
32+
async afterCreate<T>(args: EventArgs<T>): Promise<void> {
33+
this.#service.interceptEntityMutationEvents(
34+
"afterCreate",
35+
args,
36+
this.#context
37+
)
38+
}
39+
40+
async afterUpdate<T>(args: EventArgs<T>): Promise<void> {
41+
this.#service.interceptEntityMutationEvents(
42+
"afterUpdate",
43+
args,
44+
this.#context
45+
)
46+
}
47+
48+
async afterUpsert<T>(args: EventArgs<T>): Promise<void> {
49+
this.#service.interceptEntityMutationEvents(
50+
"afterUpsert",
51+
args,
52+
this.#context
53+
)
54+
}
55+
56+
async afterDelete<T>(args: EventArgs<T>): Promise<void> {
57+
this.#service.interceptEntityMutationEvents(
58+
"afterDelete",
59+
args,
60+
this.#context
61+
)
62+
}
63+
}
64+
65+
Object.defineProperty(klass, "name", {
66+
value: keys.join(","),
67+
writable: false,
68+
})
69+
70+
return klass
71+
}

packages/core/utils/src/modules-sdk/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,4 @@ export * from "./types/links-config"
2121
export * from "./types/medusa-service"
2222
export * from "./module-provider-registration-key"
2323
export * from "./modules-to-container-types"
24+
export * from "./create-medusa-mikro-orm-event-subscriber"

0 commit comments

Comments
 (0)