Forráskód Böngészése

fix(auth): strip user from transition role after migration

Karol Sójko 1 éve
szülő
commit
afe9967d26

+ 34 - 0
packages/auth/src/Domain/Role/RoleService.spec.ts

@@ -118,6 +118,40 @@ describe('RoleService', () => {
     })
   })
 
+  describe('removing roles', () => {
+    beforeEach(() => {
+      user = {
+        uuid: '123',
+        email: 'test@test.com',
+        roles: Promise.resolve([basicRole]),
+      } as jest.Mocked<User>
+
+      userRepository.findOneByUuid = jest.fn().mockReturnValue(user)
+      userRepository.save = jest.fn().mockReturnValue(user)
+    })
+
+    it('should remove a role from a user', async () => {
+      await createService().removeRoleFromUser(
+        Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
+        RoleName.create(RoleName.NAMES.CoreUser).getValue(),
+      )
+
+      user.roles = Promise.resolve([])
+      expect(userRepository.save).toHaveBeenCalledWith(user)
+    })
+
+    it('should not remove a role from a user if the user could not be found', async () => {
+      userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
+
+      await createService().removeRoleFromUser(
+        Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
+        RoleName.create(RoleName.NAMES.CoreUser).getValue(),
+      )
+
+      expect(userRepository.save).not.toHaveBeenCalled()
+    })
+  })
+
   describe('adding roles based on subscription', () => {
     beforeEach(() => {
       user = {

+ 17 - 0
packages/auth/src/Domain/Role/RoleService.ts

@@ -65,6 +65,17 @@ export class RoleService implements RoleServiceInterface {
     await this.addToExistingRoles(user, roleName.value)
   }
 
+  async removeRoleFromUser(userUuid: Uuid, roleName: RoleName): Promise<void> {
+    const user = await this.userRepository.findOneByUuid(userUuid)
+    if (user === null) {
+      this.logger.error(`Could not find user with uuid ${userUuid.value} to remove role ${roleName.value}`)
+
+      return
+    }
+
+    await this.removeUserRole(user, roleName.value)
+  }
+
   async addUserRoleBasedOnSubscription(user: User, subscriptionName: SubscriptionName): Promise<void> {
     const roleName = this.roleToSubscriptionMap.getRoleNameForSubscriptionName(subscriptionName)
 
@@ -108,9 +119,15 @@ export class RoleService implements RoleServiceInterface {
       return
     }
 
+    await this.removeUserRole(user, roleName)
+  }
+
+  private async removeUserRole(user: User, roleName: string): Promise<void> {
     const currentRoles = await user.roles
     user.roles = Promise.resolve(currentRoles.filter((role) => role.name !== roleName))
+
     await this.userRepository.save(user)
+
     await this.webSocketsClientService.sendUserRolesChangedEvent(user)
   }
 

+ 1 - 0
packages/auth/src/Domain/Role/RoleServiceInterface.ts

@@ -5,6 +5,7 @@ import { User } from '../User/User'
 
 export interface RoleServiceInterface {
   addRoleToUser(userUuid: Uuid, roleName: RoleName): Promise<void>
+  removeRoleFromUser(userUuid: Uuid, roleName: RoleName): Promise<void>
   addUserRoleBasedOnSubscription(user: User, subscriptionName: string): Promise<void>
   setOfflineUserRole(offlineUserSubscription: OfflineUserSubscription): Promise<void>
   removeUserRoleBasedOnSubscription(user: User, subscriptionName: string): Promise<void>

+ 2 - 2
packages/auth/src/Domain/UseCase/UpdateTransitionStatus/UpdateTransitionStatus.spec.ts

@@ -21,7 +21,7 @@ describe('UpdateTransitionStatus', () => {
     transitionStatusRepository.getStatus = jest.fn().mockResolvedValue(null)
 
     roleService = {} as jest.Mocked<RoleServiceInterface>
-    roleService.addRoleToUser = jest.fn()
+    roleService.removeRoleFromUser = jest.fn()
   })
 
   it('should add TRANSITION_USER role', async () => {
@@ -35,7 +35,7 @@ describe('UpdateTransitionStatus', () => {
     })
 
     expect(result.isFailed()).toBeFalsy()
-    expect(roleService.addRoleToUser).toHaveBeenCalledWith(
+    expect(roleService.removeRoleFromUser).toHaveBeenCalledWith(
       Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
       RoleName.create(RoleName.NAMES.TransitionUser).getValue(),
     )

+ 1 - 1
packages/auth/src/Domain/UseCase/UpdateTransitionStatus/UpdateTransitionStatus.ts

@@ -32,7 +32,7 @@ export class UpdateTransitionStatus implements UseCaseInterface<void> {
     await this.transitionStatusRepository.updateStatus(dto.userUuid, dto.transitionType, transitionStatus)
 
     if (dto.transitionType === 'items' && transitionStatus.value === TransitionStatus.STATUSES.Verified) {
-      await this.roleService.addRoleToUser(userUuid, RoleName.create(RoleName.NAMES.TransitionUser).getValue())
+      await this.roleService.removeRoleFromUser(userUuid, RoleName.create(RoleName.NAMES.TransitionUser).getValue())
     }
 
     return Result.ok()