Skip to content

Commit a49c6fd

Browse files
authored
Merge pull request #563 from topcoder-platform/dev
Dev
2 parents 4b4b139 + 22be7b8 commit a49c6fd

File tree

2 files changed

+84
-7
lines changed

2 files changed

+84
-7
lines changed

Diff for: src/common/helper.js

+28-4
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,30 @@ async function listChallengesByMember (memberId) {
914914
return allIds
915915
}
916916

917+
/**
918+
* Lists resources that given member has in the given challenge.
919+
* @param {Number} memberId the member id
920+
* @param {String} id the challenge id
921+
* @returns {Promise<Array>} an array of resources.
922+
*/
923+
async function listResourcesByMemberAndChallenge (memberId, challengeId) {
924+
const token = await getM2MToken()
925+
let response = {}
926+
try {
927+
response = await axios.get(config.RESOURCES_API_URL, {
928+
headers: { Authorization: `Bearer ${token}` },
929+
params: {
930+
memberId,
931+
challengeId
932+
}
933+
})
934+
} catch (e) {
935+
logger.debug(`Failed to get resources on challenge ${challengeId} that memberId ${memberId} has`, e)
936+
}
937+
const result = response.data || []
938+
return result
939+
}
940+
917941
/**
918942
* Check if ES refresh method is valid.
919943
*
@@ -1056,16 +1080,15 @@ async function ensureAccessibleByGroupsAccess (currentUser, challenge) {
10561080
* @param {Object} challenge the challenge to check
10571081
*/
10581082
async function _ensureAccessibleForTaskChallenge (currentUser, challenge) {
1059-
let challengeResourceIds
1083+
let memberResources
10601084
// Check if challenge is task and apply security rules
10611085
if (_.get(challenge, 'task.isTask', false) && _.get(challenge, 'task.isAssigned', false)) {
10621086
if (currentUser) {
10631087
if (!currentUser.isMachine) {
1064-
const challengeResources = await getChallengeResources(challenge.id)
1065-
challengeResourceIds = _.map(challengeResources, r => _.toString(r.memberId))
1088+
memberResources = await listResourcesByMemberAndChallenge(currentUser.userId, challenge.id)
10661089
}
10671090
}
1068-
const canAccesChallenge = _.isUndefined(currentUser) ? false : currentUser.isMachine || hasAdminRole(currentUser) || _.includes((challengeResourceIds || []), _.toString(currentUser.userId))
1091+
const canAccesChallenge = _.isUndefined(currentUser) ? false : currentUser.isMachine || hasAdminRole(currentUser) || !_.isEmpty(memberResources)
10691092
if (!canAccesChallenge) {
10701093
throw new errors.ForbiddenError(`You don't have access to view this challenge`)
10711094
}
@@ -1287,6 +1310,7 @@ module.exports = {
12871310
ensureProjectExist,
12881311
calculateChallengeEndDate,
12891312
listChallengesByMember,
1313+
listResourcesByMemberAndChallenge,
12901314
validateESRefreshMethod,
12911315
getProjectDefaultTerms,
12921316
validateChallengeTerms,

Diff for: src/services/ChallengeService.js

+56-3
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,52 @@ async function ensureAcessibilityToModifiedGroups (currentUser, data, challenge)
118118
}
119119
}
120120

121+
/**
122+
* Search challenges by legacyId
123+
* @param {Object} currentUser the user who perform operation
124+
* @param {Number} legacyId the legacyId
125+
* @param {Number} page the page
126+
* @param {Number} perPage the perPage
127+
* @returns {Array} the search result
128+
*/
129+
async function searchByLegacyId (currentUser, legacyId, page, perPage) {
130+
const esQuery = {
131+
index: config.get('ES.ES_INDEX'),
132+
type: config.get('ES.ES_TYPE'),
133+
size: perPage,
134+
from: (page - 1) * perPage,
135+
body: {
136+
query: {
137+
term: {
138+
legacyId
139+
}
140+
}
141+
}
142+
}
143+
144+
logger.debug(`es Query ${JSON.stringify(esQuery)}`)
145+
let docs
146+
try {
147+
docs = await esClient.search(esQuery)
148+
} catch (e) {
149+
logger.error(`Query Error from ES ${JSON.stringify(e)}`)
150+
docs = {
151+
hits: {
152+
hits: []
153+
}
154+
}
155+
}
156+
const ids = _.map(docs.hits.hits, item => item._source.id)
157+
const result = []
158+
for (const id of ids) {
159+
try {
160+
const challenge = await getChallenge(currentUser, id)
161+
result.push(challenge)
162+
} catch (e) {}
163+
}
164+
return result
165+
}
166+
121167
/**
122168
* Search challenges
123169
* @param {Object} currentUser the user who perform operation
@@ -129,6 +175,10 @@ async function searchChallenges (currentUser, criteria) {
129175

130176
const page = criteria.page || 1
131177
const perPage = criteria.perPage || 20
178+
if (!_.isUndefined(criteria.legacyId)) {
179+
const result = await searchByLegacyId(currentUser, criteria.legacyId, page, perPage)
180+
return { total: result.length, page, perPage, result }
181+
}
132182
const boolQuery = []
133183
let sortByScore = false
134184
const matchPhraseKeys = [
@@ -1175,13 +1225,16 @@ async function getChallenge (currentUser, id, checkIfExists) {
11751225
// delete challenge.typeId
11761226

11771227
// Remove privateDescription for unregistered users
1178-
let memberChallengeIds
11791228
if (currentUser) {
11801229
if (!currentUser.isMachine && !helper.hasAdminRole(currentUser)) {
11811230
_.unset(challenge, 'billing')
1182-
memberChallengeIds = await helper.listChallengesByMember(currentUser.userId)
1183-
if (!_.includes(memberChallengeIds, challenge.id)) {
1231+
if (_.isEmpty(challenge.privateDescription)) {
11841232
_.unset(challenge, 'privateDescription')
1233+
} else if (!_.get(challenge, 'task.isTask', false) || !_.get(challenge, 'task.isAssigned', false)) {
1234+
const memberResources = await helper.listResourcesByMemberAndChallenge(currentUser.userId, challenge.id)
1235+
if (_.isEmpty(memberResources)) {
1236+
_.unset(challenge, 'privateDescription')
1237+
}
11851238
}
11861239
}
11871240
} else {

0 commit comments

Comments
 (0)