@@ -9,12 +9,17 @@ const esClient = require('./es-client').getESClient()
9
9
const DOCUMENTS = config . ES . DOCUMENTS
10
10
const RESOURCES = Object . keys ( DOCUMENTS )
11
11
12
- const SUB_DOCUMENTS = { }
13
- const SUB_PROPERTIES = [ ]
12
+ const SUB_USER_DOCUMENTS = { }
13
+ const SUB_ORG_DOCUMENTS = { }
14
+ const SUB_USER_PROPERTIES = [ ]
15
+ const SUB_ORG_PROPERTIES = [ ]
14
16
_ . forOwn ( DOCUMENTS , ( value , key ) => {
15
17
if ( value . userField ) {
16
- SUB_DOCUMENTS [ key ] = value
17
- SUB_PROPERTIES . push ( value . userField )
18
+ SUB_USER_DOCUMENTS [ key ] = value
19
+ SUB_USER_PROPERTIES . push ( value . userField )
20
+ } else if ( value . orgField ) {
21
+ SUB_ORG_DOCUMENTS [ key ] = value
22
+ SUB_ORG_PROPERTIES . push ( value . orgField )
18
23
}
19
24
} )
20
25
@@ -241,7 +246,7 @@ const FILTER_CHAIN = {
241
246
} ,
242
247
// sub resource
243
248
userskill : {
244
- queryFielid : 'skillId' ,
249
+ queryField : 'skillId' ,
245
250
enrichNext : 'skill' ,
246
251
idField : 'skillId'
247
252
} ,
@@ -261,6 +266,11 @@ const FILTER_CHAIN = {
261
266
userattribute : {
262
267
enrichNext : 'attribute' ,
263
268
idField : 'attributeId'
269
+ } ,
270
+ organizationskillprovider : {
271
+ queryField : 'skillProviderId' ,
272
+ enrichNext : 'skillprovider' ,
273
+ idField : 'skillProviderId'
264
274
}
265
275
}
266
276
@@ -269,13 +279,15 @@ function getTotalCount (total) {
269
279
}
270
280
271
281
function escapeRegex ( str ) {
282
+ /* eslint-disable no-useless-escape */
272
283
return str
273
284
. replace ( / [ \* \+ \- = ~ > < \" \? ^ \$ { } \( \) \: \! \/ [ \] \\ \s ] / g, '\\$&' ) // replace single character special characters
274
285
. replace ( / \| \| / g, '\\||' ) // replace ||
275
286
. replace ( / \& \& / g, '\\&&' ) // replace &&
276
287
. replace ( / A N D / g, '\\A\\N\\D' ) // replace AND
277
288
. replace ( / O R / g, '\\O\\R' ) // replace OR
278
289
. replace ( / N O T / g, '\\N\\O\\T' ) // replace NOT
290
+ /* eslint-enable no-useless-escape */
279
291
}
280
292
281
293
async function getOrganizationId ( handle ) {
@@ -398,8 +410,8 @@ async function enrichResource (resource, enrichIdProp, item) {
398
410
* @returns {Promise<*> } the promise of enriched user
399
411
*/
400
412
async function enrichUser ( user ) {
401
- for ( const subProp of Object . keys ( SUB_DOCUMENTS ) ) {
402
- const subDoc = SUB_DOCUMENTS [ subProp ]
413
+ for ( const subProp of Object . keys ( SUB_USER_DOCUMENTS ) ) {
414
+ const subDoc = SUB_USER_DOCUMENTS [ subProp ]
403
415
const subData = user [ subDoc . userField ]
404
416
const filterChain = FILTER_CHAIN [ subProp ]
405
417
if ( subData && subData . length > 0 ) {
@@ -440,23 +452,43 @@ async function getFromElasticSearch (resource, ...args) {
440
452
441
453
const doc = DOCUMENTS [ resource ]
442
454
const userDoc = DOCUMENTS . user
443
- const subDoc = SUB_DOCUMENTS [ resource ]
455
+ const orgDoc = DOCUMENTS . organization
456
+ const subUserDoc = SUB_USER_DOCUMENTS [ resource ]
457
+ const subOrgDoc = SUB_ORG_DOCUMENTS [ resource ]
444
458
const filterChain = FILTER_CHAIN [ resource ]
445
459
460
+ let esQuery
461
+
446
462
// construct ES query
447
- const esQuery = {
448
- index : doc . userField ? userDoc . index : doc . index ,
449
- type : doc . userField ? userDoc . type : doc . type ,
450
- id : doc . userField ? params . userId : id
463
+ if ( doc . userField ) {
464
+ esQuery = {
465
+ index : userDoc . index ,
466
+ type : userDoc . type ,
467
+ id : params . userId
468
+ }
469
+ } else if ( doc . orgField ) {
470
+ esQuery = {
471
+ index : orgDoc . index ,
472
+ type : orgDoc . type ,
473
+ id : params . organizationId
474
+ }
475
+ } else {
476
+ esQuery = {
477
+ index : doc . index ,
478
+ type : doc . type ,
479
+ id : id
480
+ }
451
481
}
452
482
453
483
if ( resource === 'user' ) {
454
484
// handle enrich
455
485
if ( ! params . enrich ) {
456
- esQuery . _source_excludes = SUB_PROPERTIES . join ( ',' )
486
+ esQuery . _source_excludes = SUB_USER_PROPERTIES . join ( ',' )
457
487
}
458
- } else if ( subDoc ) {
459
- esQuery . _source_includes = subDoc . userField
488
+ } else if ( subUserDoc ) {
489
+ esQuery . _source_includes = subUserDoc . userField
490
+ } else if ( subOrgDoc ) {
491
+ esQuery . _source_includes = subOrgDoc . orgField
460
492
}
461
493
462
494
logger . debug ( `ES query for get ${ resource } : ${ JSON . stringify ( esQuery , null , 2 ) } ` )
@@ -469,14 +501,22 @@ async function getFromElasticSearch (resource, ...args) {
469
501
const groups = await groupApi . getGroups ( user . id )
470
502
user . groups = groups
471
503
return user
472
- } else if ( subDoc ) {
504
+ } else if ( subUserDoc ) {
473
505
// find top sub doc by sub.id
474
- const found = result [ subDoc . userField ] . find ( sub => sub [ filterChain . idField ] === params [ filterChain . idField ] )
506
+ const found = result [ subUserDoc . userField ] . find ( sub => sub [ filterChain . idField ] === params [ filterChain . idField ] )
475
507
if ( found ) {
476
508
return found
477
509
} else {
478
510
throw new Error ( `${ resource } of userId ${ params . userId } , ${ params [ filterChain . idField ] } is not found from ES` )
479
511
}
512
+ } else if ( subOrgDoc ) {
513
+ // find top sub doc by sub.id
514
+ const found = result [ subOrgDoc . orgField ] . find ( sub => sub [ filterChain . idField ] === params [ filterChain . idField ] )
515
+ if ( found ) {
516
+ return found
517
+ } else {
518
+ throw new Error ( `${ resource } of organizationId ${ params . organizationId } , ${ params [ filterChain . idField ] } is not found from ES` )
519
+ }
480
520
}
481
521
return result
482
522
}
@@ -527,7 +567,14 @@ function setResourceFilterToEsQuery (resFilters, esQuery) {
527
567
if ( resFilters . length > 0 ) {
528
568
for ( const filter of resFilters ) {
529
569
const doc = DOCUMENTS [ filter . resource ]
530
- let matchField = doc . userField ? `${ doc . userField } .${ filter . queryField } ` : `${ filter . queryField } `
570
+ let matchField
571
+ if ( doc . userField ) {
572
+ matchField = `${ doc . userField } .${ filter . queryField } `
573
+ } else if ( doc . orgField ) {
574
+ matchField = `${ doc . orgField } .${ filter . queryField } `
575
+ } else {
576
+ matchField = `${ filter . queryField } `
577
+ }
531
578
if ( filter . queryField !== 'name' && filter . queryField !== 'isInactive' ) {
532
579
matchField = matchField + '.keyword'
533
580
}
@@ -917,11 +964,20 @@ async function resolveResFilter (filter, initialRes) {
917
964
918
965
// return the value if this is end of the filter
919
966
if ( filter . resource === initialRes || ! filterChain . filterNext ) {
920
- return {
921
- resource : filter . resource ,
922
- userField : doc . userField ,
923
- queryField : filter . queryField ,
924
- value : filter . value
967
+ if ( doc . orgField ) {
968
+ return {
969
+ resource : filter . resource ,
970
+ orgField : doc . orgField ,
971
+ queryField : filter . queryField ,
972
+ value : filter . value
973
+ }
974
+ } else {
975
+ return {
976
+ resource : filter . resource ,
977
+ userField : doc . userField ,
978
+ queryField : filter . queryField ,
979
+ value : filter . value
980
+ }
925
981
}
926
982
}
927
983
@@ -998,7 +1054,9 @@ async function searchElasticSearch (resource, ...args) {
998
1054
const authUser = args [ 1 ]
999
1055
const doc = DOCUMENTS [ resource ]
1000
1056
const userDoc = DOCUMENTS . user
1001
- const topSubDoc = SUB_DOCUMENTS [ resource ]
1057
+ const orgDoc = DOCUMENTS . organization
1058
+ const topUserSubDoc = SUB_USER_DOCUMENTS [ resource ]
1059
+ const topOrgSubDoc = SUB_ORG_DOCUMENTS [ resource ]
1002
1060
if ( ! params . page ) {
1003
1061
params . page = 1
1004
1062
}
@@ -1051,8 +1109,8 @@ async function searchElasticSearch (resource, ...args) {
1051
1109
1052
1110
// construct ES query
1053
1111
const esQuery = {
1054
- index : doc . userField ? userDoc . index : doc . index ,
1055
- type : doc . userField ? userDoc . type : doc . type ,
1112
+ index : doc . userField ? userDoc . index : ( doc . orgField ? orgDoc . index : doc . index ) ,
1113
+ type : doc . userField ? userDoc . type : ( doc . orgField ? orgDoc . type : doc . type ) ,
1056
1114
size : params . perPage ,
1057
1115
from : ( params . page - 1 ) * params . perPage , // Es Index starts from 0
1058
1116
body : {
@@ -1104,9 +1162,9 @@ async function searchElasticSearch (resource, ...args) {
1104
1162
} )
1105
1163
} else {
1106
1164
// do not return sub-resources
1107
- esQuery . _source_excludes = SUB_PROPERTIES . join ( ',' )
1165
+ esQuery . _source_excludes = SUB_USER_PROPERTIES . join ( ',' )
1108
1166
}
1109
- } else if ( topSubDoc ) {
1167
+ } else if ( topUserSubDoc ) {
1110
1168
// add userId match
1111
1169
const userFC = FILTER_CHAIN . user
1112
1170
const userIdMatchField = `${ userFC . idField } .keyword`
@@ -1115,13 +1173,30 @@ async function searchElasticSearch (resource, ...args) {
1115
1173
[ userIdMatchField ] : params . userId
1116
1174
}
1117
1175
} )
1118
- esQuery . _source_includes = topSubDoc . userField
1176
+ esQuery . _source_includes = topUserSubDoc . userField
1177
+ } else if ( topOrgSubDoc ) {
1178
+ // add organizationId match
1179
+ const orgFC = FILTER_CHAIN . organization
1180
+ const orgIdMatchField = `${ orgFC . idField } .keyword`
1181
+ esQuery . body . query . bool . must . push ( {
1182
+ match : {
1183
+ [ orgIdMatchField ] : params . organizationId
1184
+ }
1185
+ } )
1186
+ esQuery . _source_includes = topOrgSubDoc . orgField
1119
1187
}
1120
1188
1121
1189
// set pre res filter results
1122
1190
if ( ! params . enrich && preResFilterResults . length > 0 ) {
1123
1191
for ( const filter of preResFilterResults ) {
1124
- const matchField = filter . userField ? `${ filter . userField } .${ filter . queryField } ` : `${ filter . queryField } `
1192
+ let matchField
1193
+ if ( filter . userField ) {
1194
+ matchField = `${ filter . userField } .${ filter . queryField } `
1195
+ } else if ( filter . orgField ) {
1196
+ matchField = `${ filter . orgField } .${ filter . queryField } `
1197
+ } else {
1198
+ matchField = `${ filter . queryField } `
1199
+ }
1125
1200
setFilterValueToEsQuery ( esQuery , matchField , filter . value , filter . queryField )
1126
1201
}
1127
1202
}
@@ -1152,11 +1227,16 @@ async function searchElasticSearch (resource, ...args) {
1152
1227
const groups = await groupApi . getGroups ( user . id )
1153
1228
user . groups = groups
1154
1229
}
1155
- } else if ( topSubDoc ) {
1156
- result = docs . hits . hits [ 0 ] . _source [ topSubDoc . userField ]
1230
+ } else if ( topUserSubDoc ) {
1231
+ result = docs . hits . hits [ 0 ] . _source [ topUserSubDoc . userField ]
1157
1232
// for sub-resource query, it returns all sub-resource items in one user,
1158
1233
// so needs filtering and also page size
1159
1234
result = applySubResFilters ( result , preResFilterResults , ownResFilters , params . perPage )
1235
+ } else if ( topOrgSubDoc ) {
1236
+ result = docs . hits . hits [ 0 ] . _source [ topOrgSubDoc . orgField ]
1237
+ // for sub-resource query, it returns all sub-resource items in one organization,
1238
+ // so needs filtering and also page size
1239
+ result = applySubResFilters ( result , preResFilterResults , ownResFilters , params . perPage )
1160
1240
} else {
1161
1241
result = docs . hits . hits . map ( hit => hit . _source )
1162
1242
}
0 commit comments