diff --git a/packages/medusa/src/services/__tests__/user.js b/packages/medusa/src/services/__tests__/user.js index 4c83ba76f7..f95f04dcac 100644 --- a/packages/medusa/src/services/__tests__/user.js +++ b/packages/medusa/src/services/__tests__/user.js @@ -35,11 +35,15 @@ describe("UserService", () => { }) describe("create", () => { - const userRepository = MockRepository({}) + const userRepository = MockRepository({ + create: (any) => Promise.resolve({ id: IdMap.getId("ironman") }), + save: (any) => Promise.resolve({ id: IdMap.getId("ironman") }), + }) const userService = new UserService({ manager: MockManager, userRepository, + eventBusService, }) beforeEach(async () => { @@ -62,6 +66,13 @@ describe("UserService", () => { name: "Oliver", password_hash: expect.stringMatching(/.{128}$/), }) + + expect(eventBusService.emit).toHaveBeenCalledWith( + UserService.Events.CREATED, + { + id: expect.any(String), + } + ) }) }) @@ -72,6 +83,7 @@ describe("UserService", () => { const userService = new UserService({ manager: MockManager, userRepository, + eventBusService, }) beforeEach(async () => { @@ -90,6 +102,13 @@ describe("UserService", () => { first_name: "Tony", last_name: "Stark", }) + + expect(eventBusService.emit).toHaveBeenCalledWith( + UserService.Events.UPDATED, + { + id: IdMap.getId("ironman"), + } + ) }) it("successfully updates user metadata", async () => { @@ -106,6 +125,13 @@ describe("UserService", () => { company: "Stark Industries", }, }) + + expect(eventBusService.emit).toHaveBeenCalledWith( + UserService.Events.UPDATED, + { + id: IdMap.getId("ironman"), + } + ) }) it("fails on email update", async () => { diff --git a/packages/medusa/src/services/user.ts b/packages/medusa/src/services/user.ts index c306e5f7d3..d11d81a1ef 100644 --- a/packages/medusa/src/services/user.ts +++ b/packages/medusa/src/services/user.ts @@ -27,6 +27,9 @@ type UserServiceProps = { class UserService extends TransactionBaseService { static Events = { PASSWORD_RESET: "user.password_reset", + CREATED: "user.created", + UPDATED: "user.updated", + DELETED: "user.deleted", } protected manager_: EntityManager @@ -48,7 +51,9 @@ class UserService extends TransactionBaseService { * @return {string} the validated email */ validateEmail_(email: string): string { - const schema = Validator.string().email().required() + const schema = Validator.string() + .email() + .required() const { value, error } = schema.validate(email) if (error) { throw new MedusaError( @@ -198,7 +203,13 @@ class UserService extends TransactionBaseService { const created = userRepo.create(createData) - return await userRepo.save(created) + const newUser = await userRepo.save(created) + + await this.eventBus_ + .withTransaction(manager) + .emit(UserService.Events.CREATED, { id: newUser.id }) + + return newUser }) } @@ -238,7 +249,13 @@ class UserService extends TransactionBaseService { user[key as keyof User] = value } - return await userRepo.save(user) + const updatedUser = await userRepo.save(user) + + await this.eventBus_ + .withTransaction(manager) + .emit(UserService.Events.UPDATED, { id: updatedUser.id }) + + return updatedUser }) } @@ -261,6 +278,8 @@ class UserService extends TransactionBaseService { await userRepo.softRemove(user) + await this.eventBus_.emit(UserService.Events.DELETED, { id: user.id }) + return Promise.resolve() }) }