Skip to content

Commit 1ac7225

Browse files
authored
Merge pull request #187 from topcoder-platform/issue-4380-v2
Issue 4380 : Fix challenge register/unregister
2 parents 4be3737 + e26398e commit 1ac7225

File tree

3 files changed

+50
-28
lines changed

3 files changed

+50
-28
lines changed

__tests__/__snapshots__/index.js.snap

+1
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ Object {
291291
"getApiV4": [Function],
292292
"getApiV5": [Function],
293293
"getTcM2mToken": [Function],
294+
"proxyApi": [Function],
294295
},
295296
"billing": Object {
296297
"default": [Function],

src/services/api.js

+18
Original file line numberDiff line numberDiff line change
@@ -290,3 +290,21 @@ export async function getTcM2mToken() {
290290
const token = await m2m.getMachineToken(TC_M2M.CLIENT_ID, TC_M2M.CLIENT_SECRET);
291291
return token;
292292
}
293+
294+
/**
295+
* Call API via proxy
296+
*
297+
* @param {String} url to API endpoint
298+
*/
299+
export async function proxyApi(endpoint) {
300+
let domain = '';
301+
if (isomorphy.isServerSide()) {
302+
domain = `http://${config.ENV.HOST || 'localhost'}:${config.ENV.PORT || 3000}`;
303+
}
304+
const url = `${domain}/community-app-assets/api${endpoint}`;
305+
let res = await fetch(url);
306+
if (!res.ok) throw new Error(res.statusText);
307+
res = (await res.json());
308+
if (res.message) throw new Error(res.message);
309+
return res;
310+
}

src/services/challenges.js

+31-28
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { decodeToken } from 'tc-accounts';
1111
import logger from '../utils/logger';
1212
import { setErrorIcon, ERROR_ICON_TYPES } from '../utils/errors';
1313
import { COMPETITION_TRACKS, getApiResponsePayload } from '../utils/tc';
14-
import { getApi } from './api';
14+
import { getApi, proxyApi } from './api';
1515
import { getService as getMembersService } from './members';
1616

1717
export const ORDER_BY = {
@@ -200,6 +200,7 @@ class ChallengesService {
200200
apiV3: getApi('V3', tokenV3),
201201
getChallenges,
202202
getMemberChallenges,
203+
proxyApi,
203204
tokenV2,
204205
tokenV3,
205206
memberService: getMembersService(),
@@ -325,27 +326,32 @@ class ChallengesService {
325326
* @return {Promise} Resolves to the challenge object.
326327
*/
327328
async getChallengeDetails(challengeId) {
329+
let challenge = {};
328330
let isLegacyChallenge = false;
329-
const filters = {};
330331
// condition based on ROUTE used for Review Opportunities, change if needed
331-
if (challengeId.length >= 5 && challengeId.length <= 8) {
332+
if (/^[\d]{5,8}$/.test(challengeId)) {
332333
isLegacyChallenge = true;
333-
filters.legacyId = challengeId;
334+
challenge = await this.private.getChallenges('/challenges/', { legacyId: challengeId })
335+
.then(res => res.challenges[0]);
334336
} else {
335-
filters.id = challengeId;
337+
challenge = await this.private.getChallenges(`/challenges/${challengeId}`)
338+
.then(res => res.challenges);
336339
}
337-
const challengeFiltered = await this.private.getChallenges('/challenges/', filters)
338-
.then(res => res.challenges[0]);
339-
340-
if (challengeFiltered) {
341-
challengeFiltered.isLegacyChallenge = isLegacyChallenge;
342-
challengeFiltered.events = _.map(challengeFiltered.events, e => ({
343-
eventName: e.key,
344-
eventId: e.id,
345-
description: e.name,
346-
}));
347-
}
348-
return challengeFiltered;
340+
341+
const registrants = await this.getChallengeRegistrants(challenge.id);
342+
challenge.registrants = registrants;
343+
344+
challenge.isLegacyChallenge = isLegacyChallenge;
345+
346+
challenge.events = _.map(challenge.events, e => ({
347+
eventName: e.key,
348+
eventId: e.id,
349+
description: e.name,
350+
}));
351+
352+
challenge.fetchedWithAuth = Boolean(this.private.apiV5.private.token);
353+
354+
return challenge;
349355
}
350356

351357
/**
@@ -354,8 +360,7 @@ class ChallengesService {
354360
* @return {Promise} Resolves to the challenge registrants array.
355361
*/
356362
async getChallengeRegistrants(challengeId) {
357-
const registrants = await this.private.apiV5.get(`/resources/challengeId=${challengeId}`)
358-
.then(checkError).then(res => res);
363+
const registrants = await this.private.proxyApi(`/challenges/${challengeId}/registrants`);
359364
return registrants || [];
360365
}
361366

@@ -511,19 +516,17 @@ class ChallengesService {
511516
* @param {String} roleName
512517
* @return {Promise}
513518
*/
514-
async getResourceRoleId(roleName) {
519+
async getRoleId(roleName) {
515520
const params = {
516521
name: roleName,
517-
isActive: true,
518522
};
519-
const roles = await this.private.apiV5.get(`/resource-roles?${qs.stringify(params)}`)
520-
.then(checkErrorV5).then(res => res);
523+
const roles = await this.private.proxyApi(`/challenges/roleId?${qs.stringify(params)}`);
521524

522-
if (_.isEmpty(roles.result)) {
525+
if (_.isEmpty(roles)) {
523526
throw new Error('Resource Role not found!');
524527
}
525528

526-
return roles.result[0].id;
529+
return roles[0].id;
527530
}
528531

529532
/**
@@ -533,7 +536,7 @@ class ChallengesService {
533536
*/
534537
async register(challengeId) {
535538
const user = decodeToken(this.private.tokenV3);
536-
const roleId = await this.getResourceRoleId('Submitter');
539+
const roleId = await this.getRoleId('Submitter');
537540
const params = {
538541
challengeId,
539542
memberHandle: user.handle,
@@ -551,13 +554,13 @@ class ChallengesService {
551554
*/
552555
async unregister(challengeId) {
553556
const user = decodeToken(this.private.tokenV3);
554-
const roleId = await this.getResourceRoleId('Submitter');
557+
const roleId = await this.getRoleId('Submitter');
555558
const params = {
556559
challengeId,
557560
memberHandle: user.handle,
558561
roleId,
559562
};
560-
const res = await this.private.apiV5.delete('/resources', params);
563+
const res = await this.private.apiV5.delete('/resources', JSON.stringify(params));
561564
if (!res.ok) throw new Error(res.statusText);
562565
return res.json();
563566
}

0 commit comments

Comments
 (0)