@@ -463,6 +463,68 @@ _.assignIn(util, {
463463 } ) ;
464464 } ,
465465
466+ /**
467+ * Lookup user handles from multiple emails
468+ * @param {Object } req request
469+ * @param {Array } userEmails user emails
470+ * @param {Number } maximumRequests limit number of request on one batch
471+ * @param {Boolean } isPattern flag to indicate that pattern matching is required or not
472+ * @return {Promise } promise
473+ */
474+ lookupMultipleUserEmails ( req , userEmails , maximumRequests , isPattern = false ) {
475+ req . log . debug ( `identityServiceEndpoint: ${ config . get ( 'identityServiceEndpoint' ) } ` ) ;
476+
477+ const httpClient = util . getHttpClient ( { id : req . id , log : req . log } ) ;
478+ // request generator function
479+ const generateRequest = ( { token, email } ) => {
480+ let filter = `email=${ email } ` ;
481+ if ( isPattern ) {
482+ filter += '&like=true' ;
483+ }
484+ return httpClient . get ( `${ config . get ( 'identityServiceEndpoint' ) } users` , {
485+ headers : {
486+ Authorization : `Bearer ${ token } ` ,
487+ Accept : 'application/json' ,
488+ 'Content-Type' : 'application/json' ,
489+ } ,
490+ params : {
491+ fields : 'handle,id,email' ,
492+ filter,
493+ } ,
494+ // set longer timeout as default 3000 could be not enough for identity service response
495+ timeout : 15000 ,
496+ } ) ;
497+ } ;
498+ // send batch of requests, one batch at one time
499+ const sendBatch = ( options ) => {
500+ const token = options . token ;
501+ const emails = options . emails ;
502+ const users = options . users || [ ] ;
503+ const batch = options . batch || 0 ;
504+ const start = batch * maximumRequests ;
505+ const end = ( batch + 1 ) * maximumRequests ;
506+ const requests = emails . slice ( start , end ) . map ( userEmail =>
507+ generateRequest ( { token, email : userEmail } ) ) ;
508+ return Promise . all ( requests )
509+ . then ( ( responses ) => {
510+ const data = responses . reduce ( ( contents , response ) => {
511+ const content = _ . get ( response , 'data.result.content' , [ ] ) ;
512+ return _ . concat ( contents , content ) ;
513+ } , users ) ;
514+ req . log . debug ( `UserHandle response batch-${ batch } ` , data ) ;
515+ if ( end < emails . length ) {
516+ return sendBatch ( { token, users : data , emails, batch : batch + 1 } ) ;
517+ }
518+ return data ;
519+ } ) ;
520+ } ;
521+ return util . getM2MToken ( )
522+ . then ( ( m2mToken ) => {
523+ req . log . debug ( `Bearer ${ m2mToken } ` ) ;
524+ return sendBatch ( { token : m2mToken , emails : userEmails } ) ;
525+ } ) ;
526+ } ,
527+
466528 /**
467529 * Filter only members of topcoder team
468530 * @param {Array } members project members
0 commit comments