diff --git a/api-server/common/models/challenge.js b/api-server/common/models/challenge.js index 74bbedce18..526e291130 100644 --- a/api-server/common/models/challenge.js +++ b/api-server/common/models/challenge.js @@ -1,12 +1,52 @@ import { Observable } from 'rx'; +import { isEmpty } from 'lodash'; export default function(Challenge) { + let challengeIdToNameMap; + Challenge.on('dataSourceAttached', () => { - Challenge.findOne$ = - Observable.fromNodeCallback(Challenge.findOne, Challenge); - Challenge.findById$ = - Observable.fromNodeCallback(Challenge.findById, Challenge); - Challenge.find$ = - Observable.fromNodeCallback(Challenge.find, Challenge); + Challenge.findOne$ = Observable.fromNodeCallback( + Challenge.findOne, + Challenge + ); + Challenge.findById$ = Observable.fromNodeCallback( + Challenge.findById, + Challenge + ); + Challenge.find$ = Observable.fromNodeCallback(Challenge.find, Challenge); + + Challenge.find({ isPrivate: false }, (err, challenges) => { + if (err) { + throw Error(err); + } + challengeIdToNameMap = challenges.reduce((map, challenge) => { + const { id, title } = challenge; + map[id] = title; + return map; + }, {}); + }); + + function getIdToNameMap(cb) { + if (isEmpty(challengeIdToNameMap)) { + // We are waiting for the find query to resolve + return setTimeout(() => getIdToNameMap(cb), 50); + } + return cb(null, challengeIdToNameMap); + } + Challenge.getIdToNameMap = getIdToNameMap; + }); + + Challenge.remoteMethod('getIdToNameMap', { + returns: [ + { + arg: 'user', + type: 'object', + root: true + } + ], + http: { + path: '/get-id-to-name', + verb: 'GET' + } }); } diff --git a/api-server/common/models/challenge.json b/api-server/common/models/challenge.json index a04e661c99..8ff77e8f8b 100644 --- a/api-server/common/models/challenge.json +++ b/api-server/common/models/challenge.json @@ -133,6 +133,13 @@ "principalType": "ROLE", "principalId": "$everyone", "permission": "ALLOW" + }, + { + "accessType": "EXECUTE", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW", + "property": "getIdToNameMap" } ], "methods": {}