Skip to content

Commit 09e597a

Browse files
author
James Cori
committed
Merge branch 'develop' into feature/search-improvement
2 parents 7f2c49e + 4247d15 commit 09e597a

File tree

5 files changed

+215
-6
lines changed

5 files changed

+215
-6
lines changed

config/default.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ module.exports = {
4040
API_VERSION: process.env.ES_API_VERSION || '6.8',
4141
ES_INDEX: process.env.ES_INDEX || 'challenge',
4242
ES_TYPE: process.env.ES_TYPE || '_doc', // ES 6.x accepts only 1 Type per index and it's mandatory to define it
43-
ES_REFRESH: process.env.ES_REFRESH || 'true'
43+
ES_REFRESH: process.env.ES_REFRESH || 'true',
44+
TEMP_REINDEXING: process.env.TEMP_REINDEXING || true // if true, it won't delete the existing index when reindexing data
4445
},
4546

4647
// in bytes
@@ -58,6 +59,9 @@ module.exports = {
5859
? process.env.COPILOT_RESOURCE_ROLE_IDS.split(',') : ['10ba038e-48da-487b-96e8-8d3b99b6d18b'],
5960
SUBMITTER_ROLE_ID: process.env.SUBMITTER_ROLE_ID || '732339e7-8e30-49d7-9198-cccf9451e221',
6061

62+
MANAGER_ROLE_ID: process.env.MANAGER_ROLE_ID || '0e9c6879-39e4-4eb6-b8df-92407890faf1',
63+
OBSERVER_ROLE_ID: process.env.OBSERVER_ROLE_ID || '2a4dc376-a31c-4d00-b173-13934d89e286',
64+
6165
// health check timeout in milliseconds
6266
HEALTH_CHECK_TIMEOUT: process.env.HEALTH_CHECK_TIMEOUT || 3000,
6367

src/common/helper.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,25 @@ async function getChallengeResources (challengeId) {
410410
return result
411411
}
412412

413+
/**
414+
* Create challenge resources
415+
* @param {String} challengeId the challenge id
416+
* @param {String} memberHandle the user's member handle
417+
* @param {String} roleId the resource role ID to assign
418+
*/
419+
async function createResource (challengeId, memberHandle, roleId) {
420+
const token = await getM2MToken()
421+
422+
const userObj = {
423+
challengeId,
424+
memberHandle,
425+
roleId
426+
}
427+
const url = `${config.RESOURCES_API_URL}`
428+
const res = await axios.post(url, userObj, { headers: { Authorization: `Bearer ${token}` } })
429+
return res || false
430+
}
431+
413432
/**
414433
* Get resource roles
415434
* @returns {Promise<Array>} the challenge resources
@@ -427,7 +446,7 @@ async function getResourceRoles () {
427446
*/
428447
async function userHasFullAccess (challengeId, userId) {
429448
const resourceRoles = await getResourceRoles()
430-
const rolesWithFullAccess = _.map(_.filter(resourceRoles, r => r.fullAccess), 'id')
449+
const rolesWithFullAccess = _.map(_.filter(resourceRoles, r => r.fullWriteAccess), 'id')
431450
const challengeResources = await getChallengeResources(challengeId)
432451
return _.filter(challengeResources, r => _.toString(r.memberId) === _.toString(userId) && _.includes(rolesWithFullAccess, r.roleId)).length > 0
433452
}
@@ -763,6 +782,7 @@ module.exports = {
763782
downloadFromS3,
764783
deleteFromS3,
765784
getChallengeResources,
785+
createResource,
766786
getUserGroups,
767787
ensureNoDuplicateOrNullElements,
768788
postBusEvent,

src/init-es.js

+35-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,41 @@ const initES = async () => {
3131
const body = { mappings: {} }
3232
body.mappings[config.get('ES.ES_TYPE')] = {
3333
properties: {
34-
id: { type: 'keyword' }
34+
id: { type: 'keyword' },
35+
name: {
36+
type: 'keyword',
37+
normalizer: 'custom_sort_normalizer'
38+
},
39+
prizeSets: {
40+
properties: {
41+
type: { type: 'text' },
42+
prizes: {
43+
properties: {
44+
type: { type: 'text' },
45+
value: { type: 'float' }
46+
}
47+
}
48+
}
49+
}
50+
},
51+
dynamic_templates: [{
52+
metadata: {
53+
path_match: 'metadata.*',
54+
mapping: {
55+
type: 'text'
56+
}
57+
}
58+
}]
59+
}
60+
body.settings = {
61+
analysis: {
62+
normalizer: {
63+
custom_sort_normalizer: {
64+
type: 'custom',
65+
char_filter: [],
66+
filter: ['lowercase', 'asciifolding']
67+
}
68+
}
3569
}
3670
}
3771

src/scripts/update-es-mappings.js

+141
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
const config = require('config')
2+
const logger = require('../common/logger')
3+
const helper = require('../common/helper')
4+
5+
const esClient = helper.getESClient()
6+
7+
function sleep (ms) {
8+
return new Promise((resolve) => {
9+
setTimeout(resolve, ms)
10+
})
11+
}
12+
13+
function createIndex (indexName) {
14+
const body = { mappings: {} }
15+
body.mappings[config.get('ES.ES_TYPE')] = {
16+
properties: {
17+
id: { type: 'keyword' },
18+
name: {
19+
type: 'keyword',
20+
normalizer: 'custom_sort_normalizer'
21+
},
22+
prizeSets: {
23+
properties: {
24+
type: { type: 'text' },
25+
prizes: {
26+
properties: {
27+
type: { type: 'text' },
28+
value: { type: 'float' }
29+
}
30+
}
31+
}
32+
}
33+
},
34+
dynamic_templates: [{
35+
metadata: {
36+
path_match: 'metadata.*',
37+
mapping: {
38+
type: 'text'
39+
}
40+
}
41+
}]
42+
}
43+
body.settings = {
44+
analysis: {
45+
normalizer: {
46+
custom_sort_normalizer: {
47+
type: 'custom',
48+
char_filter: [],
49+
filter: ['lowercase', 'asciifolding']
50+
}
51+
}
52+
}
53+
}
54+
55+
return esClient.indices.create({
56+
index: indexName,
57+
body
58+
})
59+
}
60+
61+
async function updateMappings () {
62+
const tempReindexing = config.get('ES.TEMP_REINDEXING')
63+
let indexName = config.get('ES.ES_INDEX')
64+
let backupIndex = 'challenge_tmp_dont_use_for_querying_backup'
65+
let newIndexName = 'challenge_tmp_dont_use_for_querying'
66+
67+
// if (tempReindexing) {
68+
// try {
69+
// logger.info(`Attemp to remove temporary index ${newIndexName}`)
70+
// await esClient.indices.delete({
71+
// index: newIndexName
72+
// })
73+
// await sleep(500)
74+
// } catch (e) {
75+
// logger.info(`Index ${newIndexName} does not exist`)
76+
// }
77+
// }
78+
79+
// await createIndex(backupIndex)
80+
// await sleep(500)
81+
// logger.info(`Reindexing from ${indexName} to ${backupIndex}`)
82+
// await esClient.reindex({
83+
// body: {
84+
// source: { index: indexName },
85+
// dest: { index: backupIndex }
86+
// },
87+
// waitForCompletion: true
88+
// })
89+
90+
// await createIndex(newIndexName)
91+
// await sleep(500)
92+
// logger.info(`Reindexing from ${indexName} to ${newIndexName}`)
93+
// await esClient.reindex({
94+
// body: {
95+
// source: { index: indexName },
96+
// dest: { index: newIndexName }
97+
// },
98+
// waitForCompletion: true
99+
// })
100+
101+
// if (tempReindexing) {
102+
// return
103+
// }
104+
105+
// logger.warn(`Deleting ${indexName}. If script crashes after this point data may be lost and a recreation of index will be required.`)
106+
107+
// await esClient.indices.delete({
108+
// index: indexName
109+
// })
110+
111+
// indexName = 'challenge' // overridding source so it's not deleted.
112+
113+
// logger.info(`Copying data back into ${indexName}`)
114+
115+
// // This should be replaced with cloneIndex after migration to 7.4+
116+
// await createIndex(indexName)
117+
// await sleep(500)
118+
// await esClient.reindex({
119+
// body: {
120+
// source: { index: 'challenge_tmp_dont_use_for_querying' },
121+
// dest: { index: 'challenge' }
122+
// },
123+
// waitForCompletion: true
124+
// })
125+
126+
// logger.info(`Removing ${newIndexName} index`)
127+
128+
// await esClient.indices.delete({
129+
// index: newIndexName
130+
// })
131+
}
132+
133+
updateMappings()
134+
.then(() => {
135+
logger.info('Done')
136+
process.exit()
137+
})
138+
.catch((err) => {
139+
logger.logFullError(err)
140+
process.exit(1)
141+
})

src/services/ChallengeService.js

+13-3
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ async function searchChallenges (currentUser, criteria) {
215215
})
216216
} else {
217217
if (criteria.name) {
218+
// boolQuery.push({ wildcard: { 'name': `*${criteria.name}*` } })
218219
boolQuery.push({ match_phrase_prefix: { 'name': criteria.name } })
219220
}
220221

@@ -874,9 +875,6 @@ async function createChallenge (currentUser, challenge, userToken) {
874875
ret.type = type.name
875876
}
876877

877-
// post bus event
878-
await helper.postBusEvent(constants.Topics.ChallengeCreated, ret)
879-
880878
// Create in ES
881879
await esClient.create({
882880
index: config.get('ES.ES_INDEX'),
@@ -885,6 +883,18 @@ async function createChallenge (currentUser, challenge, userToken) {
885883
id: ret.id,
886884
body: ret
887885
})
886+
887+
// if created by a user, add user as a manager
888+
if (currentUser.handle) {
889+
logger.debug(`Adding user as manager ${currentUser.handle}`)
890+
await helper.createResource(ret.id, ret.createdBy, config.MANAGER_ROLE_ID)
891+
} else {
892+
logger.debug(`Not adding manager ${currentUser.sub} ${JSON.stringify(currentUser)}`)
893+
}
894+
895+
// post bus event
896+
await helper.postBusEvent(constants.Topics.ChallengeCreated, ret)
897+
888898
return ret
889899
}
890900

0 commit comments

Comments
 (0)