Skip to content

Commit 56654ee

Browse files
committed
Merge branch 'dev' into refactor/domain-challenge
2 parents 9105bdf + 22be7b8 commit 56654ee

File tree

2 files changed

+94
-10
lines changed

2 files changed

+94
-10
lines changed

src/common/helper.js

+31-6
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,33 @@ async function listChallengesByMember(memberId) {
915915
return allIds;
916916
}
917917

918+
/**
919+
* Lists resources that given member has in the given challenge.
920+
* @param {Number} memberId the member id
921+
* @param {String} id the challenge id
922+
* @returns {Promise<Array>} an array of resources.
923+
*/
924+
async function listResourcesByMemberAndChallenge(memberId, challengeId) {
925+
const token = await getM2MToken();
926+
let response = {};
927+
try {
928+
response = await axios.get(config.RESOURCES_API_URL, {
929+
headers: { Authorization: `Bearer ${token}` },
930+
params: {
931+
memberId,
932+
challengeId,
933+
},
934+
});
935+
} catch (e) {
936+
logger.debug(
937+
`Failed to get resources on challenge ${challengeId} that memberId ${memberId} has`,
938+
e
939+
);
940+
}
941+
const result = response.data || [];
942+
return result;
943+
}
944+
918945
/**
919946
* Check if ES refresh method is valid.
920947
*
@@ -1041,20 +1068,17 @@ async function ensureAccessibleByGroupsAccess(currentUser, challenge) {
10411068
* @param {Object} challenge the challenge to check
10421069
*/
10431070
async function _ensureAccessibleForTaskChallenge(currentUser, challenge) {
1044-
let challengeResourceIds;
1071+
let memberResources;
10451072
// Check if challenge is task and apply security rules
10461073
if (_.get(challenge, "task.isTask", false) && _.get(challenge, "task.isAssigned", false)) {
10471074
if (currentUser) {
10481075
if (!currentUser.isMachine) {
1049-
const challengeResources = await getChallengeResources(challenge.id);
1050-
challengeResourceIds = _.map(challengeResources, (r) => _.toString(r.memberId));
1076+
memberResources = await listResourcesByMemberAndChallenge(currentUser.userId, challenge.id);
10511077
}
10521078
}
10531079
const canAccesChallenge = _.isUndefined(currentUser)
10541080
? false
1055-
: currentUser.isMachine ||
1056-
hasAdminRole(currentUser) ||
1057-
_.includes(challengeResourceIds || [], _.toString(currentUser.userId));
1081+
: currentUser.isMachine || hasAdminRole(currentUser) || !_.isEmpty(memberResources);
10581082
if (!canAccesChallenge) {
10591083
throw new errors.ForbiddenError(`You don't have access to view this challenge`);
10601084
}
@@ -1295,6 +1319,7 @@ module.exports = {
12951319
getESClient,
12961320
calculateChallengeEndDate,
12971321
listChallengesByMember,
1322+
listResourcesByMemberAndChallenge,
12981323
validateESRefreshMethod,
12991324
getProjectDefaultTerms,
13001325
validateChallengeTerms,

src/services/ChallengeService.js

+63-4
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,52 @@ async function ensureAcessibilityToModifiedGroups(currentUser, data, challenge)
202202
}
203203
}
204204

205+
/**
206+
* Search challenges by legacyId
207+
* @param {Object} currentUser the user who perform operation
208+
* @param {Number} legacyId the legacyId
209+
* @param {Number} page the page
210+
* @param {Number} perPage the perPage
211+
* @returns {Array} the search result
212+
*/
213+
async function searchByLegacyId(currentUser, legacyId, page, perPage) {
214+
const esQuery = {
215+
index: config.get("ES.ES_INDEX"),
216+
type: config.get("ES.ES_TYPE"),
217+
size: perPage,
218+
from: (page - 1) * perPage,
219+
body: {
220+
query: {
221+
term: {
222+
legacyId,
223+
},
224+
},
225+
},
226+
};
227+
228+
logger.debug(`es Query ${JSON.stringify(esQuery)}`);
229+
let docs;
230+
try {
231+
docs = await esClient.search(esQuery);
232+
} catch (e) {
233+
logger.error(`Query Error from ES ${JSON.stringify(e)}`);
234+
docs = {
235+
hits: {
236+
hits: [],
237+
},
238+
};
239+
}
240+
const ids = _.map(docs.hits.hits, (item) => item._source.id);
241+
const result = [];
242+
for (const id of ids) {
243+
try {
244+
const challenge = await getChallenge(currentUser, id);
245+
result.push(challenge);
246+
} catch (e) {}
247+
}
248+
return result;
249+
}
250+
205251
/**
206252
* Search challenges
207253
* @param {Object} currentUser the user who perform operation
@@ -213,6 +259,10 @@ async function searchChallenges(currentUser, criteria) {
213259

214260
const page = criteria.page || 1;
215261
const perPage = criteria.perPage || 20;
262+
if (!_.isUndefined(criteria.legacyId)) {
263+
const result = await searchByLegacyId(currentUser, criteria.legacyId, page, perPage);
264+
return { total: result.length, page, perPage, result };
265+
}
216266
const boolQuery = [];
217267
let sortByScore = false;
218268
const matchPhraseKeys = [
@@ -1387,13 +1437,22 @@ async function getChallenge(currentUser, id, checkIfExists) {
13871437
// delete challenge.typeId
13881438

13891439
// Remove privateDescription for unregistered users
1390-
let memberChallengeIds;
13911440
if (currentUser) {
1392-
if (!currentUser.isMachine && !hasAdminRole(currentUser)) {
1441+
if (!currentUser.isMachine && !helper.hasAdminRole(currentUser)) {
13931442
_.unset(challenge, "billing");
1394-
memberChallengeIds = await helper.listChallengesByMember(currentUser.userId);
1395-
if (!_.includes(memberChallengeIds, challenge.id)) {
1443+
if (_.isEmpty(challenge.privateDescription)) {
13961444
_.unset(challenge, "privateDescription");
1445+
} else if (
1446+
!_.get(challenge, "task.isTask", false) ||
1447+
!_.get(challenge, "task.isAssigned", false)
1448+
) {
1449+
const memberResources = await helper.listResourcesByMemberAndChallenge(
1450+
currentUser.userId,
1451+
challenge.id
1452+
);
1453+
if (_.isEmpty(memberResources)) {
1454+
_.unset(challenge, "privateDescription");
1455+
}
13971456
}
13981457
}
13991458
} else {

0 commit comments

Comments
 (0)