diff --git a/lib/core/userinfo/services/identity-user.service.spec.ts b/lib/core/userinfo/services/identity-user.service.spec.ts index a22ed5ff88..a9a6b88937 100644 --- a/lib/core/userinfo/services/identity-user.service.spec.ts +++ b/lib/core/userinfo/services/identity-user.service.spec.ts @@ -247,4 +247,26 @@ describe('IdentityUserService', () => { } ); }); + + it('should return true if user has given role', (done) => { + spyOn(service, 'getUserRoles').and.returnValue(of(mockRoles)); + service.checkUserHasRole('mock-user-id', ['MOCK-ROLE-1']).subscribe( + (res: boolean) => { + expect(res).toBeDefined(); + expect(res).toBeTruthy(); + done(); + } + ); + }); + + it('should return false if user does not have given role', (done) => { + spyOn(service, 'getUserRoles').and.returnValue(of(mockRoles)); + service.checkUserHasRole('mock-user-id', ['MOCK-ROLE-10']).subscribe( + (res: boolean) => { + expect(res).toBeDefined(); + expect(res).toBeFalsy(); + done(); + } + ); + }); }); diff --git a/lib/core/userinfo/services/identity-user.service.ts b/lib/core/userinfo/services/identity-user.service.ts index fa59c560f0..214ccf3ade 100644 --- a/lib/core/userinfo/services/identity-user.service.ts +++ b/lib/core/userinfo/services/identity-user.service.ts @@ -231,12 +231,12 @@ export class IdentityUserService { getUserRoles(userId: string): Observable { const url = this.buildRolesUrl(userId); const httpMethod = 'GET', pathParams = {}, queryParams = {}, bodyParam = {}, headerParams = {}, - formParams = {}, authNames = [], contentTypes = ['application/json'], accepts = ['application/json']; + formParams = {}, contentTypes = ['application/json'], accepts = ['application/json']; return from(this.apiService.getInstance().oauth2Auth.callCustomApi( url, httpMethod, pathParams, queryParams, - headerParams, formParams, bodyParam, authNames, - contentTypes, accepts, null, null) + headerParams, formParams, bodyParam, + contentTypes, accepts, Object, null, null) ).pipe( map((response: IdentityRoleModel[]) => { return response; @@ -302,6 +302,24 @@ export class IdentityUserService { return hasAnyRole; } + checkUserHasRole(userId: string, roleNames: string[]): Observable { + return this.getUserRoles(userId).pipe(map((userRoles: IdentityRoleModel[]) => { + let hasRole = false; + if (userRoles && userRoles.length > 0) { + roleNames.forEach((roleName: string) => { + const role = userRoles.find((userRole) => { + return roleName === userRole.name; + }); + if (role) { + hasRole = true; + return; + } + }); + } + return hasRole; + })); + } + private buildUserUrl(): any { return `${this.appConfigService.get('identityHost')}/users`; } diff --git a/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.spec.ts index 50baa578c6..c9d1d73732 100644 --- a/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.spec.ts @@ -248,4 +248,50 @@ describe('PeopleCloudComponent', () => { }); })); + it('should return true if user has any specified role', async(() => { + const checkUserHasRoleSpy = spyOn(identityService, 'checkUserHasRole').and.returnValue(of(true)); + component.roles = ['mock-role-1']; + fixture.detectChanges(); + let inputHTMLElement: HTMLInputElement = element.querySelector('input'); + inputHTMLElement.focus(); + inputHTMLElement.value = 'M'; + inputHTMLElement.dispatchEvent(new Event('input')); + fixture.detectChanges(); + fixture.whenStable().then(() => { + fixture.detectChanges(); + expect(checkUserHasRoleSpy).toHaveBeenCalled(); + }); + })); + + it('should return false if user does not have any specified role', async(() => { + const checkUserHasRoleSpy = spyOn(identityService, 'checkUserHasRole').and.returnValue(of(false)); + component.appName = ''; + component.roles = ['mock-role-10']; + fixture.detectChanges(); + let inputHTMLElement: HTMLInputElement = element.querySelector('input'); + inputHTMLElement.focus(); + inputHTMLElement.value = 'M'; + inputHTMLElement.dispatchEvent(new Event('input')); + fixture.detectChanges(); + fixture.whenStable().then(() => { + fixture.detectChanges(); + expect(checkUserHasRoleSpy).toHaveBeenCalled(); + }); + })); + + it('should not fire checkUserHasRole when roles are not specified', async(() => { + const checkUserHasRoleSpy = spyOn(identityService, 'checkUserHasRole').and.returnValue(of(false)); + component.appName = ''; + component.roles = []; + fixture.detectChanges(); + let inputHTMLElement: HTMLInputElement = element.querySelector('input'); + inputHTMLElement.focus(); + inputHTMLElement.value = 'M'; + inputHTMLElement.dispatchEvent(new Event('input')); + fixture.detectChanges(); + fixture.whenStable().then(() => { + fixture.detectChanges(); + expect(checkUserHasRoleSpy).not.toHaveBeenCalled(); + }); + })); }); diff --git a/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.ts b/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.ts index 6da51ccb2c..89b68c4e9b 100644 --- a/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.ts @@ -148,6 +148,8 @@ export class PeopleCloudComponent implements OnInit { return hasRole ? of(user) : of(); }) ); + } else if (this.hasRoles()) { + return this.filterUsersByRoles(user); } else { return of(user); } @@ -170,6 +172,14 @@ export class PeopleCloudComponent implements OnInit { return this.roles && this.roles.length > 0; } + filterUsersByRoles(user: IdentityUserModel): Observable { + return this.identityUserService.checkUserHasRole(user.id, this.roles).pipe( + mergeMap((hasRole) => { + return hasRole ? of(user) : of(); + }) + ); + } + private isUserAlreadySelected(user: IdentityUserModel): boolean { if (this.preSelectUsers && this.preSelectUsers.length > 0) { const result = this.preSelectUsers.find((selectedUser) => {