@@ -552,8 +552,7 @@ const retrieveProjects = (req, criteria, sort, ffields) => {
552
552
// parse the fields string to determine what fields are to be returned
553
553
fields = util . parseFields ( fields , {
554
554
projects : PROJECT_ATTRIBUTES ,
555
- project_members : util . hasPermissionByReq ( PERMISSION . READ_PROJECT_MEMBER , req ) ?
556
- util . addUserDetailsFieldsIfAllowed ( PROJECT_MEMBER_ATTRIBUTES_ES , req ) : null ,
555
+ project_members : util . addUserDetailsFieldsIfAllowed ( PROJECT_MEMBER_ATTRIBUTES_ES , req ) ,
557
556
project_member_invites : PROJECT_MEMBER_INVITE_ATTRIBUTES ,
558
557
project_phases : PROJECT_PHASE_ATTRIBUTES ,
559
558
project_phases_products : PROJECT_PHASE_PRODUCTS_ATTRIBUTES ,
@@ -564,12 +563,36 @@ const retrieveProjects = (req, criteria, sort, ffields) => {
564
563
if ( _ . indexOf ( fields . projects , 'id' ) < 0 ) {
565
564
fields . projects . push ( 'id' ) ;
566
565
}
566
+ // add userId to project_members field so it can be used to check READ_PROJECT_MEMBER permission below.
567
+ const addMembersUserId = fields . project_members . length > 0 && _ . indexOf ( fields . project_members , 'userId' ) < 0 ;
568
+ if ( addMembersUserId ) {
569
+ fields . project_members . push ( 'userId' ) ;
570
+ }
567
571
568
572
const searchCriteria = parseElasticSearchCriteria ( criteria , fields , order ) || { } ;
569
573
return new Promise ( ( accept , reject ) => {
570
574
const es = util . getElasticSearchClient ( ) ;
571
575
es . search ( searchCriteria ) . then ( ( docs ) => {
572
576
const rows = _ . map ( docs . hits . hits , single => single . _source ) ; // eslint-disable-line no-underscore-dangle
577
+ if ( rows ) {
578
+ _ . forEach ( rows , ( p ) => {
579
+ const fp = p ;
580
+ if ( fp . members ) {
581
+ // check if have permission to read project members
582
+ if ( ! util . hasPermission ( PERMISSION . READ_PROJECT_MEMBER , req . authUser , fp . members ) ) {
583
+ delete fp . members ;
584
+ }
585
+ if ( fp . members && addMembersUserId ) {
586
+ // remove the userId from the returned members array if it was added before
587
+ // as it is only needed for checking permission.
588
+ _ . forEach ( fp . members , ( m ) => {
589
+ const fm = m ;
590
+ delete fm . userId ;
591
+ } ) ;
592
+ }
593
+ }
594
+ } ) ;
595
+ }
573
596
accept ( { rows, count : docs . hits . total , pageSize : criteria . limit , page : criteria . page } ) ;
574
597
} ) . catch ( reject ) ;
575
598
} ) ;
0 commit comments