From c19bc09ba7f87359a672692339fc3a530d0f506a Mon Sep 17 00:00:00 2001 From: "Luiz R. Rodrigues" Date: Wed, 10 Jun 2020 04:45:33 -0300 Subject: [PATCH 1/5] Added proxyApi --- src/services/api.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/services/api.js b/src/services/api.js index 4530a4a3..fffbc7c9 100644 --- a/src/services/api.js +++ b/src/services/api.js @@ -290,3 +290,21 @@ export async function getTcM2mToken() { const token = await m2m.getMachineToken(TC_M2M.CLIENT_ID, TC_M2M.CLIENT_SECRET); return token; } + +/** + * Call API via proxy + * + * @param {String} url to API endpoint + */ +export async function proxyApi(endpoint) { + let domain = ''; + if (isomorphy.isServerSide()) { + domain = `http://${config.ENV.HOST || 'localhost'}:${config.ENV.PORT || 3000}`; + } + const url = `${domain}/community-app-assets/api${endpoint}`; + let res = await fetch(url); + if (!res.ok) throw new Error(res.statusText); + res = (await res.json()); + if (res.message) throw new Error(res.message); + return res; +} From d25ed67276d1ab198eb90d5a534fe76d2dad88f1 Mon Sep 17 00:00:00 2001 From: "Luiz R. Rodrigues" Date: Wed, 10 Jun 2020 04:48:03 -0300 Subject: [PATCH 2/5] Updated getChallengeDetails to get registrants Updated getChallengeRegistrants to use proxyAPi --- src/services/challenges.js | 43 +++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/services/challenges.js b/src/services/challenges.js index 10f0ded0..8a0a3728 100644 --- a/src/services/challenges.js +++ b/src/services/challenges.js @@ -11,7 +11,7 @@ import { decodeToken } from 'tc-accounts'; import logger from '../utils/logger'; import { setErrorIcon, ERROR_ICON_TYPES } from '../utils/errors'; import { COMPETITION_TRACKS, getApiResponsePayload } from '../utils/tc'; -import { getApi } from './api'; +import { getApi, proxyApi } from './api'; import { getService as getMembersService } from './members'; export const ORDER_BY = { @@ -200,6 +200,7 @@ class ChallengesService { apiV3: getApi('V3', tokenV3), getChallenges, getMemberChallenges, + proxyApi, tokenV2, tokenV3, memberService: getMembersService(), @@ -325,27 +326,32 @@ class ChallengesService { * @return {Promise} Resolves to the challenge object. */ async getChallengeDetails(challengeId) { + let challenge = {}; let isLegacyChallenge = false; - const filters = {}; // condition based on ROUTE used for Review Opportunities, change if needed - if (challengeId.length >= 5 && challengeId.length <= 8) { + if (/^[\d]{5,8}$/.test(challengeId)) { isLegacyChallenge = true; - filters.legacyId = challengeId; + challenge = await this.private.getChallenges('/challenges/', { legacyId: challengeId }) + .then(res => res.challenges[0]); } else { - filters.id = challengeId; + challenge = await this.private.getChallenges(`/challenges/${challengeId}`) + .then(res => res.challenges); } - const challengeFiltered = await this.private.getChallenges('/challenges/', filters) - .then(res => res.challenges[0]); - - if (challengeFiltered) { - challengeFiltered.isLegacyChallenge = isLegacyChallenge; - challengeFiltered.events = _.map(challengeFiltered.events, e => ({ - eventName: e.key, - eventId: e.id, - description: e.name, - })); - } - return challengeFiltered; + + const registrants = await this.getChallengeRegistrants(challenge.id); + challenge.registrants = registrants; + + challenge.isLegacyChallenge = isLegacyChallenge; + + challenge.events = _.map(challenge.events, e => ({ + eventName: e.key, + eventId: e.id, + description: e.name, + })); + + challenge.fetchedWithAuth = Boolean(this.private.apiV5.private.token); + + return challenge; } /** @@ -354,8 +360,7 @@ class ChallengesService { * @return {Promise} Resolves to the challenge registrants array. */ async getChallengeRegistrants(challengeId) { - const registrants = await this.private.apiV5.get(`/resources/challengeId=${challengeId}`) - .then(checkError).then(res => res); + const registrants = await this.private.proxyApi(`/challenges/${challengeId}/registrants`); return registrants || []; } From 55352893ced499d6a43b7f328bd116c76c22af3e Mon Sep 17 00:00:00 2001 From: "Luiz R. Rodrigues" Date: Wed, 10 Jun 2020 04:48:46 -0300 Subject: [PATCH 3/5] Update getRoleId to use proxyApi --- src/services/challenges.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/services/challenges.js b/src/services/challenges.js index 8a0a3728..78d98d2e 100644 --- a/src/services/challenges.js +++ b/src/services/challenges.js @@ -523,19 +523,17 @@ class ChallengesService { * @param {String} roleName * @return {Promise} */ - async getResourceRoleId(roleName) { + async getRoleId(roleName) { const params = { name: roleName, - isActive: true, }; - const roles = await this.private.apiV5.get(`/resource-roles?${qs.stringify(params)}`) - .then(checkErrorV5).then(res => res); + const roles = await this.private.proxyApi(`/challenges/roleId?${qs.stringify(params)}`); - if (_.isEmpty(roles.result)) { + if (_.isEmpty(roles)) { throw new Error('Resource Role not found!'); } - return roles.result[0].id; + return roles[0].id; } /** @@ -545,7 +543,7 @@ class ChallengesService { */ async register(challengeId) { const user = decodeToken(this.private.tokenV3); - const roleId = await this.getResourceRoleId('Submitter'); + const roleId = await this.getRoleId('Submitter'); const params = { challengeId, memberHandle: user.handle, @@ -563,7 +561,7 @@ class ChallengesService { */ async unregister(challengeId) { const user = decodeToken(this.private.tokenV3); - const roleId = await this.getResourceRoleId('Submitter'); + const roleId = await this.getRoleId('Submitter'); const params = { challengeId, memberHandle: user.handle, From cc436141c81494a478068daf99088054060e0054 Mon Sep 17 00:00:00 2001 From: "Luiz R. Rodrigues" Date: Wed, 10 Jun 2020 04:49:15 -0300 Subject: [PATCH 4/5] Fix challenge unregister() --- src/services/challenges.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/challenges.js b/src/services/challenges.js index 78d98d2e..f16a8a33 100644 --- a/src/services/challenges.js +++ b/src/services/challenges.js @@ -567,7 +567,7 @@ class ChallengesService { memberHandle: user.handle, roleId, }; - const res = await this.private.apiV5.delete('/resources', params); + const res = await this.private.apiV5.delete('/resources', JSON.stringify(params)); if (!res.ok) throw new Error(res.statusText); return res.json(); } From e26398ecdc6b42a21e2681c524afafac5ff36395 Mon Sep 17 00:00:00 2001 From: "Luiz R. Rodrigues" Date: Wed, 10 Jun 2020 04:49:23 -0300 Subject: [PATCH 5/5] Updated tests --- __tests__/__snapshots__/index.js.snap | 1 + 1 file changed, 1 insertion(+) diff --git a/__tests__/__snapshots__/index.js.snap b/__tests__/__snapshots__/index.js.snap index 7bc989b4..f696ddae 100644 --- a/__tests__/__snapshots__/index.js.snap +++ b/__tests__/__snapshots__/index.js.snap @@ -291,6 +291,7 @@ Object { "getApiV4": [Function], "getApiV5": [Function], "getTcM2mToken": [Function], + "proxyApi": [Function], }, "billing": Object { "default": [Function],